question Appelscript : gérer ouverture/fermeture de liens

Wiks

Membre junior
22 Mai 2007
26
0
31
Bonjour,

J'ai quelques questions sur Applescript auxquelles je ne trouve pas de réponses:

- Comment dit-on de fermer la fenêtre (de safari en l'occurrence) mais la bonne fenêtre, celle qui a été ouverte par le processus par exemple et non celle que j'ouvre entre temps; car quand je fait close window 1 cela ferme celle qui est au premier plan, sans réfléchir à ce qui est effectivement au premier plan à ce moment la, vous comprenez?

- Comment ouvire un lien de façon à ce qu'il s'ouvre dans la même fenêtre qu'un lien précédant et non dans une nouvelle fenêtre.

- J'ai également besoin de savoir si l'on peux ouvrir une fenêtre en la dimensionnent comme on veut, la réduire, ou même l'ouvrir sans l'affiché mais réduite dans le dock.

si quelqu'un peux maider, merci :)
 

Wiks

Membre junior
22 Mai 2007
26
0
31
S'il vous plait, juste comment ou "sélectionne une fenêtre" pour la fermer si vous savez.
 

zacromatafalgar

Membre émérite
- Comment dit-on de fermer la fenêtre (de safari en l'occurrence) mais la bonne fenêtre, celle qui a été ouverte par le processus par exemple et non celle que j'ouvre entre temps; car quand je fait close window 1 cela ferme celle qui est au premier plan, sans réfléchir à ce qui est effectivement au premier plan à ce moment la, vous comprenez?
Tu peux utiliser le nom de la fenêtre à fermer plutôt que window 1, donc à l'ouverture de la fenêtre par le processus, tu fais un :
Bloc de code:
set theName to name of window
puis, au moment de la fermeture tu mets
Bloc de code:
close window theName

- Comment ouvire un lien de façon à ce qu'il s'ouvre dans la même fenêtre qu'un lien précédant et non dans une nouvelle fenêtre.
Bloc de code:
set URL of document 1 to "http://www.theAddress.com"

- J'ai également besoin de savoir si l'on peux ouvrir une fenêtre en la dimensionnent comme on veut, la réduire, ou même l'ouvrir sans l'affiché mais réduite dans le dock.
Oui c'est possible :
Bloc de code:
tell application "Safari"
	do JavaScript "self.moveTo(0,0);self.resizeTo(800,500)" in document 1
end tell
Pour ce qui est de la réduction dans le Dock, aucune idée…
;)
 

Wiks

Membre junior
22 Mai 2007
26
0
31
Merci :)

Sinon savez vous comment on fait pour chercher puis utiliser des liens d'une page web?
Automator a une tel fonction mais j'aimerais le faire en Applescript.

sie vous êtes toujours la, merci : )

Wiks
 

zacromatafalgar

Membre émérite
Il faut récupérer le code source de la page puis isoler les liens, liens qui ont la caractéristique de tous débuter par href="http://

Je t'ai fait un code avec quelques commentaires :

Bloc de code:
set linksList to {}

tell application "Safari"
	set theURL to URL of front document --récupération de l'url qui pourra nous servir pus tard si on veut les liens vers d'autres éléments du site
	set URLsource to source of front document --récupère le code source de la page
end tell

set AppleScript's text item delimiters to "href=\"http://" --on choisi un séparateur qui va nous permettre de repérer le début de chaque lien vers un autre site

set theItems to text items of URLsource
--À ce stade, les "liens", qui ne sont pas encore isolés correctement, débutent par www et se terminent juste avant le début du lien suivant. La prochaine boucle va permettre de localiser la véritable fin du lien 

repeat with anItem in theItems
	set AppleScript's text item delimiters to "\"" --pour trouver l'endroit où se termine le lien (guillemet)
	set linkOk to text item 1 of anItem
	if linkOk starts with "www" then
		set end of linksList to linkOk --on met les liens dans une liste
	end if
end repeat
set AppleScript's text item delimiters to "" --on remet le séparateur par défaut

tell application "Safari"
	repeat with aLink in linksList --boucle d'ouverture des liens dans un nouvel onglet
		my newTab()
		set the URL of document 1 to "http://" & aLink
	end repeat
end tell

on newTab() --fonction de création des onglets
	tell application "Safari" to activate
	tell application "System Events"
		tell process "Safari"
			click menu item "Nouvel onglet" of menu "Fichier" of menu bar 1
		end tell
	end tell
end newTab
;)
 

Wiks

Membre junior
22 Mai 2007
26
0
31
waw, merci. J'ai regarder un ce code. Je ne suis pas un pro du html mais je trouve un petit probleme dans ce code, comme s'il ne pouvait pas ouvir tout ce que je veux, par exemple dans le code source j'ai remarqué qu'il y a plein de liens après le "hrep..." qui ne commence pas par www donc ca ne les voi pas meme si on peu cliquer dessus sur les sites.

par exemple, sur :

http://trad.applescript.free.fr/applescript.html

ton code n'ouvre pas le lien AS4AS_Fr.pdf (la traduction francaise du guide applescript),
l'adresse de ce lien est : http://trad.applescript.free.fr/guides/AS4AS_Fr.pdf
pourtant dans le code source on a juste href="guides/AS4AS_Fr.pdf" et non pas l'addresse entiere.
Ton code ne le voi pas avec if linkOk starts with "www" donc c'est embetant.


Sinon pourquoi y a t il un antislache dans href=\"http:// ?

ligne : set AppleScript's text item delimiters to "href=\"http://"
 

zacromatafalgar

Membre émérite
waw, merci. J'ai regarder un ce code. Je ne suis pas un pro du html mais je trouve un petit probleme dans ce code, comme s'il ne pouvait pas ouvir tout ce que je veux, par exemple dans le code source j'ai remarqué qu'il y a plein de liens après le "hrep..." qui ne commence pas par www donc ca ne les voi pas meme si on peu cliquer dessus sur les sites.

par exemple, sur :

http://trad.applescript.free.fr/applescript.html

ton code n'ouvre pas le lien AS4AS_Fr.pdf (la traduction francaise du guide applescript),
l'adresse de ce lien est : http://trad.applescript.free.fr/guides/AS4AS_Fr.pdf
pourtant dans le code source on a juste href="guides/AS4AS_Fr.pdf" et non pas l'addresse entiere.
Ton code ne le voi pas avec if linkOk starts with "www" donc c'est embetant.
C'est bien pour ce type de lien que l'on récupère l'adresse du site en 3ème ligne, mais ne sachant si tu voulais les prendre en compte, je les ai laissés de coté.

Bloc de code:
set theURL to URL of front document --récupération de l'url qui pourra nous servir pus tard si on veut les liens vers d'autres éléments du site
Sinon pourquoi y a t il un antislache dans href=\"http:// ?

ligne : set AppleScript's text item delimiters to "href=\"http://"
L'antislash échappe le caractère le suivant, dans ce cas un guillemet, s'il ne l'était pas il provoquerait une erreur à la compilation…
 

zacromatafalgar

Membre émérite
Le code ci-dessous te convient-il ?

Bloc de code:
set linksList to {}

tell application "Safari"
	set theURL to URL of front document --récupération de l'url qui pourra nous servir pus tard si on veut les liens vers d'autres éléments du site
	set URLsource to source of front document --récupère le code source de la page
end tell

set AppleScript's text item delimiters to "href=\""
set theItems to text items of URLsource

set AppleScript's text item delimiters to "/"
set partOk to (text items 1 thru -2 of theURL) as text
set AppleScript's text item delimiters to ""

repeat with anItem in theItems
	set AppleScript's text item delimiters to "\"" --pour trouver l'endroit où se termine le lien (guillemet)
	set linkOk to text item 1 of anItem
	if linkOk starts with "http://" then
		set end of linksList to linkOk --on met les liens dans une liste
	else if (linkOk does not end with "css") and (linkOk does not start with "<!") and (linkOk does not contain "mailto") then
		set end of linksList to (partOk & "/" & linkOk) as text
	end if
end repeat
set AppleScript's text item delimiters to "" --on remet le séparateur par défaut

tell application "Safari"
	repeat with aLink in linksList --boucle d'ouverture des liens dans un nouvel onglet
		my newTab()
		set the URL of document 1 to aLink
	end repeat
end tell

on newTab() --fonction de création des onglets
	tell application "Safari" to activate
	tell application "System Events"
		tell process "Safari"
			click menu item "Nouvel onglet" of menu "Fichier" of menu bar 1
		end tell
	end tell
end newTab
 

Wiks

Membre junior
22 Mai 2007
26
0
31
A oui c'est mieux comme ca :). Donc ce code ouvre tout les liens clicables sure une page c'est bien ca?

Maintenent reste à bien comprendre le script : )

Pourquoi donc les conditions if (linkOk does not end with "css") and (linkOk does not start with "<!") and (linkOk does not contain "mailto") ?

je ne comprend pas très bien comment on utilise le séparateur :rose: mais ca à l'air assez puissant; et puis les ligne du genre (text items 1 thru -2 of theURL) ou set linkOk to text item 1 of anItem.

Aussi remarque :
Cette fonction newTab() serait bien intéressante mais quand j'éxécute :
Erreur d'Applescript
Erreur dans System Events : NSReceiverEvaluationScriptError: 4, pourquoi ?:confused:

A part cela c'est super top cool, merci zacromatafalgar :)

pour tester le code j'ai donc remplacé ca par des simples open location.

Ma question aussi : peut on récupéré le code source d'une page sans l'ouvrire, car j'aimerais récupérer le code de plusieures dizaines de pages, et j'ai envie de devoir les ouvrir. Si on ai obliger, alors un moyen intéressant serait d'attendre la fin de l'ouverture de la page avant de copier le liens, un dilay ne serait pas assez précis; ben oui sinon il met rien dans

set URLsource to source of front document

en disant que URLsource n'est pas définit
 

zacromatafalgar

Membre émérite
A oui c'est mieux comme ca :). Donc ce code ouvre tout les liens clicables sure une page c'est bien ca?
Oui


Maintenent reste à bien comprendre le script : )

Pourquoi donc les conditions if (linkOk does not end with "css") and (linkOk does not start with "<!") and (linkOk does not contain "mailto") ?
Le premier pour ne pas ouvrir le fichier css si la page en a un d'indiquer dans les meta, le second pour ne pas considérer le premier bout de texte comme un lien (<! correspond au début du code source) et enfin le troisième qui permet de ne pas tenir compte des éventuels liens de contact qui ouvrent Mail, ce qui provoquerait une erreur en tentant de l'ouvrir avec le navigateur…


je ne comprend pas très bien comment on utilise le séparateur :rose: mais ca à l'air assez puissant; et puis les ligne du genre (text items 1 thru -2 of theURL) ou set linkOk to text item 1 of anItem.
Pour les séparateurs, je te renvoie vers cette page de iScript.fr, pour (text items 1 thru -2 of theURL), on utilise le slash comme séparateur et donc si on a http://www.leSite/index.html comme adresse du site, "text item 1" correspond au premier morceau soit "http:" jusqu'au morceau -2 (-1 est le dernier morceau, -2 l'avant dernier…). On supprime donc "index.html" pour le remplacer plus tard par les liens internes aux sites et on obtiendra bien des adresses complètes. Je ne sais pas si c'est bien clair, la pédagogie n'est pas mon fort…


Aussi remarque :
Cette fonction newTab() serait bien intéressante mais quand j'éxécute :
Erreur d'Applescript
Erreur dans System Events : NSReceiverEvaluationScriptError: 4, pourquoi ?:confused:
Coche la case "Activer l'accès pour les périphériques d'aide" des préférences système Accès universel et ceci ne sera plus qu'un souvenir…

Ma question aussi : peut on récupéré le code source d'une page sans l'ouvrire, car j'aimerais récupérer le code de plusieures dizaines de pages, et j'ai envie de devoir les ouvrir. Si on ai obliger, alors un moyen intéressant serait d'attendre la fin de l'ouverture de la page avant de copier le liens, un dilay ne serait pas assez précis; ben oui sinon il met rien dans

set URLsource to source of front document

en disant que URLsource n'est pas définit
Non je ne pense pas, en tout cas je ne sais pas faire.
Voici le code que j'utilise pour attendre le chargement de la page :
Bloc de code:
set theURL to "http://www.macg.co/"
set sourceOk to 0
open location theURL
tell application "Safari"
	make new document
	set the URL of the front document to theURL
	repeat until sourceOk = 1
		set theSource to source of front document as string
		if theSource contains "</html>" then set sourceOk to 1
	end repeat
end tell
 

Wiks

Membre junior
22 Mai 2007
26
0
31
merci zacromatafalgar, ton aide m'a été très précieuse est utile. Je suis par la suite tombé sur des liens qui était mis dans un code source comme
<a href=view.php?ad=188 target=_blank style="text-decoration:none; color: #787878;"</a>

Donc je me suis débrouillé pour trouver car en remplacent "href=\"" par "href="
et "\"" par un espace " " et ca marche :) par contre ca ne marche pas pour les autres liens plus normaux du coup, donc j'ai le code en double... avec une condition if le_code_source contains "href=view" pour choisir le bon code, c'est peut être pas la meilleures solution. Est-ce que je peut m'attendre à rencontrer encore d'autre configurations que
href="http://lesite/...lelien..."
href="lelien"
href=lelien
?

Le code ci-dessous te convient-il ?

Bloc de code:
set linksList to {}

tell application "Safari"
	set theURL to URL of front document --récupération de l'url qui pourra nous servir pus tard si on veut les liens vers d'autres éléments du site
	set URLsource to source of front document --récupère le code source de la page
end tell

set AppleScript's text item delimiters to "href=\""
set theItems to text items of URLsource

set AppleScript's text item delimiters to "/"
set partOk to (text items 1 thru -2 of theURL) as text
set AppleScript's text item delimiters to ""

repeat with anItem in theItems
	set AppleScript's text item delimiters to "\"" --pour trouver l'endroit où se termine le lien (guillemet)
	set linkOk to text item 1 of anItem
	if linkOk starts with "http://" then
		set end of linksList to linkOk --on met les liens dans une liste
	else if (linkOk does not end with "css") and (linkOk does not start with "<!") and (linkOk does not contain "mailto") then
		set end of linksList to (partOk & "/" & linkOk) as text
	end if
end repeat
set AppleScript's text item delimiters to "" --on remet le séparateur par défaut

tell application "Safari"
	repeat with aLink in linksList --boucle d'ouverture des liens dans un nouvel onglet
		my newTab()
		set the URL of document 1 to aLink
	end repeat
end tell

on newTab() --fonction de création des onglets
	tell application "Safari" to activate
	tell application "System Events"
		tell process "Safari"
			click menu item "Nouvel onglet" of menu "Fichier" of menu bar 1
		end tell
	end tell
end newTab
Aussi :
j'ai un problème avec :

set theName to name of window

il me fait une erreur Impossible d’obtenir name of window :nailbiting:

Et puis une question importante :
Une fois qu'on ai fait un beaux script Applescript, quel est le moyen le plus simple de faire fonctionner sur windows pour fait profiter les collegues? y'a t il moyen de "lire" ce code sous windows ou peut etre le retranscrire avec un langage comparable?

merci :zen:
 

zacromatafalgar

Membre émérite
merci zacromatafalgar, ton aide m'a été très précieuse est utile. Je suis par la suite tombé sur des liens qui était mis dans un code source comme
<a href=view.php?ad=188 target=_blank style="text-decoration:none; color: #787878;"</a>

Donc je me suis débrouillé pour trouver car en remplacent "href=\"" par "href="
et "\"" par un espace " " et ca marche :) par contre ca ne marche pas pour les autres liens plus normaux du coup, donc j'ai le code en double... avec une condition if le_code_source contains "href=view" pour choisir le bon code, c'est peut être pas la meilleures solution. Est-ce que je peut m'attendre à rencontrer encore d'autre configurations que
href="http://lesite/...lelien..."
href="lelien"
href=lelien
?
Je ne saurais te dire, désolé…


Aussi :
j'ai un problème avec :

set theName to name of window

il me fait une erreur Impossible d’obtenir name of window :nailbiting:
Essaie plutôt avec :
Bloc de code:
set theName to name of front window
Et puis une question importante :
Une fois qu'on ai fait un beaux script Applescript, quel est le moyen le plus simple de faire fonctionner sur windows pour fait profiter les collegues? y'a t il moyen de "lire" ce code sous windows ou peut etre le retranscrire avec un langage comparable?

merci :zen:
Il n'y a, à ma connaissance, aucun moyen de faire fonctionner un applescript sur windows…
 

BS0D

Membre d’élite
Club MacG
27 Juillet 2008
2 322
530
searchreplaceapp.com
salut à tous,

quelques questions sur safari.
déjà il est bon de signaler que je n'en suis pas du tout fan, car il manque d'options à mon gout. firefox par exemple, efface mon historique après fermeture automatiquement. firefox permet l'utilisation de foxyproxy et autres plugins qui sont très bien supportés.
tout ça manque un peu à safari, mais la V4 est très "prometteuse", donc je voudrais m'y mettre.

je me suis dit que je compléterais les options manquantes avec applescript, les actions automator étant peu nombreuses et bien inutiles à mon goût si je puis me permettre.
donc, questions concernant le scripting de safari:

-est il possible de faire en sorte qu'il soit dès l'ouverture en navigation privée (il n'y a meme pas de raccourci pour ça, c'est vraiment con).
-est il possible d'en vider le cache et l'historique à la fermeture?

le cas échéant, je vais me contenter de reprendre mon firefox et attendre la sortie de la prochaine version avec impatience...
 

tatouille

Vétéran
1 Juin 2004
5 174
494
Stanford CA
je viens juste de tester,
il y a une valeur dans le plist grep "private" com.apple.safari.plist dans textwrangler

Bloc de code:
defaults write com.apple.safari  WebKitPrivateBrowsingEnabled -bool yes
mais quand tu demarres Safari celui-ci ecrit cette valeur a no par default
et la change quand tu selectionnes le menu item

Bloc de code:
    <key>WebDatabaseDirectory</key>
    <string>~/Library/Safari/Databases</string>
    <key>WebIconDatabaseDirectoryDefaultsKey</key>
    <string>~/Library/Safari</string>
    <key>WebIconDatabaseImportDirectoryDefaultsKey</key>
cela peut te permettre d'effacer les fichiers, mais rien de tres pratique
dans le dictionaire

mais peut etre il existe de l'existant :) je suis pas un applescript man

mais bon tu pourrais ecrire ton webbrowser base sur le WebKit et l'appeler SafariX :D