Page 3 sur 6
Re: [Ex] Surveillance de réponse sur le forum
Posté : lun. 06 févr. 2012 13:40
par matwachich
D'ou l'intérêt justement de faire des scripts SUPER BIEN organiser:
séparer les fonctions: GUI, Récupération de données, Traitement de données, affichage
De préférence dans des fichiers séparés!
Ca aurait été plus facile d'ajouter des fonctionnalités.
Re: [Ex] Surveillance de réponse sur le forum
Posté : lun. 06 févr. 2012 13:48
par mikell
matwachich a écrit :séparer les fonctions: GUI, Récupération de données, Traitement de données, affichage
Tu as jeté un oeil au script ? c'est exactement comme ça qu'il est construit !
Avec renvoi dans des arrays des infos collectées par les fonctions, ce qui donne beaucoup de souplesse
Ajouter des fonctionnalités, je fais que ça depuis un moment, sans problème
Mais là on parle de traiter une page dont la structure peut être différente des autres donc je dois vérifier la compatibilité avec les fonctions de récupération d'infos ^^
Re: [Ex] Surveillance de réponse sur le forum
Posté : lun. 06 févr. 2012 16:33
par TT22
@mikell :
Ça te va ça ?
► Afficher le texte
Code : Tout sélectionner
#include <String.au3>
#include <INet.au3>
$Return = _Check(5000)
MsgBox(64,"Info",$Return[0]&" par "&$Return[1])
Func _Check($Time)
$Source = _INetGetSource("http://www.autoitscript.fr/forum/portal.php")
$String = _StringBetween($Source,'" class="topictitle">',"</a>")
$Auteurs = _StringBetween($Source,'<p class="topicdetails"><a href="./memberlist.php?mode=viewprofile&u=','</a>')
$AutMes = _StringBetween($Auteurs[0]&"@END",'">',"@END")
$Return_First = $String[0]&"="&$AutMes[0]
While 1
Sleep($Time)
$Source = _INetGetSource("http://www.autoitscript.fr/forum/portal.php")
$String = _StringBetween($Source,'" class="topictitle">',"</a>")
$Auteurs = _StringBetween($Source,'<p class="topicdetails"><a href="./memberlist.php?mode=viewprofile&u=','</a>')
$AutMes = _StringBetween($Auteurs[0]&"@END",'">',"@END")
If $Return_First <> $String[0]&"="&$AutMes[0] Then
Dim $Return[2] = [$String[0],$AutMes[0]]
Return $Return
EndIf
WEnd
EndFunc
La fonction _Check($Time) retourne un array[2] avec pour 0 le nom sujet et pour 1 l'auteur.
$Time dit à quel intervalle il faut ré-actualiser les données (en milli-secondes).
Re: [Ex] Surveillance de réponse sur le forum
Posté : lun. 06 févr. 2012 17:00
par matwachich
C'est vrai que j'ai pas étudier le script (d'autres chats à fouetter!

), j'ai juste vu qu'il avait besoin d'un bon Ctrl+T

Re: [Ex] Surveillance de réponse sur le forum
Posté : lun. 06 févr. 2012 22:04
par mikell
@TT22
Merci mais ça j'avais déjà
► Afficher le texte
Code : Tout sélectionner
#Include <Array.au3>
Global $urltopic = "http://www.autoitscript.fr/forum/viewtopic.php?f="
$infos = _getInfosAboutZeTopics(0)
_ArrayDisplay($infos)
Func _getInfosAboutZeTopics($F_ind)
$oHTTP = ObjCreate("winhttp.winhttprequest.5.1")
$oHTTP.Open("GET", "http://www.autoitscript.fr/forum/portal.php")
$oHTTP.Send()
Local Const $txt = $oHTTP.Responsetext
$oHTTP = 0
Local Const $txt2 = StringRegExpReplace($txt, '(?s)(.*?)Sujets</b>', "")
Local $items = StringRegExp($txt2, '(?s)topictitle">(.*?)"><img', 3)
Local $viewtopics[UBound($items)][7]
For $i = 0 To UBound($items)-1
Local $titre = StringRegExp($items[$i], '^(.*?)</a>', 1)
If IsArray($titre) Then
If StringInStr(StringLeft($titre[0], 4), "[.") Then $titre[0] = StringRegExpReplace($titre[0], '^(.*?)\]', "") ; titre
If StringInStr($titre[0], '"') Then $titre[0]= StringReplace($titre[0], '"', '"')
If StringInStr($titre[0], '&') Then $titre[0]= StringReplace($titre[0], '&', '&')
$viewtopics[$i][0] = $titre[0]
EndIf
Local $date = StringRegExp($items[$i], '(?s)nowrap;">(.*?)</p>', 1)
If IsArray($date) Then $viewtopics[$i][4] = $date[0]
Local $author = StringRegExp($items[$i], '(?s)memberlist(.*?)</a>', 1)
If IsArray($author) Then
Local $name = StringRegExp($author[0], '(?s)>(.*?)$', 1)
Local $ID = StringRegExp($author[0], '(?s)u=(.*?)[&"]', 1)
If IsArray($name) Then $viewtopics[$i][1] = $name[0]
If IsArray($ID) Then $viewtopics[$i][2] = $ID[0]
EndIf
Local $F_string = $items[$i]
If StringInStr($F_string, "sid") Then $F_string = StringRegExpReplace($F_string, '(?s)(.+)&sid(.+)#(.+)', "$1"&"#"&"$3")
$F_ind = StringRegExpReplace($F_string, '(?s)(.+)f=(.+?)&t(.+)', "$2")
Local $adrtopic = StringRegExpReplace($F_string, '(?s)(.+)&t(.+)&p(.+)', "&t"&"$2"&"&p"&"$3")
Local $linkrep = $urltopic& $F_ind & $adrtopic
$viewtopics[$i][3] = $linkrep
Local $link = StringRegExpReplace($linkrep, "&p=.+", "")
$viewtopics[$i][5] = $link
$viewtopics[$i][6] = $F_ind
Next
Return $viewtopics ; pour $infos
EndFunc ;==> _getInfosAboutZeTopics
;#####################
;_getInfosAboutZeTopics($ind) renvoie dans $infos tous les sujets du forum $ind avec :
;$infos[$i][0] = titre du sujet
;$infos[$i][1] = nom de l'auteur
;$infos[$i][2] = ID de l'auteur
;$infos[$i][3] = lien vers la dernière réponse
;$infos[$i][4] = date de la dernière réponse
;$infos[$i][5] = lien vers le sujet
;$infos[$i][6] = $ind du forum
;###################
Mon problème, c'est pas tant la récupération des données que l'intégration dans le reste du script
@matwachich
Si le seul souci avec mon script c'est d'y faire un Ctrl+T, on peut considérer que ça va

Re: [Ex] Surveillance de réponse sur le forum
Posté : lun. 06 févr. 2012 23:05
par XenaMelody
Very nice

Re: [Ex] Surveillance de réponse sur le forum
Posté : mar. 07 févr. 2012 12:31
par ZDS
Bonjour,
Juste une petite amélioration possible de code en passant (c'est vraiment pas grand chose) :
Code : Tout sélectionner
Func singleton($nom)
Local $security = 0
Local $handle = DllCall("kernel32.dll", "int", "CreateMutex", "ptr", $security, "long", 1, "str", $nom)
Local $error = DllCall("kernel32.dll", "int", "GetLastError")
Return $error[0] <> 183
EndFunc
Et bien sûr, la ligne
"If Not singleton($id) Then" qui va avec. Ça peut toujours être utile ^^
Sinon, merci pour ce script, très utile
A bientôt !
Re: [Ex] Surveillance de réponse sur le forum
Posté : mar. 07 févr. 2012 19:49
par mikell
Merci, mais tu ne dois pas avoir la dernière version du script où (avec la correction de qqes discrets petits bugs) j'utilise la fctn _Singleton de l'UDF d'autoit

Toutefois je crois bien que je vais changer pour la tienne (plus légère)
A propos de bugs, si tu vois des dysfonctionnements ou autres curiosités merci de me le faire savoir
ZDS a écrit :Sinon, merci pour ce script, très utile

Comme quoi réinventer la roue peut donner des résultats sympa, parfois

Re: [Ex] Surveillance de réponse sur le forum
Posté : mar. 07 févr. 2012 22:43
par Tlem
Bonsoir.
La version de la fonction _Singleton fournie par ZDS est certes plus légère, mais si mes souvenirs sont justes, elle ne prendra pas en compte l'utilisation par un utilisateur avec droits limités.

Re: [Ex] Surveillance de réponse sur le forum
Posté : mar. 07 févr. 2012 23:05
par ZDS
Bonsoir,
Les craintes de Tlem sont compréhensibles, mais dans ce cas, la fonction _Singleton d'origine ne le gérera pas non plus. La version allégée que j'ai proposé est une version où le flag serait fixé à 1. L'utilité du flag à 0 est discutable, car terminer un script avec un Exit en plein milieu d'un code est à mon sens une dégueulasserie sans nom ^^ et n'a pas la finesse d'un traitement au cas par cas, comme un message de confirmation "attention, script déjà en cours. voulez-vous tout de même le relancer?" Le flag à 2 permet quand à lui de créer un mutex de type Local/Global; Utile dans le cadre des multi-sessions, mais rien à voir avec les droits ou le statut des utilisateurs.
Bref, la seule chose que ne fait pas ce bout de code, c'est le partage du sémaphore entre les sessions en cours. Ce qui reste pour moi un avantage : X n'a pas à savoir que j'ai lancé un mutex "tartampion" sur ma session que j'ai verrouillée en partant. Au pire, une fonction "singletonMulti()" d'une demi douzaine de lignes fera aussi bien l'affaire.
EDIT @Tlem : Par dégeulasserie, je parle de faire un Exit en plein milieu du code, comme peut le faire _Singleton avec le flag 0. Surtout que la plupart des gens n'utilisent pas de fonction "OnAutoItExitRegister" pour nettoyer les choses avant de quitter (Parfois ce n'est pas possible car les variables sont locales, donc non accessibles par la fonction OnAutoItExitRegister). Pour l'exemple,
Code : Tout sélectionner
While True
Local $msg = GUIGetMsg()
If $msg = $quitter Then Exit
WEnd
est pour moi à proscrire. Une alternative propre, même si dans ce cas ce n'est pas probant, serait plutôt
Code : Tout sélectionner
Local $stop = False
While Not $stop
Local $msg = GUIGetMsg()
If $msg = $quitter Then $stop = True
WEnd
Exit
Au moins, si il y a un traitement à faire avant de quitter, il n'est pas cloisonné dans le traitement des messages. Je sais que ce n'est que de l'algo et que ça ne modifie en rien les performances du script, mais comme on en avait déjà parlé lors des tutos sur la récursivité (
http://www.autoitscript.fr/forum/viewto ... 073#p33073), je pense indispensable d'adopter de bonnes pratiques de programmation.
EDIT2 @Tlem et Iste: Ce débat n'a pas vraiment sa place ici. A chacun sa façon de coder, il n’empêche pour ma part que je trouve immonde de faire un Exit en plein milieu d'une exécution. J'ai parfois l'impression, en vous entendant, que vous aimeriez revenir à des Lbl et Goto. Et ça me fait peur. La fonction que je propose n'a pas pour vocation d'être plus performante. Juste d'éviter d'embarquer un autoradio MP3 si on a pas d'enceinte.
PS: Franchement, vous l'utilisez beaucoup, vous le flag à 2 sur le _Singleton?
Re: [Ex] Surveillance de réponse sur le forum
Posté : mar. 07 févr. 2012 23:18
par matwachich
Bug:
J'ai voulu relancer le script et:
Subscript used with non-Array variable en ligne 494, sur le array $ini_items
Je pense que c'est parce que il ne trouve pas le ini, il faudrait gérer ça!
Re: [Ex] Surveillance de réponse sur le forum
Posté : mar. 07 févr. 2012 23:22
par Tlem
Attention,
_Singleton() à pour vocation d'empêcher
plusieurs instances d'un même programme. Donc peut importe la notion de session, le but précis de cette fonction est bien de limiter le fonctionnement d'un programme à
une seule et unique instance, peut importe l'utilisateur en cours.
Imaginez votre programme lancé en mode service qui fait une action bien particulière et une deuxième qui détruit tout ce que fait la première ...
Donc non, ce n'est pas "une dégueulasserie sans nom" que de stopper un script au début de son lancement afin d'éviter qu'il ne soit lancé plus d'une fois et vienne mettre le bordel dans ce que fait le premier.
Re: [Ex] Surveillance de réponse sur le forum
Posté : mar. 07 févr. 2012 23:47
par mikell
Ce pb de ini est en principe réglé dans la dernière version
Corrigé aussi, un gros bug sur les liens quand il y a plusieurs notifications affichées en même temps
Ajouté un bouton pour surveiller tous les forums (par analyse de la page d'accueil) : au début c'était pour le challenge de TT22 mais c'est vrai que le résultat est assez fun

Ton UDF Thread est balèze, j'attends ce WE pour regarder ça et essayer de comprendre

Re: [Ex] Surveillance de réponse sur le forum
Posté : mer. 08 févr. 2012 00:02
par matwachich
Au fait, rien à voir avec le script mais plutôt la présentation:
- Ca t’ennuierai de joindre le script plutôt que de le mettre en
Code : Tout sélectionner
, un peut chia*t de tout sélectionner pour Copier/Coller! :P :lol:
Re: [Ex] Surveillance de réponse sur le forum
Posté : mer. 08 févr. 2012 09:12
par mikell
Bah je pensais que les gens pourraient avoir envie de juste jeter un coup d'oeil au script sans forcément le télécharger...
Mais bon je le mets en pièce jointe pour les flemmards

Re: [Ex] Surveillance de réponse sur le forum
Posté : mer. 08 févr. 2012 10:45
par TopXm
Hello

En effet sympa l'outil, je suis en train d'en confectionner un multi-forum PhpBB pour mes besoins perso. Je t'emprunte quelques idées intéressantes si tu le permets
Par contre, si j'ai bien compris la méthode, tu me confirmes bien que seuls les sujets de la 1ere page du "sous-forum" sont suivis, c'est bien ça ?
Bon en même temps, suivre un sujet qui date de mathusalem n'a pas trop d'intérêt, juste qu'à la longue certains sujets seront "suivis" donc dans le fichier ini alors qu'il sont vieux comme "mes robes", du coup niveau surveillance ça va faire des requests inutiles, non ?
Ah si, juste un petit truc de chipoteur

quitte à récupérer l'icône du site pourquoi ne pas l'ajouter à la GUI
M'enfin quoiqu'il en soit, fort sympathique le script

Re: [Ex] Surveillance de réponse sur le forum
Posté : mer. 08 févr. 2012 14:16
par mikell
TopXm a écrit :Je t'emprunte quelques idées intéressantes si tu le permets

Pas de problème, c'est là pour ça
TopXm a écrit :
Par contre, si j'ai bien compris la méthode, tu me confirmes bien que seuls les sujets de la 1ere page du "sous-forum" sont suivis, c'est bien ça ? oui
à la longue certains sujets seront "suivis" donc dans le fichier ini alors qu'il sont vieux comme "mes robes", du coup niveau surveillance ça va faire des requests inutiles, non ?
En fait le script "lit" la page mais ne traite réellement que les sujets prédéfinis dans la liste. Si on suit plusieurs sujets de la même page, la page n'est chargée qu'une fois, c'est le traitement par le script qui sera plus long
Pour la surveillance générale, l'astuce c'est de ne surveiller que la date de la réponse la plus récente (le premier item de l'array des sujets), si cette date change (et ça même si le titre du sujet change) il y aura une alerte. Dans ce cas si un sujet vieux de 6 mois est répondu, comme ça le fait passer automatiquement en tête de forum (date de modif la plus récente) il est donc détecté par le script (titre, lien etc) et va être notifié et affiché ^^
Effectivement ton constat est correct, mon but principal a été de pouvoir obtenir le maximum d'alertes avec le minimum de requêtes
Re: [Ex] Surveillance de réponse sur le forum
Posté : mer. 08 févr. 2012 17:58
par Iste
@ZDS : N'oubliez pas que nous somme en AutoIt, aussi vouloir respecter les bonnes pratique de programmation a la lettre, en plus d'etre pas toujours possible, et un peu idiot.
Étant un langage simple et procédural, ce genre de pratiques ont au contraire tendance a rendre le code plus claire !
@mikell : En effet, sa fonction est plus légère, mais es-ce vraiment pertinent de chercher des perf sur un bout de code qui ne s’exécute qu'une foi au lancement, en quelque ms ?
Pour le singleton, je rejoins Tlem, si celle présente dans les UDF de bases est écrite ainsi, c'est pas sans raison.
re @mikell : Quand je veux jeter un coup d’œil a un petit script, oui c'est mieux d'avoir le code sur le fofo, mais pour un aussi gros script, même si bien rangé, c'est quand même plus sympa de dl le .au3 et de l'ouvrir en fichier temps dans scite !
Bref sinon, histoire de dire des trucs un peu plus constructifs, je vous recommande de changer le bout de code qui vérifie l'état de la connexion, car je me retrouve une foi sur deux avec un joli "Pas de connexion internet"
Deja, en soit la boucle est inutile car totalement ignorée au final, ensuite je ne voi pas l'utilité du sleep(100) juste apres, et enfin enfin, je sais que google est une valeur sur, mais il serait plus judicieux de tester la connexion avec le forum que l'on souhaite surveiller !
En effet, il peut être en local ou google peut ne pas répondre, dans tout les cas, on veut juste savoir si on peut communiquer avec lui.
Mais comme un ping n'est pas une valeur sur, il vaudrait surement mieux simplement gérer une exception en cas d’échec de dl de la page.
Bref, c'est qu'un détail, mais j'aimerai vraiment savoir si celle boucle + sleep(100) est utile ^^'
Re: [Ex] Surveillance de réponse sur le forum
Posté : mer. 08 févr. 2012 20:22
par mikell
Iste a écrit : je vous recommande de changer le bout de code qui vérifie l'état de la connexion, car je me retrouve une foi sur deux avec un joli "Pas de connexion internet"
... il serait plus judicieux de tester la connexion avec le forum que l'on souhaite surveiller !
En effet, il peut être en local ou google peut ne pas répondre, dans tout les cas, on veut juste savoir si on peut communiquer avec lui.
Mais comme un ping n'est pas une valeur sur, il vaudrait surement mieux simplement gérer une exception en cas d’échec de dl de la page.
Effectivement, le Sleep(100) ne sert à rien...
En fait (comme la boucle) c'est un résidu qui date de l'époque où je me disais que le mieux était de faire un ping sur autoitscript.fr, où je m'acharnais, mais où j'y ai finalement renoncé parce que j'en avais marre des réponses "Host is offline"

essayez et vous apprécierez...
Pour votre connexion c'est étrange parce que matwachich qui m'a férocement traqué les bugs et qui a une connexion de 512 Ko ne m'a jamais évoqué ce problème
Gérer un échec de dl de la page, ça je le fais en cours de surveillance mais pour un test au lancement du script, je vois pas l'intérêt
Re: [Ex] Surveillance de réponse sur le forum
Posté : mer. 08 févr. 2012 21:17
par matwachich
ça me l'a fait une seul fois, le pas de connexion.
Mais aussi, ces jours-ci, avec la neige et les intempéries (dont on a pas l'habitude!) la connexion est plutôt merdique.