Forum Clubic

Script autoit et batch clubic-get

Bonjour à tous,

Je viens de découvrir Autoit. Un logiciel assez simple d’accès pour un non développeur qui permet d’automatiser des tâches.
Je me suis donc lancé à faire un 'tit script style “gestionnaire de téléchargement linux” dont le contenu est fournit en spoiler

Pour ceux qui voudront tester il est prévu pour ie8 dans son mode de recherche de mot à l’intérieur des pages (la version 7 j’ai pas pu tester)
et il faut avoir wget.exe dans son system32

[spoiler]

#cs ----------------------------------------------------------------------------

 AutoIt Version: 3.3.0.0
 Author:         myName

 Script Function:
	Template AutoIt script.

#ce ----------------------------------------------------------------------------

; Script Start - Add your code below here
$bloop = 1
While $bloop = 1
$logiciel = InputBox("Téléchargement clubic", "Tapez le nom du logiciel à télécharger")
	If @error = 1 Then
		$bloop = 0
	Exit
	ElseIf $logiciel = "" then
		MsgBox(0, "Téléchargement Clubic", "Le nom du logiciel ne peut être vide")
	ElseIf @error = 0 Then
		$bloop = 0
		AutoItSetOption("WinTitleMatchMode", 2)
 		Run("c:\Program Files\Internet Explorer\IEXPLORE.EXE google.fr")
		WinWait("Internet Explorer", "Terminé", 15)
		Send("clubic telecharger "& $logiciel)
		send("{TAB 2}{ENTER}")
		WinActivate("Internet Explorer")
		WinWaitActive("Internet Explorer", "Terminé", 15)
		send("^f")
		WinWait("", "Rechercher :")
		send("Taille")
			If WinExists("", "Aucun résultat trouvé ou attente de la demande dépassée") then
				BlockInput(0)
				Send("{ESC}{ESC}")
				MsgBox(0,"Telechargement Clubic",& $logiciel " non trouvé")
				WinClose("Internet Explorer")
				Exit
			EndIf
		WinWaitActive("Internet Explorer")
		send("{ESC}{TAB}{ENTER}")
		WinWaitActive("Internet Explorer", "Terminé", 15)
		send("^f")
		WinWait("", "Rechercher :")
		send("Lancer")
				If WinExists("", "Aucun résultat trouvé ou attente de la demande dépassée") then
				BlockInput(0)
				Send("{ESC}{ESC}")
				MsgBox(0,"Telechargement Clubic",& $logiciel " non trouvé")
				WinClose("Internet Explorer")
				Exit
			EndIf
		WinWaitActive("Internet Explorer")
		send("{ESC}{APPSKEY}a")
		WinWait("null","",1)
		send("a")
		WinWait("null","",1)
		$url = StringRegExpReplace(""& ClipGet(), ".*@", "")
		WinClose("Internet Explorer")
		send("#r")
		WinWaitActive("Exécuter")
		send("wget "& $url)
		send("{ENTER}")
	EndIf	
WEnd

[/spoiler]

cependant ce script a un fonctionnement pour le moins aléatoire. Il fonctionne bien la plupart des fois et d’autres il “bug”
Par exemple des fois il va mal restituer l’url de download sur clubic et du coup wget à la fin du script n’arrive pas à télécharger le programme
ou alors il va parfois lancer les recherches de mots clés avant le temps prévu

Je n’y connais rien en progra et je ne sais pas si c’est lié à des défauts inhérents à autoit ou bien si c’est mon code qui est mal fichu, mal optimisé ou je ne sais quoi. Donc si l’un de vous veut voir ça à l’occasion et m’indiquer les défauts de mon code

PS: Pour lancer le script il faut au préalable installer autoit sur son PC. Je ne fournit pas l’exécutable de mon script pour éviter les suspicions

Merci d’avance
Edité le 22/06/2009 à 20:40

Je n’ai pas précisé le fonctionnement du prog. ça serait peut-être utile.
1: Il demande quel programme telecharger: On entre un nom de programme disponible dans la logitheque clubic. par exemple VNC
2: Il ouvre internet explorer sur la page google et lance la recherche du programme sur clubic (par exemple il lance la recherche “clubic telecharger vnc”) puis clique sur le bouton “j’ai de la chance” de google
3: Une fois la page de clubic ouverte sur la fiche du programme il cherche à ouvrir le lien de téléchargement en se basant sur un mot clé (à l’aide de l’outil de recherche du navigateur) et par navigation simulée au clavier
4: sur la parge de téléchargement il tente de la même manière de copier le lien de téléchargement
5: il lance wget à partir du menu démarrer>Exécuter avec le lien de téléchargement

Si j’utilise wget c’est que n’ai pas trouvé le moyen de lancer le téléchargement directement depuis le navigateur à cause de la popup qui doit être protégée concernant l’autorisation de télécharger un programme

encore moi :ane:
j’ai oublié de préciser ce script là fonctionne beaucoup mieux. je l’ai fait sous xp pour ie6
pas besoin de wget sous cet environnement

[spoiler]


#cs ----------------------------------------------------------------------------

 AutoIt Version: 3.3.0.0
 Author:         myName

 Script Function:
	Template AutoIt script.

#ce ----------------------------------------------------------------------------

; Script Start - Add your code below here
$bloop = 1
While $bloop = 1
$logiciel = InputBox("Téléchargement clubic", "Tapez le nom du logiciel à télécharger")
	If @error = 1 Then
		$bloop = 0
Exit
	ElseIf $logiciel = "" then
		MsgBox(0, "Téléchargement Clubic", "Le nom du logiciel ne peut être vide")
	ElseIf @error = 0 Then
		BlockInput(1)	
		$bloop = 0
		AutoItSetOption("WinTitleMatchMode", 2)
 		Run("c:\Program Files\Internet Explorer\IEXPLORE.EXE google.fr")
		WinWait("Google - Microsoft Internet Explorer", "Terminé")
		Send("clubic telecharger "& $logiciel)
		Send("{ENTER}")
		WinWaitActive("clubic telecharger", "Terminé")
		send("^f")
		WinWait("Rechercher")
		send("clubic.com/telecharger-fiche!v{ESC}")
		WinActivate("Rechercher")
			If WinExists("Rechercher") then
				BlockInput(0)
				Send("{ESC}")
				MsgBox(0,"Telechargement Clubic",& $logiciel " non trouvé ou délai d'attente de la demande dépassée")
				WinClose("Microsoft Internet Explorer")
				Exit
			EndIf
		WinWaitActive("clubic telecharger", "Terminé", 15)
		send("+{TAB}{ENTER}")
		WinWaitActive("Microsoft Internet Explorer", "Terminé", 15) 
		send("^f")
		WinWait("Rechercher")
		send("Taille!v{ESC}")
		WinActivate("Rechercher")
			If WinExists("Rechercher") then
				BlockInput(0)
				Send("{ESC}")
				MsgBox(0,"Telechargement Clubic",& $logiciel " non trouvé ou délai d'attente de la demande dépassée")
				WinClose("Microsoft Internet Explorer")
				Exit
			EndIf
		WinWaitActive("Microsoft Internet Explorer", "Terminé", 15)
		send("{TAB}{ENTER}")
		WinWaitActive("Microsoft Internet Explorer", "Terminé", 15)
		send("^f")
		WinWait("Rechercher")
		send("Lancer!v{ESC}")
		WinActivate("Rechercher")		
			If WinExists("Rechercher") then
				BlockInput(0)
				Send("{ESC}")
				MsgBox(0,"Telechargement Clubic",& $logiciel " non trouvé ou délai d'attente de la demande dépassée")
				WinClose("Microsoft Internet Explorer")
				Exit
			EndIf
		WinWaitActive("Microsoft Internet Explorer", "Terminé", 15)
		send("{TAB}{ENTER}")
		BlockInput(0)
		WinWaitActive("Téléchargement de fichier")
		send("!r")
		WinWaitActive("Enregistrer sous")
		send(""& $logiciel)
		send("{ENTER}")
		WinWaitClose("", "Enregistrement de")
		WinClose("Microsoft Internet Explorer")		
	EndIf
WEnd

[/spoiler]
Edité le 11/06/2009 à 02:39

petit up ^ ^)

aucune idée? aucun commentaire? quelqu’un a essayé?
Même sans essayer peut-être un conseil sur la manière dont le code est rédigé?

merci d’avance :slight_smile:

Pourquoi mets-tu un blockinput ? Si ya un prob quelconque tu te retrouves à devoir faire un ctrl+alt+suppr pour defreezer…
ensuite utilise crtl+F5 pour vérifier la syntaxe du script (là en l’occurence tes messages box sont mal formulés - MsgBox(0,“Telechargement Clubic”, $logiciel & " non trouvé ou délai d’attente de la demande dépassée" plutôt ;))

le blockinput je l’ai mis pour pas que si on bouge la souris ça perturbe le script
En effet pour identifier qu’une page s’est chargée complètement sous IE je fais un test sur la barre d’état pour voir si il affiche “terminé”. Or si le curseur est placé sur un lien il va affiché l’adresse du lien au lieu de “terminé”
Mais je reconnais que c’est pas terrible de bloquer la souris et le clavier pour ça. (d’ailleurs sous Vista je l’utilise pas car sinon faut le lancer en tant qu’admin)

J’avais pas vu la fonction de déboguage. Cependant je ne pense pas que pour le coup ça explique les bugs que je rencontre. Tu as testé toi? ça donnait quoi?

En tout les cas un grand merci pour ton aide :jap:
Edité le 18/06/2009 à 21:47

En corrigeant ton script de ses quelques erreurs, oui chez moi ça marche :stuck_out_tongue:
d’abord prends garde à bien reproduire le titre des fenêtres (sur ie7 c’est pas “Microsoft Internet Explorer” mais “Windows Internet Explorer”)
pour lancer la recherche tu dois ajouter un {enter} suivi de l’escape
et en fin de parcours, mieux vaut ajouter une instruction sur le le lien serveur puis lancer le dl sur le lien HTTP sinon tu vas avoir un lien ftp.
Et puis peaufiner le tout…:wink:

oui j’avais bien noté la différence entre ie6 et 8 concernant le nom affiché dans la barre de titre.

un espace après l’{enter} je vois pas pourquoi par contre?

pour éviter trop de manip hasardeuse sur le navigateur j’ai préféré prendre le lien ftp directement.

Cependant j’ai noté quelques autres erreurs que je ne voyais pas alors que j’avais le nez dessus. ça marche déjà beaucoup mieux pour le moment même si c’est pas encore parfait.

Merci bcp à toi :oui:

ayé j’ai rajouté quelques “temporisateurs” (du type WinWait(“null”,"",1) ) et ça à l’air de fonctionner au poil sous vista
[spoiler]


#cs ----------------------------------------------------------------------------

 AutoIt Version: 3.3.0.0
 Author: myName

 Script Function:
	Template AutoIt script.

#ce ----------------------------------------------------------------------------

; Script Start - Add your code below here
$bloop = 1
While $bloop = 1
$logiciel = InputBox("Téléchargement clubic", "Tapez le nom du logiciel à télécharger")
	If @error = 1 Then
		$bloop = 0
	Exit
	ElseIf $logiciel = "" then
		MsgBox(0, "Téléchargement Clubic", "Le nom du logiciel ne peut être vide")
	ElseIf @error = 0 Then
		$bloop = 0
		AutoItSetOption("WinTitleMatchMode", 2)
 		Run("c:\Program Files\Internet Explorer\IEXPLORE.EXE google.fr")
		WinWait("Internet Explorer", "Terminé", 15)
		Send("clubic telecharger "& $logiciel)
		WinWait("null","",1)
		send("{TAB}{TAB}{ENTER}")
		WinActivate("Internet Explorer")
		WinWaitActive("Internet Explorer", "Terminé", 15)
		send("^f")
		WinWait("", "Rechercher :")
		send("Taille")
		If WinExists("", "Aucun résultat trouvé") then
				Send("{ESC}{ESC}")
				MsgBox(0,"Telechargement Clubic", $logiciel &" non trouvé ou délai d'attente de la demande dépassée")
				WinClose("Internet Explorer")
				Exit
		EndIf
		WinWaitActive("Internet Explorer")
		send("{ESC}{TAB}{ENTER}")
		WinWait("null","",1)
		WinWaitActive("Internet Explorer", "Terminé", 15)
		send("^f")
		WinWait("", "Rechercher :")
		send("Lancer")
		If WinExists("", "Aucun résultat trouvé") then
				BlockInput(0)
				Send("{ESC}{ESC}")
				MsgBox(0,"Telechargement Clubic", $logiciel &" non trouvé ou délai d'attente de la demande dépassée")
				WinClose("Internet Explorer")
				Exit
		EndIf
		WinWaitActive("Internet Explorer")
		send("{ESC}{APPSKEY}a")
		WinWait("null","",1)
		send("a")
		WinWait("null","",1)
		$url = StringRegExpReplace(""& ClipGet(), ".*@", "")
		WinClose("Internet Explorer")
		send("#r")
		WinWaitActive("Exécuter")
		send("wget "& $url)
		send("{ENTER}")
	EndIf	
WEnd

[/spoiler]

ESCAPE pas espace :slight_smile: mais bon c’est pas grave étant donné que ça marche maintenant…
Sinon perso je m’y serais pris autrement : j’aurais plutôt récupéré dans la source html les liens au lieu de lancer des recherches sur les pages via la box. Tu peux le faire avec wget et ensuite parser le StdoutRead (avec une regex) pour récuperer les liens…c’est plus compliqué mais c’est plus fiable au final.
Edité le 19/06/2009 à 08:16

ah ok :ane:
de toute façon faut je vois à l’occasion au niveau des {ESC} et autres {TAB} si j’ai pas du nettoyage à faire.

Ah oui j’avais pas pensé à récupérer les pages avec wget et lire ensuite le code source. Ce serait sans doute plus fiable et surtout ça pourrait permettre de travailler en arrière plan. Mais pour le coup plus besoin d’autoit. un script wget couplé avec sed/awk et ça devrait pouvoir le faire. Bonne idée à priori.

:jap: merci encore

je viens de finir un petit batch pour tester tout en ligne de commande avec wget.exe et sed.exe
[spoiler]


@echo off

SETLOCAL ENABLEEXTENSIONS

REM 0<Nbre argument pour Nom du Programme<=3

set /a count=0
for %%a in (%*) do @set /a count+=1
if %count% EQU 0 (echo Indiquez le nom d'un programme. && echo par exemple: %0 windows media player && GOTO END)
if %count% GTR 3 (echo pas plus de 3 arguments. && echo par exemple: %0 windows media player && GOTO END)



REM On introduit les variables, en fonction de leur nombre, pour obtenir une url sous la forme  http://www.google.fr/search[...]nom+du+programme[...]

set alpha=%1
set beta=%2
set gamma=%3
if DEFINED beta (set beta=+%beta%)
IF DEFINED gama (set gamma=+%gamma%)
set PROG=%alpha%%beta%%gamma%



REM On telecharge le resultat de notre recherche sur google

wget -U="Mozilla/5.0" "http://www.google.fr/search?hl=fr&q=clubic+telecharger+%PROG%&btnG=Recherche+Google&meta=&aq=f&oq=" --output-document=%TEMP%\googlesearch.txt



REM On récupère l'adresse de la fiche clubic et on la telecharge

sed -n  s/\(.*\)\(http:\/\/www\.clubic\.com\/telecharger-fiche[[:digit:]]\+-\)\([[:alpha:]]\+-\)*\([[:alpha:]]\+\.html\)\(.*\)/\2\3\4/p "%TEMP%\googlesearch.txt"> %TEMP%\clubic.txt

wget -U="Mozilla/5.0" --input-file=%TEMP%\clubic.txt --output-document=%TEMP%\clubic2.txt 



REM On récupère l'adresse de la page de téléchargement et on la telecharge
 
sed -n s/\(.*\)\(lancer-le-telechargement-[[:digit:]]*-*[[:digit:]]*-*\)\([[:alpha:]]\+-\)*\([[:alpha:]]\+\.html\)\(.*\)/http:\/\/www\.clubic\.com\/\2\3\4/p "%TEMP%\clubic2.txt" | sed 2,3d > %TEMP%\clubic3.txt


wget -U="Mozilla/5.0" --input-file=%TEMP%\clubic3.txt --output-document=%TEMP%\lien.txt



REM On récupère le lien ftp de telechargent du programme

sed -n s/\(.*\)\(ftp:\/\/clubicvisiteur.*Lancer\)\(.*\)/\2/p "%TEMP%\lien.txt" | sed -n s/\(.*@\)\(ftpclubic.*\.[[:alpha:]][[:alpha:]][[:alpha:]]\)\([[:punct:]].*\)/\2/p > %TEMP%\download.txt
sed 2,3d %TEMP%\download.txt > %TEMP%\download2.txt



REM On télécharge

for /F %%a in (%TEMP%\download2.txt) do wget -U="Mozilla/5.0" %%a


REM On supprimes les fichiers temporaires

rm %TEMP%\googlesearch.txt
rm %TEMP%\clubic*.txt
rm %TEMP%\lien.txt
rm %TEMP%\download*.txt

:END

[/spoiler]
Mais je suis pas convaincu.
Sed.exe a pas l’air super stable/fiable
la plupart du temps le script fonctionne mais sur certaines recherches ça fonctionne étrangement
par exemple quand je lance le script avec comme recherche media player classic sed.exe plante
quand je lance le script pour vnc il me trouve que la version pocket pc :etonne2:
bon sinon autrement pour bcp d’autres logiciels testés ça passe.

Faut que je m’occupe de la version clubic-get-info pour récupérer la fiche descriptive des logiciels maintenant :o

Je pense que le côté aléatoire vient du fait que ta regex cherche une chaine contenant http:\www.clubic.com\telecharger-fiche…nom dans la recherche google. Or si plusieurs chaines du même type ressortent c’est la derniere qui est prise en considération (et non pas la première comme voulu).

A vérifier…

PS : bien sinon :wink:
Edité le 23/06/2009 à 12:48

merci :slight_smile:

pour ce qui est de la dernière occurrence trouvée c’est pas normal je crois justement… Il devrait les trouver toutes une par une puisque sed travaille ligne par ligne.
J’aurais à la limite plus compris que ça “bloque” au niveau du redirecteur > (au lieu de >>) qui pourrait faire que ça écrase chaque résultat par le dernier mais c’est bien au niveau de sed sur vnc qu’il me trouve pas les premiers résultats
Mais je vais tout de même revoir ça à l’occasion plus en détail sur différents cas de figure:oui:

il aurait fallut mettre le résultat dans une array…mais avec batch :frowning:

même sed.exe est vraiment un parent pauvre de sa version linux :riva:

un batch clubic-get-info
prérequis: sed.exe wget.exe et cat.exe dans system32
j’en ai bavé sur une regex :paf: Je laisse deviner laquelle :ane:

[spoiler]


@echo off

SETLOCAL ENABLEEXTENSIONS

REM 0<Nbre argument pour Nom du Programme<=3

set /a count=0
for %%a in (%*) do @set /a count+=1
if %count% EQU 0 (echo Indiquez le nom d'un programme. && echo par exemple: %0 windows media player && GOTO END)
if %count% GTR 3 (echo pas plus de 3 arguments. && echo par exemple: %0 windows media player && GOTO END)



REM On introduit les variables, en fonction de leur nombre, pour obtenir une url sous la forme  http://www.google.fr/search[...]nom+du+programme[...]

set alpha=%1
set beta=%2
set gamma=%3
if DEFINED beta (set beta=+%beta%)
IF DEFINED gama (set gamma=+%gamma%)
set PROG=%alpha%%beta%%gamma%



REM On telecharge le resultat de notre recherche sur google

wget -U="Mozilla/5.0" "http://www.google.fr/search?hl=fr&q=clubic+telecharger+%PROG%&btnG=Recherche+Google&meta=&aq=f&oq=" --output-document=%TEMP%\googlesearch.txt



REM On récupère l'adresse de la fiche clubic et on la telecharge

sed -n  s/\(.*\)\(http:\/\/www\.clubic\.com\/telecharger-fiche[[:digit:]]\+-\)\([[:alpha:]]\+-\)*\([[:alpha:]]\+\.html\)\(.*\)/\2\3\4/p "%TEMP%\googlesearch.txt"> %TEMP%\clubic.txt

wget -U="Mozilla/5.0" --input-file=%TEMP%\clubic.txt --output-document=%TEMP%\clubic2.txt



REM On supprime tout ce qui est avant la fiche descriptive 

sed 1,/\(.*\)\(div[[:blank:]]class=[[:punct:]]editorial[[:punct:]]\)\(.*\)/d %TEMP%\clubic2.txt > %TEMP%\clugetinf.txt



REM On supprime tout ce qui est après la fiche descriptive (différents cas de figures sont utilisés. Il peut peut-être y en avoir d'autre)

sed /table[[:blank:]]cellpadding=[[:punct:]]0[[:punct:]]/,$d %TEMP%\clugetinf.txt | sed /[[:punct:]]script.*/,$d |sed /[[:punct:]]\/table[[:punct:]]/,$d > %TEMP%\clugetinf2.txt



REM On supprimes les balises <br> <li> <div> et autres <ul>
REM Il en reste d'autres mais ça devrait déjà pas mal faciliter la lecture

sed s/[[:punct:]]br[[:blank:]]\/[[:punct:]]//g %TEMP%\clugetinf2.txt | sed s/[[:punct:]]\/*\(li\)[[:punct:]]//g | sed s/[[:punct:]]\/ul[[:punct:]]//g | sed s/\([[:punct:]]\/div[[:punct:]]\)//g  > %TEMP%\clugetinf3.txt



REM On supprime les liens vers les applications mentionnées dans la fiche descriptive pour plus de lisibilité
REM on passe deux fois. Etrangement ça ne passe pas en une fois quand il y'a plus d'un lien dans un même paragraphe avec l'option g (global) de sed
REM Certains fiches possèdent une floppée de liens qui ne seront donc pas traités
REM Voir si c'est possible de corriger
REM Bonne lecture :p

sed -n s/\([[:punct:]]a[[:blank:]]href=[[:punct:]]\/telecharger-fiche[[:digit:]]\+-[[:digit:]]*-*\)\([[:alpha:]]*-\)*\([[:alpha:]]\+-*[[:digit:]]*[[:punct:]]html[[:punct:]][[:blank:]]title=[[:punct:]][[:digit:]]*-*[[:alpha:]]*-*\)\([[:alpha:]]\+[[:blank:]]\)*\([[:alpha:]]\+[[:blank:]]*[[:digit:]]*[[:punct:]]\+\)\([[:blank:]]*[[:digit:]]*-*[[:alpha:]]*-*\)\([[:alpha:]]*[[:blank:]]\)*\([[:alpha:]]\+[[:blank:]]*[[:digit:]]*\)\([[:punct:]]\/a[[:punct:]]\)/\6\7\8/1;p %TEMP%\clugetinf3.txt > %TEMP%\clugetinf4.txt

sed -n s/\([[:punct:]]a[[:blank:]]href=[[:punct:]]\/telecharger-fiche[[:digit:]]\+-[[:digit:]]*-*\)\([[:alpha:]]*-\)*\([[:alpha:]]\+-*[[:digit:]]*[[:punct:]]html[[:punct:]][[:blank:]]title=[[:punct:]][[:digit:]]*-*[[:alpha:]]*-*\)\([[:alpha:]]\+[[:blank:]]\)*\([[:alpha:]]\+[[:blank:]]*[[:digit:]]*[[:punct:]]\+\)\([[:blank:]]*[[:digit:]]*-*[[:alpha:]]*-*\)\([[:alpha:]]*[[:blank:]]\)*\([[:alpha:]]\+[[:blank:]]*[[:digit:]]*\)\([[:punct:]]\/a[[:punct:]]\)/\6\7\8/1;p %TEMP%\clugetinf4.txt > %TEMP%\clugetinf5.txt



REM On supprimes certaines tabulations en trop

sed s/[[:blank:]][[:blank:]][[:blank:]]//g %TEMP%\clugetinf5.txt > %TEMP%\clugetinf6.txt


REM On affiche le résultat

cat -s %TEMP%\clugetinf6.txt


REM On supprimes les fichiers temporaires
DEL %TEMP%\googlesearch.txt
DEL %TEMP%\clubic*
DEL %TEMP%\clugetinf*

[/spoiler]
Edité le 24/06/2009 à 02:53