Page 1 sur 2
[..] Creation d'une GUI pour speedtest
Posté : ven. 21 août 2015 22:34
par Utilisateur 3309 supprimé
Bonjour,
tout le monde connaît Speedtest.net qui permet de vérifier les performance de sa ligne internet.
Le test se fait depuis un navigateur web + Flash.
Il existe un exécutable en ligne de commande qui permet de faire le test, il est disponible ici:
https://github.com/zpeters/speedtest
J'ai donc décidé d'utiliser autoit pour piloter cet exécutable et d'afficher le résultat dans une GUI.
tout d'abord j'ai récupéré la liste des serveurs avec la commande:
Puis j'ai supprimé tous les serveurs inutiles, et conservé que les français. J'ai ensuite bidouillé le fichier txt pour l'adapter à mes besoins.
Voici le résultat:
Vous pouvez récupérer l'ensemble des fichiers ici:
http://liveboxinfo.tk/download/speedtest-gui.zip
► Afficher le texte
Code : Tout sélectionner
#include <ButtonConstants.au3>
#include <ComboConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
;Lecture de la liste des serveurs
Local $hFile = FileOpen(@scriptdir & "\servers.txt")
Local $sliste = ""
; création du menu déroulant
While 1
$line = FileReadLine($hFile)
If @error = -1 Then ExitLoop
$aData = stringsplit($line,"|")
$sServer = $aData[1] & " / " & $aData[2] & " / " & $aData[3]; [1]=Ville [2]=SiteName [3]=ID
$sliste = $sliste & $sServer & "|"
WEnd
FileClose($hFile)
#Region ### START Koda GUI section ### Form=
$Form1 = GUICreate("SpeedTest GUI", 371, 176, 192, 124)
$Combo1 = GUICtrlCreateCombo("", 16, 24, 241, 25, BitOR($CBS_DROPDOWN,$CBS_AUTOHSCROLL))
GUICtrlSetData($Combo1, $sliste, "Massy / TestDebit.info / 2231")
$Label1 = GUICtrlCreateLabel("Choisir serveur", 16, 8, 73, 16)
$Button1 = GUICtrlCreateButton("Lancer !", 288, 24, 65, 25)
$Edit1 = GUICtrlCreateEdit("", 16, 64, 337, 97,$ES_WANTRETURN)
GUICtrlSetData(-1, "")
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###
While 1
$nMsg = GUIGetMsg()
Switch $nMsg
Case $GUI_EVENT_CLOSE
Exit
Case $Button1
$sSelection = GUICtrlRead($Combo1) ; on lit la selection
$aServeur = stringsplit($sSelection,"/")
$sServeur = $aServeur[3] ; on récupère l'ID du serveur
GUICtrlSetState($Button1, $GUI_DISABLE) ; On désactive le bouton durant l'exécution
GUICtrlSetData($Edit1,"Speedtest en cours....")
; Execution de la commande
runwait(@ComSpec & " /c " & 'speedtest.exe -s ' & $sServeur & '>result.txt', "", @SW_HIDE)
; On lit le résultat dans le fichier
$hFile = FileOpen(@scriptdir & "\result.txt")
$sFile = FileRead($hFile)
; On récupère les données qui nous interessent
$aPing = StringRegExp($sFile, 'Ping \(Lowest\): (.*?)\|', 3)
$aDownload = StringRegExp($sFile, 'Download \(Max\): (.*?)\|', 3)
$aUpload = StringRegExp($sFile, 'Upload \(Max\): (.*?)Mbps', 3)
; On formate le résultat pour l'affichage
$result = "Serveur : " & $sSelection & @CRLF & _
"Ping : " & $aPing[0] & @CRLF & _
"Download : " & $aDownload[0] & @CRLF & _
"Upload : " & $aUpload[0] & "Mbps"
FileClose($hFile)
FileDelete(@scriptdir & "\result.txt")
GUICtrlSetData($Edit1,$result) ; On affiche le résultat
GUICtrlSetState($Button1, $GUI_ENABLE) ; On réactive le bouton
EndSwitch
WEnd
Donc voici ma question:
y a t'il moyen de se passer de l'exécutable de
zpeters et de tout intégrer dans autoit ? avec winhttprequest par exemple ? si oui comment faire ? je ne sais pas comment le test fonctionne...ou les données sont téléchargées et ou elles sont uploadées etc...
Merci pour votre aide.

Re: [..] Creation d'une GUI pour speedtest
Posté : dim. 23 août 2015 21:16
par walkson
Bonjour,
Je viens de tester speedtest et cela me donne des idées pour vous répondre.
J'avais utilisé Inetget() pour récupérer un exécutable et ça marche bien. Le seul inconvénient est que si vous mettez l'adresse du site et qu'il y a une nouvelle version, ça ne marche plus.
Après, vous pouvez mettre l'exécutable sur votre site, c'est une solution.
Enfin, il y a la solution d'écrire l'exécutable en binaire et de le mettre sous forme de fonction afin de le redéployer. Il y a BinaryToAu3Kompressor de wakillon (forum US) qui fait trés bien celà. Sous forme Au3, le script pèse 1,85 Mo pour 5,62 Mo pour l'exécutable. Si vous le souhaitez, je peux mettre le script sur le forum.
Si je peux me permettre une remarque, j'ai été étonné que vous passiez par des TXT pour récupérer les retours de speedtest.
Ça ne serait pas plus simple d'utiliser StdoutRead() comme ceci
► Afficher le texte
Code : Tout sélectionner
$chemin = @ScriptDir & '\speedtest.exe -l'
$ecoute = run( $chemin, @WorkingDir, @SW_HIDE, $STDOUT_CHILD)
Local $data = ""
While True
$data &= StdoutRead($ecoute)
If @error Then ExitLoop
Sleep(25)
WEnd
Dans le cas présent, je récupère tous les serveurs, ce qui me permet de faire le trie pour choisir un pays.
Une dernière remarque, je ne sais pas si c'est mon PC qui est lent (ou la connexion) mais attendre sans savoir si le programme a beuguer, c'est long. Un petit progressbar ou autre ferait du bien pour patienter (enfin, c'est mon avis perso)
[Edit]
J'oubliais, votre script beugue quand un serveur n'est pas disponible ou quand la connexion est impossible au niveau de
Code : Tout sélectionner
$result = "Serveur : " & $sSelection & @CRLF & _
"Ping : " & $aPing[0] & @CRLF & _
"Download : " & $aDownload[0] & @CRLF & _
"Upload : " & $aUpload[0] & "Mbps"
Autoit ne trouve pas d'array (normal!)
Il faudrait la condition If IsArray ( variable ) = 1 Then ... avant ces lignes pour résoudre le problème
Re: [..] Creation d'une GUI pour speedtest
Posté : dim. 23 août 2015 21:42
par Utilisateur 3309 supprimé
Bonjour,
merci pour vos réponses.
intégrer l'exécutable speedtest.exe dans le script pourrait être une solution mais ca ne me plait pas trop, car on ne comprends toujours pas ce qu'il fait.
Pour le passage par un fichier TXT effectivement j'ai fait au mieux de mes connaissances, je ne savais pas qu'on pouvait faire de cette façon pour récupérer le retour...Merci pour l'info
OK pour le isarray() à ajouter

Re: [..] Creation d'une GUI pour speedtest
Posté : dim. 23 août 2015 22:21
par walkson
cetipabo a écrit :intégrer l'exécutable speedtest.exe dans le script pourrait être une solution mais ca ne me plait pas trop, car on ne comprends toujours pas ce qu'il fait.
Pourquoi ? Vous déclarer la fonction _Speedtestexe ( "speedtest.exe", @TempDir & "\", 0 ), Speedtest.exe est créé dans (Par exemple) un dossier Temp et puis reste à appeler l'exécutable.
Le réel inconvénient est de surcharger le script
[Petit edit]
"Une actuce"
Code : Tout sélectionner
$chemin = @ScriptDir & '\speedtest.exe -l'
$ecoute = run( $chemin, @WorkingDir, @SW_HIDE, $STDOUT_CHILD)
Fonctionne parce que le chemin est intégré dans la variable $chemin Autrement Ke néni ! @ScriptDir & '\speedtest.exe en direct ! passez votre chemin
Re: [..] Creation d'une GUI pour speedtest
Posté : dim. 23 août 2015 22:37
par Utilisateur 3309 supprimé
j'ai bien compris, mais ce que je souhaite faire c'est la même chose que fait cet exécutable, avec winhttprequest par exemple, mais pas l'intégrer. Du 100% autoit quoi...
Re: [..] Creation d'une GUI pour speedtest
Posté : lun. 24 août 2015 11:25
par walkson
Bonjour,
J'ai du mal à vous suivre !
Pour faire du 100% autoit, il faudrait réécrire speedtest en autoit. En ce qui concerne winhttprequest, vous téléchargez l'exécutable comme peut le faire Inetget(), selon mes humbles connaissances...
Après, lancer l'exécutable directement de son site, il me semble totalement impossible à faire.
Donc je ne vois que 3 solutions, ou télécharger speedtest, ou faire le test sur une page d'un site et récupérer les données, ou incorporer l'exécutable dans le script sous forme binaire, à moins qu'un expert ne vienne me contredire...
La forme la plus indépendante de votre programme serait la dernière solution. A titre d'exemple, dans votre Zip, il y a une icone "Speedtest.ico". Il serait tout à fait possible de l'introduire dans le script sous forme binaire afin de l'utiliser au lancement de votre programme. Ce qui ferait un pièce jointe en moins.
Il y a aussi la solution de FileInstall () mais je ne l'utilise plus car il y a des problèmes de faux positifs avec les antivirus
Re: [..] Creation d'une GUI pour speedtest
Posté : lun. 24 août 2015 12:00
par Utilisateur 3309 supprimé
On ne se comprend pas.
l'application de
Zpeters fait en ligne de commande la même chose que l'on fait sur le site web : speedtest.net en flash.
il se connecte sur les serveurs de OOKLA et utilise leur protocole pour envoyer des données et en recevoir afin d'établir une valeur de download/upload/ping.
C'est ca que je voudrais faire en 100% autoit, s'il le fait en langage GO on devrait pouvoir le faire en autoit, il suffit de comprendre comment fonctionne le protocol de speedtest.net.
Déja pour récupérer la liste des serveurs on se connecte sur cette page:
http://www.speedtest.net/speedtest-servers.php
c'est ce que fait l'appli de zpeters lorsqu'on fait un
speedtest.exe -l
Et après ce qu'il reste a savoir c'est quelles sont les variables POST ou GET ou cookies à envoyer au serveur pour initier un test. je ne pense pas qu'on puisse le faire facilement avec inetget, par contre avec winhttprequest oui.
intégrer un exécutable qui fait le boulot dans mon code autoit ne m'interesse pas, ce n'est pas du tout ce que je cherche a faire.
Si
Zpeters et
sivel y arrivent, respectivement en GO et en Python, on devrait y arriver aussi en autoit.
Re: [..] Creation d'une GUI pour speedtest
Posté : lun. 24 août 2015 17:51
par walkson
Re,
Vous l'aviez vu
https://www.autoitscript.com/forum/topi ... tinfo-udf/ ?
Je l'ai testé rapidement et j'ai eu un problème avec $My_Location = _NetInfo_GetIPLocation() qui n'est pas reconnu comme array. Le reste a fonctionné.
J'ai regardé aussi les scripts de Zpeters et sivel. Il semble qu'ils utilisent
https://www.speedtest.net/speedtest-config.php et
https://www.speedtest.net/speedtest-servers-static.php qui renvoie les adresses des serveurs.
Tous les serveurs semblent être configurés à l'identique comme ceci
http://speedtest.oltv.ru/speedtest/
Voilà, si ça peut vous être utile...
Re: [..] Creation d'une GUI pour speedtest
Posté : lun. 24 août 2015 22:38
par jguinch
Oui, il suffit de prendre le code source et jeter un oeil
Il y a un intéressant sur Speedtest :
https://support.speedtest.net/hc/en-us/ ... alculated-
@cetipabo : j'aimerais bien connaître la finalité de ton script... Il est censé remplacer les outils existants ?
Si c'est juste pour un test approximatif, c'est plutôt simple. Si tu peux faire un truc assez chiadé, ça va être un poil plus compliqué.
D'après ce que j'ai vu, le script Zpeters passe par les étapes suivantes :
- téléchargement de la liste des serveurs
- calcul du serveur le plus proche (par coordonnées géographiques)
- calcul du serveur le plus rapide
- envoi des requêtes GET pour téléchargement d'un fichier .jpg aléatoire puis calcul du temps de réponse
- calcul du temps de réponse moyen en download à partir des temps de réponse précédents
- envoi des requêtes POST pour upload via le formulaire (je n'ai pas compris ce qui est envoyé

)
- calcul du temps de réponse moyen en upload à partir des temps de réponse précédents
Re: [..] Creation d'une GUI pour speedtest
Posté : lun. 24 août 2015 22:42
par Utilisateur 3309 supprimé
ha!!! merci beaucoup ! c'est exactement ce que je voulais, donc quelqu'un a déjà fait ce que je voulais faire

Re: [..] Creation d'une GUI pour speedtest
Posté : mar. 25 août 2015 08:38
par Utilisateur 3309 supprimé
@Jguinch
le but c'est juste de faire le test speedtest tel qu'on le ferait si on allait sur leur site, mais sans y aller

donc conserver leur méthode de calcul pour que les résultats soient cohérents.
c'est aussi pour m'exercer à l'utilisation de winhttprequest que vous m'avez fait découvrir dans l'utilitaire LiveBoxinfo.

Re: [..] Creation d'une GUI pour speedtest
Posté : mar. 25 août 2015 12:48
par mikell
Tu pourrais jeter un coup d'oeil à la version 'light' de speedtest.net
http://speedtest.api-digital.com/
Même moteur, mêmes serveurs, même protocole, mais avec Firebug on y voit beaucoup mieux

Re: [..] Creation d'une GUI pour speedtest
Posté : mar. 25 août 2015 17:36
par Utilisateur 3309 supprimé
merci mikell !
encore mieux !!

Re: [..] Creation d'une GUI pour speedtest
Posté : mar. 25 août 2015 22:15
par mikell
Juste pour le concept j'ai bricolé ça pour voir
► Afficher le texte
Code : Tout sélectionner
#Include <Array.au3>
#include <WinHTTP.au3>
SplashTextOn ("", "Chargement de la liste des serveurs ...", 380, 55, -1, 300, 49)
$txt = BinaryToString(InetRead("http://c.speedtest.net/speedtest-servers-static.php", 1))
SplashTextOn ("", "Tri des serveurs français ...", 380, 55, -1, 300, 49)
$a = StringRegExp($txt, '<server url="([^"]+).*?name="([^"]+).*?cc="FR.*?sponsor="([^"]+)', 3)
SplashOff()
; _ArrayDisplay($a)
$oHTTP = ObjCreate("Microsoft.XMLHTTP")
Local $bestindex, $latency = 1000
For $i = 0 to UBound($a)-1 step 3
SplashTextOn ("", " Test du serveur : " & $a[$i+1], 350, 55, -1, 300, 53)
$tmp = _test($a[$i])
If $tmp < $latency Then
$bestindex = $i
$latency = $tmp
EndIf
Next
SplashOff()
$bestserver = StringReplace($a[$bestindex], "/speedtest/upload.php", "")
$name = $a[$bestindex+1]
$sponsor = $a[$bestindex+2]
Msgbox(0,"", "meilleur serveur : " & $name & " (" & $sponsor & ")" &@crlf& $bestserver &@crlf& $latency)
;===========================================
$UserAgent = "Mozilla/5.0 (Windows NT 5.1; rv:14.0) Gecko/20100101 Firefox/14.0.1"
$s = ""
$chars = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'
For $i = 1 to 16000
$s &= $chars
Next
$sPD = Binary($s) ; 500 Ko environ
SplashTextOn ("", "Test de débit montant ...", 380, 55, -1, 300, 49)
$upspeed = _Upld($bestserver, "speedtest/upload.php", $sPD)
Sleep(100)
SplashTextOn ("", "Test de débit descendant ...", 380, 55, -1, 300, 49)
$dwspeed = _Dwld($bestserver, "speedtest/random2500x2500.jpg") ; 12 Mo
SplashOff()
Msgbox(0,"", "descendant = " & $dwspeed &@crlf& "montant = " & $upspeed)
;=============================================
Func _Upld($server, $page, $data)
$server = StringReplace($server, "http://", "")
$hHttpOpen = _WinHttpOpen($UserAgent)
$hHttpConnect = _WinHttpConnect($hHttpOpen, $server)
$hHttpRequest = _WinHttpOpenRequest($hHttpConnect, "POST", $page)
_WinHttpSendRequest($hHttpRequest, Default, $sPD, BinaryLen($sPD))
$begin = TimerInit()
_WinHttpReceiveResponse($hHttpRequest)
$time = Floor(TimerDiff($begin) )
Global $sReturned
If _WinHttpQueryDataAvailable($hHttpRequest) Then
Do
$sReturned &= _WinHttpReadData($hHttpRequest)
Until @error
EndIf
$sHeader = _WinHttpQueryHeaders($hHttpRequest)
$size = StringLen($UserAgent) + BinaryLen($sPD) + StringLen($sHeader) + StringLen($sReturned)
_WinHttpCloseHandle($hHttpRequest)
_WinHttpCloseHandle($hHttpConnect)
_WinHttpCloseHandle($hHttpOpen)
$moysize = ($size*8)/1000
$moytime = ($time/1000)
Return Round($moysize/$moytime, 1)
EndFunc
Func _Dwld($server, $sTarget)
$server = StringReplace($server, "http://", "")
$hHttpOpen = _WinHttpOpen($UserAgent)
$hHttpConnect = _WinHttpConnect($hHttpOpen, $server)
$hHttpRequest = _WinHttpOpenRequest($hHttpConnect, "GET", $sTarget)
;_WinHttpAddRequestHeaders($hHttpRequest, $RequestHeaders)
_WinHttpSendRequest($hHttpRequest)
$begin = TimerInit()
_WinHttpReceiveResponse($hHttpRequest)
Local $bChunk, $bData = Binary(""), $hFile, $error
If _WinHttpQueryDataAvailable($hHttpRequest) Then
While 1
$bChunk = _WinHttpReadData($hHttpRequest, 2, 4096) ; binary
If @error Then ExitLoop
$bData &= $bChunk
WEnd
$time = Floor(TimerDiff($begin) )
Else
MsgBox(48, "", "erreur de connection ou d'identification")
$error = 1
EndIf
$headers = _WinHttpQueryHeaders($hHttpRequest)
$size = StringRegExp($headers, 'Content-Length\D*(\d+)', 3)[0]
$size += StringLen($headers)
$size += StringLen($UserAgent)
_WinHttpCloseHandle($hHttpRequest)
_WinHttpCloseHandle($hHttpConnect)
_WinHttpCloseHandle($hHttpOpen)
If $error = 1 Then Return "tilt"
$moysize = ($size*8)/1000
$moytime = ($time/1000)
Return Round($moysize/$moytime, 1)
EndFunc ;==>_Dwld
Func _test($url)
$oHTTP.Open("GET", $url, 0)
$begin = TimerInit()
$oHTTP.Send()
If $oHTTP.readystate = 4 Then
$time = TimerDiff($begin)
Return ($time > 150) ? 1000 : $time
EndIf
; If $oHTTP.Status = 200 Then Return ($time > 150) ? 1000 : $time
EndFunc
c'est simplissime, le script prend le plus performant parmi les serveurs speedtest français et fait un upload et un download
Les valeurs obtenues sont un peu inférieures à celles de speedtest mais j'imagine que leurs machines n'ont rien à voir avec les notres (et sont dédiées)

Re: [..] Creation d'une GUI pour speedtest
Posté : mer. 26 août 2015 00:03
par jguinch
Sympa ton script mikell
J'ai trouvé que ta regex mettait du temps à s'exécuter, j'ai pas compris pourquoi...
Ci-dessous un code qui permet la géo-localisation en fonction de l'adresse IP publique (en se basant sur ip-api.com), afin de déterminer quel est le serveur le plus proche. Je ne sais pas s'il y a un intérêt, mais c'est quelque chose qui est effectué sur SpeedTest.
► Afficher le texte
Code : Tout sélectionner
$ipLocation = BinaryToString (InetRead("http://ip-api.com/json"))
$lat = StringRegExp($ipLocation, '"lat":(-?\d+(?:.\d+)?)', 1)[0]
$lon = StringRegExp($ipLocation, '"lon":(-?\d+(?:.\d+)?)', 1)[0]
ConsoleWrite("latitude=" & $lat & "; longitude=" & $lon & @CRLF)
$txt = BinaryToString(InetRead("http://www.speedtest.net/speedtest-servers.php", 0))
$a = StringRegExp($txt, 'url="([^"]+)" lat="([^"]+)" lon="([^"]+)" name="([^"]+)".+?cc="FR" sponsor="([^"]+)"', 3)
$iPlusProche = 0
$iIndexPlusProche = 0
For $i = 0 To UBound($a) - 1 Step 5
$distLat = $lat - $a[$i + 1]
$distLon = $lon - $a[$i + 2]
$dist = Sqrt( ($distLat ^2) + ($distLon ^2) )
If $iPlusProche = 0 Then
$iPlusProche = $dist
ElseIf $dist < $iPlusProche Then
$iPlusProche = $dist
$iIndexPlusProche = $i
EndIf
Next
MsgBox(0, "", "Serveur le plus proche : " & @CRLF & "URL=" & $a[$iIndexPlusProche] & @CRLF & "Name=" & $a[$iIndexPlusProche + 3] & @CRLF & "Sponsor=" & $a[$iIndexPlusProche + 4] )
Re: [..] Creation d'une GUI pour speedtest
Posté : mer. 26 août 2015 00:33
par mikell
Pour le regex c'est vrai que c'est un peu long... c'est peut-être que le fichier fait 940 Ko et contient 3857 serveurs ?
Sinon je n'ai pas fait la géo-localisation parce que de toute façon speedtest teste ensuite le ping sur les serveurs les plus proches, donc je suis allé au plus court
En fait j'ai essayé de faire le plus rapide possible. Le script avec l'exe de cetipabo, chez moi il met environ 4 minutes à s'exécuter... j'imagine que si un utilisateur fait du speedtest sans arrêt c'est que c'est un obsédé de la vitesse, et là 4 minutes ça va vite le faire ch*er

Re: [..] Creation d'une GUI pour speedtest
Posté : mer. 26 août 2015 07:23
par jguinch
Ce que je voulais dire, c'est que ta regex est anormalement longue (j'avais mis un timer pour voir combien de temps ça met). Je l'ai testé sur regex101 et j'ai l'erreur
Catastrophic backtracking. Je sais pas pourquoi...
https://regex101.com/r/tZ7zG8/1
Re: [..] Creation d'une GUI pour speedtest
Posté : mer. 26 août 2015 09:52
par mikell
Je crois que j'ai compris, c'est une histoire de backtracking
Code : Tout sélectionner
$a = StringRegExp($txt, '(?><server url="([^"]+))(?>.*?name="([^"]+))(?>.*?cc="FR" sponsor="([^"]+))', 3)
Re: [..] Creation d'une GUI pour speedtest
Posté : mer. 26 août 2015 09:54
par jchd
C'est bien de l'avoir enregistré car je n'utilise pas de LB.
Un simple U dans les options cicatrise l'hémorragie. Après je ne sais pas si le résultat est celui attendu, mais c'est l'idée et là je n'ai pas le temps de creuser plus.
Re: [..] Creation d'une GUI pour speedtest
Posté : mer. 26 août 2015 10:21
par mikell
Je ne comprends pas l'utilisation de (?U) dans ce cas vu que les seuls quantifiers greedy dans l'expression initiale étaient sur des classes, donc restrictifs
C'est confirmé par regex101 (même si les groupes atomiques font encore 1/3 d'étapes en moins) en revanche dans le script le résultat est inattendu
