[big tuto] l'autoit des bases jusqu'à votre premier bot

    Publicités

Users Who Are Viewing This Thread (Total: 0, Members: 0, Guests: 0)

drov

V
Feb 27, 2012
1,427
1
944
Bonjour alors j'ai décidé de vous faire un vrai gros joli tuto qui vous prend par la main de " Autoit ? C'est quoi ça ?" à " Voila mon premier bot :)"

on commence par les bases. ( Je me base sur mon expérience personnelle et mon propre parcours)

donc :

Ce lien n'est pas visible, veuillez vous connecter pour l'afficher. Je m'inscris!

de ce tutoriel très bien fait vous allez faire :

- toute la grande partie 1 ( variable , instructions conditionnelles, boucles etc)

vous devez réussir le tp du jeu du plus ou moins.

puis dans la partie de la gui vous allez faire :

- les gui jusqu'à la fin de koda ( franchement vous pouvez vous permettre de survoler un peu les premiers chapitres car koda fais tout pour vous et vous n'avez pas réellement à apprendre la syntaxe. Vous y reviendrez plus tard si le besoin s'en fait ressentir)

- [facultatif] : "un script propre et lisible" c'est pas obligatoire mais intéressant et utile à lire. Mais comme les utilisez "tidy autoit source " dans scite ( partie tool) et cela ce fait tout seul. mais c'est pratique pour comprendre les codes des autres etc. Bref utile mais pas obligatoire

à présent vous pouvez quitter ce tutoriel car le tp sur la cryptographie est inutile et trop compliqué ( oui je ne sais pas ce qu'il fait là :non: )

à présent on quitte le tutoriel. On passe avec moi :salut:

donc on va apprendre à faire des bots simples sur des jeux comme dofus ou en navigateur.

voila les fonctions qui vous seront utiles :

winmove : nous permet de placer la fenêtre comme on veut

winactivate : permet de mettre la fenêtre au premier plan : très pratique

pixelsearch : très très très pratique même indispensable pour les bots de récolte ou autre : il cherche un pixel dans un carré selectionné et ensuite retourne les pos x y de l'élément

mousemove : bouge la souris à des coordonées données

mouseclick : clique à une certaine coordonée

send : simule l'appui de touches au clavier

mousegetpos : retourne la position de la souris, très efficace pour les bots type "clicks pré-enregistrés"

et d'autres fonctions que vous découvrirez par vous même ^^


donc les bases :

un bot c'est bien que la fenêtre chez l'utilisateur est toujours au même endroit

donc un coup de


PHP:
winmove($fenetre,"",0,0,800,600)

et le tour est joué ( j'aime bien 800 600 , c'est petit mais ça a l'avantage de s'adapter à pas mal de résolutions)

à présent on va faire ça sous forme de "que souhaite tu faire ?"

index:

I recherche à l'écran

1: rechercher et cliquer sur un élément

2: verification que un élément change ou pas

II mouvements et simulations diverses

1: toutes les touches du clavier like a boss à la vitesse de l'éclair!

2 : bot combat

3: utiliser les fichiers ini pour ajouter les trajets à votre bot


I : recherche à l'écran


1: rechercher et cliquer sur un élément :



La base de tout les bots pixels !

on commence par gérer notre fenêtre correctement :

PHP:
winmove($fenetre,"",0,0,800,600)
puis on va rechercher le pixel :

PHP:
PixelSearch(0,0,800,600,$couleur)
lire : on recherche dans un carré de x = 0 , y = 0 à x1 = 800 , y1 = 600 la couleur $couleur

"oh mais il détecte pas/ou presque pas!"

c'est normal : configurée ainsi la fonction va rechercher l'exact pixel à l'écran or il suffit que le pixel varie un tout petit peu pour que cela ne soit plus correct

il faut donc faire ainsi :
PHP:
PixelSearch(0,0,800,600,$couleur,1)
ici il cherchera le pixel et les pixel variant de 1 ombre ( possible de mettre de valeurs come 0.5)

pour mes bots sur wakfu j'utilise 1.5

"bon ok je l'ai trouvé mon pixel mais j'en fait quoi ?"

alors on affecte une variable au résultat :
PHP:
$pos = PixelSearch(0,0,800,600,$couleur,1)
et à ce moment là il y a une petite subtilité : il va renvoyer un tableau à 2 cases : $pos[0] et $pos [1]
respectivement : les pos x et y de l'élément trouvé.

on va donc ( enfin) cliquer dessus :

2 solutions :
soit mousemove ($pos[0],$po[1])
puis mouseclick("left")
soit on essaye de rendre le code plus compact ( et on perd moins de temps) :
mouseclick("left",$pos[0],$pos[1])
donc au final :

PHP:
$pos = PixelSearch(0,0,800,600,$couleur,1)
mouseclick("left",$pos[0],$pos[1])
mais attention : que ce passe t'il si le pixelsearch ne trouve rien? et bien il ne mettra pas un tableau dans $pos et mouseclick ne fonctionnera pas
vous l'avez compris : une jolie erreur qui fait planter tout le programme.
comment faire donc ?

c'est là qu'entre "isarray". Démonstration :
PHP:
$pos = PixelSearch(0,0,800,600,$couleur,1)
$test = isarray($pos)

if $test = 1 then
mouseclick("left",$pos[0],$pos[1])

else

msgbox(0,"fail","ehhh non plus rien en vue")

endif
bien sur le tout est à mettre dans une boucle si vous souhaitez qu'il se fasse plus d'une fois :

PHP:
$pos = PixelSearch(0,0,800,600,$couleur,1)
$test = isarray($pos)

while $test = 1

mouseclick("left",$pos[0],$pos[1])
sleep(100) ; toujours un sleep dans une boucle pour ne pas bouffer trop de puissance

$pos = PixelSearch(0,0,800,600,$couleur,1) ; on recherche la valeur
$test = isarray($pos) ; on regarde si on trouve toujours la valeur pour la prochaine fois


Wend

msgbox(0,"fail","a pu!")

et voila :) j'utilise ce genre de code dans les bots et cela ne m'à presque jamais fait défaut :D


2: vérification qu'un élément y est ou pas :


pour cela il existe pixelchecksum mais je ne l'ai jamais aimé car je le trouve trop peu précis et pas maniable ( je ne l'ai pas énormément creusé non plus, libre à vous de l'utiliser si vous trouvez que c'est un excellent outil)

pour cela on va donc utiliser PixelGetColor c'est parti :

moi je m'en sers que très peu. J'ai dans l'idée de m'en servir pour recalibrer le pixelsearch mais c'est encore au stade expérimental

ce pour quoi je m'en sers par contre : vérifier si le personnage à bougé ou non.

je m'explique. au cours de vos bots si vous avancez un peu vous serez amené à quitter le mode "personnage statique" et le faire bouger sur la carte ( exemple pour un bot mineur qui dois se déplacer tout seul dans la mine)

donc voila comment je fais :

PHP:
$check_pos = MouseGetPos() ;1
$check = PixelGetColor($check_pos[0], $check_pos[1]) ;2

ici je récupère la position de la souris ( qui a bougé il y a peu) (1)
puis je récupère le pixel de la position ( 2)

a ce moment là le bot bouge ( c'est plus compliqué mais je simplifie avec un mouseclick)
PHP:
mouseclick("left",$pos[0],$pos[1])
là je génère une autre recherche au même endroit que la première :
PHP:
$check2 = PixelGetColor($check_pos[0], $check_pos[1])

donc : l'idée c'est ça : on récupère un pixel , on bouge le perso , on reprends le pixel au même endroit et là si ce sont les mêmes cela signifiera que le bot n'a pas bougé ;)

puis :


tant que les deux valeurs sont pareilles
PHP:
While $check = $check2
Beep(247) ;on fait un beep pour prévenir l'utilisateur
Sleep(30000) ; on patiente car l'élément perturbateur devrais bouger normalement
MouseClick("left", $pos[0], $pos[1]) ;on reclique pour aller à la position initialement prévue

$check2 = PixelGetColor($check_pos[0], $check_pos[1]); on reteste voir si il a bougé ou pas

WEnd
mais vous pouvez aussi ruser avec pixelsearch en recherchant dans un carré de 1 pixel le pixel qui devrais arriver ( plus utile pour les éléments fixe de l'interface)


et voila la fin de la partie 1 ! avec ces bases vous devriez pouvoir faire un bot récolte sur dofus/wakfu :) ou faire ce que vous avez à faire quoi ^^

II mouvement et simulation

1: toutes les touches du clavier like a boss à la vitesse de l'éclair!


Cette fois ci on va cheater sur un doodle de google , vous savez celui du 100 m haies ?

pour cela on va utiliser la commande "send"

tout simplement :
PHP:
#cs

on met une fonction de sécurité

#ce

func stop()

exit
endfunc

hotkeyset("{END}","stop") ; appelle la fonction stop si on appuie sur la touche "fin"

while 1 ; boucle infinie
 
send("{left}") ; fleche de gauche
send("{right}") ; fleche de droite

Wend
dans la doc ( f1) vous avez toutes les lettres de send ( donc les touches genre control ou alt)

send est très utile pour les bots de flood ;)

exemple :
PHP:
func stop()

exit
endfunc

hotkeyset("{END}","stop")
 $i = 0 ; on initialise un compteur

$msg = inputbox("flood","quel message flood ?") ;ouvre une fenêtre qui demande à l'utilisateur

while $i <= 50 

send($msg) ; on envoie le message ( a supposer que la barre d'envoi soit déjà selectionnée , si non un petit mouseclick s'impose ;)
sleep(100) 
Wend

msgbox(0,"flood","Fini!")


2) bot combat:

C'est le genre de bot qui est très populaire si bien géré*:

alors il est important d'avoir un personnage qui attaque à distance. On va utiliser pixelsearch encore.

Une fonction très très utile c'est: AdlibRegister

cette fonction permet de lancer une autre fonction à une intervalle régulière. On va s'en servir pour vérifie si on est en combat ou pas
PHP:
AdlibRegister(detection,500)
; on lance la fonction détection toutes les 500 millisecondes
donc on fais une fonction détection c'est assez simple*:


PHP:
func detection()
	
$detect_cbm = pixelsearch($couleur_det,0,0,800,600,2)
if isarray($detect_cmb)
call("attack")
endif

endfunc
pour plus de précision on ferais mieux de faire cette recherche sur un carré de pixel très petit ( voire 1 pixel) , à vous de voir

puis faites votre func d'attaque , il vous faudra chercher sur le monstre une couleur visible quel que soit son orientation ( de face etc) utilisez les raccourcis claviers si possible pour lancer l'attaque:
PHP:
func attaque()
;on selectionne l'attaque
$detect_cbm = pixelsearch($couleur_det,0,0,800,600,2) 
while isarray($detect_cmb)
send("{1}")
;on cherche le monstre
$pos_monstre = pixelsearch($couleur_monstre,0,0,800,600,2)
; on clique dessus
mouseclick("left",$pos_monstre[0],$pos_monstre[1])
send("^{w}");on passe le tour
sleep(15000); on attends que le monstre joue
Wend
send("{enter}"); on ferme la fenêtre de loot
endfunc
et mettez donc cela par exemple dans un bot métier et il gérera les aggros dans dofus:)

à partir de ça vous pouvez faire un vrai bot combat;)


3) utiliser les fichiers ini et faire un début de trajet



Un outil très puissant est les fichiers .ini pour cela on va avoir besoin de quelques notions*:

Un fichier .ini se présente ainsi

[section]

clef = valeur
clef2 = valeur
etc

Donc on va utiliser les fonctions liées à l'ini

ex*:


IniRead
IniReadSection
IniReadSectionNames

etc

Cherchez dans la doc, toutes commencent par "ini"


Concrètement un trajet on va dire hum:

[move]
1 = droite
2 = haut
3 = bas
4 = gauche
On l’appellera (trajet.ini)

donc on fait


PHP:
iniread(trajet.ini,move,$key,-1)


Donc $key permettra d'aller plus tard de bouger a l'intérieur du fichier:)

le -1 c'est "si je ne trouve rien je renvoie -1"

Donc on va mettre un petit if pour ajouter une erreur:
PHP:
$trajet = iniread(trajet.ini,move,$key,-1)
if $trajet = -1 then
msgbox(0,"erreur","impossible de reconnaître de .ini ou la clef associée à cette valeur")
exit
endif


Voilà pour l'erreur gérée:) règle n°1: ne jamais faire confiance à l'utilisateur

à présent on va faire le script qui exploite tout ça:p

PHP:
switch $trajet

	case "droite"
	mouseclick(.....);oui bon à vous de gérer le mousemove pour qu'il soit pile poil du bon coté:p

	case "gauche"
	etc
	case bas
	etc
	case haut	
	etc
endswitch

donc:

PHP:
$trajet = iniread(trajet.ini,move,$key,-1)
if $trajet = -1 then 

msgbox(0,"erreur","impossible de reconnaître de .ini ou la clef associée à cette valeur")
 exit
endif

switch $trajet

	case "droite"
	mouseclick(.....);oui bon à vous de gérer le mousemove pour qu'il soit pile poil du bon coté:p

	case "gauche"
	etc
	case bas
	etc
	case haut	
	etc
endswitch


Bon c'est bien tout ça mais on va enchaîner un peu , bien sur notre ami while est là



PHP:
$trajet = iniread(trajet.ini,move,$key,-1)
while $trajet <> -1 
if $trajet = -1 then 

msgbox(0,"erreur","impossible de reconnaître de .ini ou la clef associée à cette valeur")
 exit
endif

switch $trajet

	case "droite"
	mouseclick(.....);oui bon à vous de gérer le mousemove pour qu'il soit pile poil du bon coté:p

	case "gauche"
	etc
	case bas
	etc
	case haut	
	etc
endswitch

$key += 1

Wend

voilà donc là il va parcourir joyeusement le monde de votre jeu

vous pouvez ajouter un petit beep à la fin pour fétêr ça:)

PHP:
beep()
msgbox(0,"bot","fini*!")

voilà quelques pistes d'améliorations que je ne fait pas ici par manque de temps/flemme*:

faites un inireadsection avec un uboud après et ça vous donnera plus ou moins le nombre exact d'actions qu'il y a dans votre .ini

ex:
PHP:
$trajet = IniReadSection($trajetpos, "move");
$trajet_taille = UBound($trajet_dim)
je dis à peu près étant donné que je dois ajouter un:

PHP:
$trajet_taille -= 1
pour avoir le nombre exact, mais cela peut varier suivant les scripts ^^




n'hésitez pas à utiliser un inireadsectionnames:
PHP:
$trajet_type = IniReadSectionNames($trajetpos)
ça range le titre des sections dans un tableau:)

ensuite vous avez vu que j'utilise une variable "$trajetpos" , non je ne n'ai pas rangé préalablementle chemin du fichier ini regardez:
PHP:
[QUOTE]
$trajetpos = FileOpenDialog("Trajet", @ScriptDir, "ini (*.ini)") [/QUOTE]

cela ouvre une fenêtre de choix de fichier avec comme titre "Trajet", elle s'ouvre dans le dossier où se trouve le script et filtre tout les fichiers ne laissant que les .ini:3 assez pratique vous en conviendrez x)

vous pouvez combiner ça avec une autre partie du tuto pour faire par exemple qu'il aille de la banque à un champ puis une fois à destination ajoutez un call("fonction_recolter")


je vous expliquerais comment faire un créateur de trajet précis plus tard ainsi que un trajet qui va à des positions précises et qui plus est qui va se déplacer sur une map et parfois se déplacer parfois récolter des ressources.

postez ce que vous aimeriez savoir ou explorer ;)
 
Last edited:

Cyrion

._.
V
Ancien staff
Jul 8, 2010
2,524
2
944
www.bufferoverflow.fr
1- Pixelsearch renvoie un tableau 2 dimensions.
2- Je comprend pas trop truc pour vérifier si ton personnage a bouger si tu as commencé au début à parler de bot fauche (J'imagine).
3- Essaie d'expliquer plus en détail comment faire chacun des sortes de bots.
 

romain1

Nouveau membre
Sep 15, 2012
3
0
201
Coucou, comme demander je post mon problème sur ton sujet.!

Mon soucis est pour la création du script lorsqu'on l'édite, quand je fait éditer il me dit, un message d'erreur, j'ai donc besoin de toi pour régler ce petit soucis, et si tu pouvais m'aider a réaliser le pixel search pour une map de poisson vers le temple feca ( qui les inclus tous ) ainsi que le code à rentrer pour qu'il utilise la 3em attaque dans la barre des sorts lorsqu'il y a une agro par un devoreur.

Merci d'avance
 

drov

V
Feb 27, 2012
1,427
1
944
Je n'ai pas saisi ce que tu entend par "le script lorsqu’on edite"mais j'ai compris ton problème. Pour la recherche de poisson je te suggère des mouseclick prédéfinis étant donné que il y a une très grosse ressemblance entre l'eau et les poissons

pour la gestion d'aggro c'est une autre paire de manches au point que j'ajouterais une partie dans mon tuto exprès
 

ced5959

Membre
Aug 23, 2011
15
0
301
Bonjour bon ben ... J'ai un probleme des le début (placement de la fenêtre ) Avec un bloc note sa marche mais avec la fenetre dofus de se replace pas... Merci de ta reponce...

---------- Message ajouté à 16h28 ---------- Le message précédent était à 16h27 ----------

J'ai utiliser le code suivant


$fenetre = InputBox("Petit bot", "Indiquer le nom de votre personnage")
winmove($fenetre,"",0,0,800,600)

---------- Message ajouté à 16h43 ---------- Le message précédent était à 16h28 ----------

Bonjour alors voici mon probléme !
$fenetre = InputBox("Test", "Indiquer le nom de votre personnage")
Sleep(10)
WinActivate($fenetre)
Sleep(10)
winmove($fenetre,"",0,0,800,600)

Le code la a l'aire bon mais ne marche pas avec les pages dofus..Mais avec n'importe quelle autre programme il fonctionne la fonction qui ne marche pas et winmove aurais tu une explication?..
 

drov

V
Feb 27, 2012
1,427
1
944
étrange j'ai déjà utilisé cette fonction pour dofus... Essaye en mode admin ( ajoute #requireadmin au début)
 

ced5959

Membre
Aug 23, 2011
15
0
301
Ok merci j'essaye des ce soir je t'informe de mon évolution ! Tres jolie tuto et encore mercie du partage !
 

gioanispqr

Membre
Oct 29, 2011
9
0
306
Bonjour bon ben ... J'ai un probleme des le début (placement de la fenêtre ) Avec un bloc note sa marche mais avec la fenetre dofus de se replace pas... Merci de ta reponce...

---------- Message ajouté à 16h28 ---------- Le message précédent était à 16h27 ----------

J'ai utiliser le code suivant


$fenetre = InputBox("Petit bot", "Indiquer le nom de votre personnage")
winmove($fenetre,"",0,0,800,600)

---------- Message ajouté à 16h43 ---------- Le message précédent était à 16h28 ----------

Bonjour alors voici mon probléme !
$fenetre = InputBox("Test", "Indiquer le nom de votre personnage")
Sleep(10)
WinActivate($fenetre)
Sleep(10)
winmove($fenetre,"",0,0,800,600)

Le code la a l'aire bon mais ne marche pas avec les pages dofus..Mais avec n'importe quelle autre programme il fonctionne la fonction qui ne marche pas et winmove aurais tu une explication?..



Désolé de la réponse un peu tardive mais j'ai chercher la raison car ça m'est arrivé il suffit de faire executer le script en mode admin en ajoutant : #RequireAdmin au debut de ton script ou en lancant ton script en tant qu'administrateur !$

Gabriiel
 
May 29, 2012
773
1
924
28
Met des couleurs , souligne les titres que sa sois plus agréable à lire.

Mais bon tutorial.
 

Zeles37

Nouveau membre
Aug 4, 2011
1
0
301
Bonjour / Bonsoir ^^
Voilà j'ai voulut me servir de ton tuto pour crée un petit bot pour un nouveau jeu par navigation mais je ne m'en sort pas '-'. Il faudrait juste qu'il clique sur deux bouton quand le 1er apparaît pour lancer un simple mode Up. Donc si tu avez deux-trois conseil je suit toute ouïe ^^ ( je m'et l'image des boutons voulut)

1395196225-dkszuh.jpg
 

Nociif

2b || !2b
V
Sep 23, 2011
2,607
4
944
push location
Discord
Nociif#5969
Salut Zeles37, pour répondre à ton problème voici comment tu peux procéder:

-Utiliser un GetPixelColor pour vérifier si ton bouton est apparue
-Utiliser MouseClick pour cliquer sur ton premier bouton puis pour le second.

En espérant t'avoir aider.
 

xDM3n

Membre actif
Mar 28, 2010
364
0
581
In a galaxy far, far away ...

Je fais ici un joli déterrage, j'en ai conscience mais je pense que ma question sera constructive. :hein:

Je n'ai toujours pas compris cette histoire de tableaux, j'apprend sur OpenClassrooms qui ont toujours de magnifiques tutos en programmation, mais je suis bloqué a cette partie, si quelqu'un pouvait m'expliquer vite fait, voir me faire un tuto et des exercices d'applications (j'en demande beaucoup je sais :hap:) je lui en serais reconnaissant. :)

Par MP ou même ici, voir sur Skype si vous voulez me contacter :copain:

J'allais oublier, voici le lien de la ou j'en suis bloqué sur OC: Ce lien n'est pas visible, veuillez vous connecter pour l'afficher. Je m'inscris!

Voila voila, merci :hap:
 

Evaelis

La Voix de la Sagesse
V
Ancien staff
Apr 28, 2010
22,949
468
1,699
Valhalla
En gros
Tu as ta variable :
Variable :
- X
- Y

Avec deux "sous variable" on va dire.

Tu pourrais rendre ça sous forme de tableau :
7YCQu.png


Si ça peut t'aider à te représenter les array ^^

Ensuite ça peut aussi finir comme ça :
7YD6q.png
 

xDM3n

Membre actif
Mar 28, 2010
364
0
581
In a galaxy far, far away ...
En fait c'est juste un outil pour déclarer pleins de variables en meme temps pour pas être emmerdé par la suite c'est ça ?

Quand on dis qu'il y a plusieurs dimensions c'est que y'a plusieurs lignes a ce tableau ?

J'ai pas bien compris l'utilité de sous variables ?

Beaucoup de questions je sais ^•^

Merci :)
 

Evaelis

La Voix de la Sagesse
V
Ancien staff
Apr 28, 2010
22,949
468
1,699
Valhalla
L'utilité de "sous-variables" comme tu dis c'est :
1) avoir un truc clair
2) La possibilité de gérer un nombre illimité de case
Exemple du 2)
Tu as des variables tu dois déclarer Var1 var2 var3
Alors que avec un array du declare Var et tu append chaque variable
 

xDM3n

Membre actif
Mar 28, 2010
364
0
581
In a galaxy far, far away ...
Je comprend toujours pas :/

Peut être un exemple en C si c'est possible je comprendras un peu mieux je pense ^^

En tout cas merci de m'aider ^^
Je voudrais créer un bot sur Rose Online donc je m'accroche :)
 
May 23, 2013
508
0
322
'merica
Code:
 char tableau[10] = {'B','o','n','j','o','u','r','\0'};
Tableau de caractères

Code:
char b = tableau[0];
char o = tableau[1];
char n = tableau[2];
...
 
Mar 30, 2011
1,014
1
944
In Your Ass
si tu fait du C alors sache qu un tableau c est juste un pointeur .

et sinon l exemple d OCR reste tres parlant
Code:
  $Array[5] = [8, 4, 5, 9, 1]


$Array c est le nom du tableau [5] c est sa taille (5 places)

et le = [8, 4, 5, 9, 1] c est les valeurs qui le peuple

pour sortir une valeur d un tableau tu l appel par son nom et sa place

si je veut le 9 par exemple je ferais

Code:
$valeur=$Array[3]

et c est bien 3 pas 4 , un tableau commence a 0 pas a 1
 

xDM3n

Membre actif
Mar 28, 2010
364
0
581
In a galaxy far, far away ...
Je commence a comprendre, c'est comme une boite ou on stocke toutes nos variables en fait ?

Au lieu de déclarer variableA, variableB, variableC une après l'autre on déclaré tout en un seul coup ?