Python Présentation d'un bot atypique

Inscrit
27 Septembre 2016
Messages
3
Reactions
3
#21
- La partie détection de map : j'ai la position de la map en haut à gauche de l'écran. Mais Tesseract galère sur certaines maps (et ça me met en rogne, pardonnez l'expression). Avec ton idée de copier la pos dans le presse papier, je me suis dit… Pourquoi pas demander à mon personnage de me donner lui-même sa pos: %pos% dans le chat ? Sinon, j'ai pensé à train avec du ML mais ça me semble beaucoup de temps pour pas grand chose.
Passé la partie présentation des problèmes que l'on peut rencontrer pour son algorithme de CaT.
Personnellement, pour récupérer la position de mon personnage, je déplaçais mon curseur au milieu de ma minimap et je faisais de la reconnaissance d'image pour récupérer les coordonnées (ce qui m'évite ainsi d'écrire %pos% dans le chat à chaque fois, (j'avais eu la même idée à la base :D)

- Je n'ai pas compris la partie: "". Je n'ai pas compris ce que sont ces /clear et /travel. Peut-être ai-je loupé quelque chose. N'hésitez pas à me dire que oui, si c'est le cas (mais gentiment, hein?!).
Pour la partie /travel et /clear, la première est une commande à écrire dans le chat sous la forme "/travel -14 12" et qui lancera le voyage automatique vers cette carte (si tu as une monture autoguidée) :)
La commande /clear permet juste de vider la fenêtre de chat
De quoi régler ton pb de carte difficile d'accès :)


Pour la récupération d'indices, moi je me suis basé sur plusieurs sites, l'un où j'ai récupérer tous les indices dans le code source HTML, que j'ai stocké en local, et un autre site où j'utilise uniquement son API publique...
 
Inscrit
6 Decembre 2020
Messages
21
Reactions
5
#22
Merci Ayyy pour tes réponses.

J'ai compris à présent pour les commandes /clear et /travel. Merci, et ça me donne des idées. En plus, je ne savais pas que les montures autoguidée se commandaient ainsi.

De quoi régler ton pb de carte difficile d'accès
Je ne comprends pas en quoi ça m'aide à accéder aux maps difficiles d'accès (si tu parles des maps comme le temps Sram). :/
Ah si! Il faudrait que j'achète une monture autoguidée, non?

Personnellement, pour récupérer la position de mon personnage, je déplaçais mon curseur au milieu de ma minimap et je faisais de la reconnaissance d'image pour récupérer les coordonnées.
J'imagine que tu désactivais tous les symboles sur les cartes, non? (sinon les HDV et tavernes gênent dans les villes) Il faut alors juste trouver la pos qui apparait en blanc sur noir et c'est beaucoup plus facile pour Tesseract que la valeur de map en haut à gauche, je me trompe? (Ah moins que tu ne parles pas de récupérer les coordonnées avec du ML (comme Tesseract), mais autre chose, et dans ce cas là, je ne vois pas).

Pour la récupération d'indices, moi je me suis basé sur plusieurs sites, l'un où j'ai récupérer tous les indices dans le code source HTML, que j'ai stocké en local, et un autre site où j'utilise uniquement son API publique...
Si je comprends, tu utilisais le site en même temps que ton personnage avançait IG. Et c'est ce que je fais aussi. Je n'ai que la liste de tous les noms des indices possibles en local. Hors, ce que dis valchimiiste, c'est qu'il a TOUT téléchargé en local. Donc il n'a pas besoin de récupérer les déplacements à effectuer pour avancer dans sa CaT sur un site en même temps que son personnage avance parce que les déplacements sont en local aussi. Ca doit être possible, mais j'ai pas d'idée génie pour le faire.

Bisous :*
 
Inscrit
1 Juin 2020
Messages
43
Reactions
29
#23
Que pensez-vous de demander à mon personnage sa pos dans le chat? (%pos%) Je trouverais personnellement le comportement clairement suspicieux si je voyais cela. Je fais déjà de la modification d'image (OpenCV) pour ne pas demander à Tesseract de deviner des choses trop compliquées, mais ça ne fonctionne pas à tous les coups. En sniffant les données, cela pourrait marcher plus facilement?
C'est hilarant de lire ça. Comme quoi les memes idées viennent a tout le monde haha. A une époque je faisais effectivement ça. Je %pos% dans le chat et je le faisais copiercoller la position après avoir /clear le chat. Comme ça il sait ou il est précisément. Cependant je te conseille vraiment très fortement de tyryhard l'interprétation de paquets. Tu en tirereas bien plus d'efficacité. Par "peur" au début on se lance pas mais depuis que je sais interpréter des paquets et que j'ai codé un truc qui permet somehow de lire des paquets, tu obtiens tout mieux, et plus vite. C'est tout benef. Avec les paquets tu peux track ta position en permanence , et c'est bien mieux .

J'ai aimé la partie de stockage de donnée en local (cf. valchimiiste). J'ai essayé de tout stocker, mais je n'ai pas (encore) trouvé comment. Je pensais tout stocker dans un nested dictionary et cela dans un Json (pourquoi? je ne sais pas…). Le format du fichier est-il important?
Je stocke tout en txt et ça va INSANEMENT vite. Exemple simple : ma base de données d'indices fait a peu pres 38 000 lignes. Chaque ligne est un tuple avec ( "nomIndice", x, y). Il faut au programme < 1s pour tout charger. L'extension n'a ( pour moi ) aucune importance si tu n'utilises pas de lib qui bosse avec des fichiers spécifiques.


Pour la partie détection du perso et du monstre grâce aux 'pixels discriminants de mon perso' (cf. valchimiiste). Je comprend l'idée, valchimiiste. Mais je me pose la question des outils… Est-ce que c'est une méthode à la 'bourrin'? Si tu as le temps, et l'envi de poster un article qui t'as donné l'idée? Ou une aide? Un indice? Pour l'anecdote, j'ai longtemps cherché à trouvé une méthode me permettant de détecter un objet partiellement caché, et ce jusqu'à utiliser du ML (j'adore ça, le ML). Mais manque de datas (I guess), mes apprentissages ne marchaient pas aussi bien que je le souhaitais.
Alors. Je peux essayer de détailler un peu. En gros ce que j'ai fais, c'est que j'ai d'abord manuellement screenshot, dans un combat, en mode tactique, toutes les directions de mon personnage et toutes les directions de l'ennemi. J'ai donc eu 8 fichiers image. 4 de l'ennemi et 4 du mien. Ensuite j'ai screenshot juste une partie du terrain en prenant bien soin de faire en sorte d'y voir des obstacles, des endroits vides qui puissent servir de témoin.

Ensuite j'ai fais un soft qui met dans un set tous les pixels de chacune des images. Ca évite d'avoir plusieurs fois la meme couleur de pixels.

Je me retrouve donc avec 3 Set() de tous les différents pixels qui composent mon perso, l'ennemi, et des cases vides. Sauf que comme j'ai pas fais de découpage des persos ou de l'ennemi, j'ai aussi dans leurs sets, les pixels des cases sur lesquels ils sont posés ou de l'environnement.

Arrive donc la dernière partie ou j'élimine des sets Perso et Ennemi, tous les pixels en commun avec le set de pixel témoin ou j'avais screenshot un endroit vide du terrain. J'obtiens donc 2 sets de pixels dont les pixels sont caractéristiques et spécifiques, du perso et de l'ennemi. Ensuite en combat, je fais une analyse de 40x40 sur chaque case du terrain et je compte les pixels en commun avec l'un ou l'autre , perso ou ennemi. A la fin de la boucle, l'endroit qui a le plus de pixels communs avec le pixelSet du perso est ...la case ou est mon perso et pareil pour l'ennemi ;) .. En espérant que ce soit clair miantenant :)


". Je n'ai pas compris ce que sont ces /clear et /travel. Peut-être ai-je loupé quelque chose. N'hésitez pas à me dire que oui, si c'est le cas (mais gentiment, hein?!).
En gros j'utilisais la dd autopilotée. "/travel 2 3 " permet par exemple de faire un voyage autopilot vers (2,3). Je screenshotais le chat en boucle a la recherche du "Vous etes arrivé a destination". Donc je "/clear" pour clean le chat des messages précédents, puis je "/travel x y" . Quand je suis arrivé il analyse le "Vous etes arrivé a destination" et sais donc qu'on est arrivé. A l'époque .. avec les paquets tout ça est devenu obstolète..

, ce que tu veux dire par "cutoffs de détection". J'imagine que c'est en rapport avec la détection par Computer Vision. Une précision?
En gros ca c'est a "tatons". j'ai codé une fonction IsImgOnScreen() qui renvoie le % de vraissemblance que ce que je cherche soit présent. Mais quand la chose est effectivement la on n'est pas a 100%.. Il renvoie 94 ou 96 en fonction de la qualité du découpage et du screenshot. Choisir les bons cutoffs c'est faire en sorte que cette fonction ne me dise pas que l'image est la alors que non, ou qu'elle me dise que l'image n'est pas la alors que oui . :)

Pour les indices, j'ai juste codé un scraper ( qui a du bouclé jcrois pendant 2-3h au total ) qui fait en boucle des requetes sur toutes les maps, et toutes les directions possibles, avec un petit timeout, et qui stockait ça dans un set() ( pour éviter les redondances ) et ensuite jlai fais l'écrire dans un fichier texte. L'avantage colossal d'avoir sa propre BDD c'est de pouvoir ajouter les indices qui manquent par exemple ;)
 
Dernière édition:
Inscrit
6 Decembre 2020
Messages
21
Reactions
5
#24
Merci valchimiiste pour ces précisions!

1) Effectivement, j'ai peur de me lancer dans la lecture de paquets. Et je sais que ça doit être génial, mais je veux finir de coder "correctement" (only Computer Vision) ce que je fais pour l'instant avant de "changer" de registre (Je veux voir si je peux arriver au bout de ce que je veux faire sans lire de paquets pour l'instant). Mais une fois cela fait, je compte bien m'y lancer, et utiliser ce forum pour ça. J'ai regardé déjà quelques trucs, mais je ne comprends que très peu de ce que je lis, et j'ai peur de recevoir des réponses du style: "T'as pas assez bien regardé partout sur internet". Et en plus, ça serait le cas. x) Je préfère donc attendre…

2) J'ai opté pour un dict pour éviter les redondances de clé. Je vais essayer de tout récupérer bientôt.

3) Je pense avoir bien compris ton idée et explication! Merchii!

4) monture autopilotée, Ayyy m'a donné la réponse juste avant… Je n'y avais pas pensé… puisque je n'en ai pas et n'en ai jamais utilisé une. Sinon, sans ça, je pense qu'en sauvegardant toutes les maps impraticables, on doit pouvoir utiliser A* pour faire la même chose que la monture autopilotée… Mais ça demande du temps pour récupérer les datas. Même chose pour les paquets, je n'en suis pas encore là :/ (je demanderai un cours privé quand je me sentirai prêt x) ).

5) Alors, moi je fais avec du Computer Vision "basique" et ça marche bien sans modifier l'image de la map (mais ma fenêtre est pas en 800x'je sais pas quoi mais petit'). Je fais bouger la souris dessus pour vérifier que ce soit bien une taupe (je détecte le nom de la taupe ou non). Seul problème : quand elle est trop proche des côtés de la map, ça marche pas/pas bien. Mais ça doit pouvoir s'améliorer…

6) J'avais pas imaginé le fait de stocker toutes les datas (enfin si, mais pas pensé que ça serait possible et si rapide). C'est chose faite grâce à toi et j'ai bien compris les avantages que cela représente ;)

Bisous :*
 
Inscrit
3 Octobre 2019
Messages
3
Reactions
0
#25
Déjà félicitation pour ton projet, je me suis aussi amusé a commencé un projet python du genre pour voir si c'était réalisable et j'ai utilisé par ailleurs a peu près les même méthode que toi.

Niveau libs je suis directement partis sur du :
- OpenCv (là pour améliorer les résultat je traite un peu l'image a la volé)
- PyAutoit (bon là pour écrire du text simplement "{Enter} mon text " dans un control_send, et control_click pour les cliques
- Tesseract (j'ai test easyocr mais la libs pose soucis sous windows)


Pour les combats je suis en revanche bien plus bloqué que toi, déjà rien que pour modéliser la map sour forme matriciel je trouve cela compliqué même si actuellement j'ai une solution pour cela j'ai besoin de connaitre le nombre de losange par ligne/collonne chose que je ne connais pas car dans certain cas cela change là j'aurais aimer savoir comment obtenir ce genre d'info par moi même mais je suis paumé. Si tu as des liens Valchiimiste expliquant un peut comment comment faire pour comprendre les protocoles dofus ou faut regarder dans les fichiers du jeu pour avoir les infos etc... franchement je serais bien preneur. Mon objectif c'est pas de faire un bot 100% socket mais juste de récupérer des infos via la lecture des paquets et fichiers du jeu pour faire mon petit bot clique en mode bot hybride.


Pour la bdd des indices franchement j'y avais pas pensé je pense que je vais faire comme toi et la récupérer c'est pas bien compliqué a faire et ça permettrais d'être un peu plus tranquille de ce point de vue là.

Edit :
J'ai récupérer la petite bdd des indices et corréler avec le nom des indices pour la mettre en json déjà, bon c'est assez long. D'un côté c'est pratique vu que cela permet de s'affranchir du site genre si dans le futur il ferme, et d'un autre ça prend mine de rien un temps relativement long même si j'ai utilisé uniquement des requêtes http plutôt que selenium.

Pour les maps dofus j'explore les pistes des fichiers d2o, d2p, d2i :
2.0 - Bot Chasses au Trésor et maps bloquantes | Cadernis - Communauté de passionnés en informatique
Vu qu'un des commentaires semblent expliqué que les infos se trouve dans les fichiers d2p mais là ça va me prendre un certain moment je pense parce que j'aimerais réussir a comprendre la logique en regardant le code de dofus pour pouvoir mettre a jour ma solution dans le futur. Si j'arrive a une solution, je serais curieux de savoir comment tu t'y es pris valchiimiste a ce sujet si tu as moyen d'expliqué en mp ou discord vocal comment ça marche en attendant je vais continuer d'explorer le forum en quête de piste

et pour rebondir sur cv.matchTemplate() je pense pas que ça fonctionne en niveau de gris c'est l'exemple de la doc :
OpenCV: Template Matching
img_gray = cv.cvtColor(img_rgb, cv.COLOR_BGR2GRAY)
template = cv.imread('mario_coin.png',0)

mais ça marcherais aussi avec
img_gray = cv.imread('mario.png', cv.IMREAD_UNCHANGED)
template = cv.imread('mario_coin.png', cv.IMREAD_UNCHANGED)
il me semble qu'il faut que les data a comparé soit juste dans le même format pour opencv et dans la doc j'ai l'impression que les 2 sont convertis en niveau de gris pour que le process aille plus vite par la suite
 
Dernière édition:
Inscrit
7 Octobre 2019
Messages
13
Reactions
1
#26
3 - Arriver sur la map de départ

Si on ignore les étapes assez simples pour arriver dans la malle, l'obtention de la map de départ se fait elle aussi en capture d'image. Après avoir standardisé la position de la map ( via un dézoom et un recadrage pour etre sur de voir a la fois B0nTA et Brak ) j'ai fais un template matching avec openCV pour rechercher le jalon de départ. Un shift clic et la position se retrouve dans mon chat que je vais copier coller ( via postMessage ) . J'analyse ensuite mon presse papier pour connaitre X et Y. Ensuite via une List de tuple contenant le nom, et les coordonnées de tous les zaaps du jeu, je crée un MinHeap dans lequel j'enregistre la différence de maps entre la map de départ et la position pour savoir quel est le zaap le plus proche. Une fois ceci fait , HavreSac > Zaap > Clic > Entrée du nom de ce zaap le plus proche. Par la suite un "/clear" et un "/travel X Y" me permettent alors d'arriver sur la map de départ. ( Le /clear sert a détecter le message m'indiquant etre arrivé )
Oh !! C'est exactement ce que je cherchais. Thanks !
 
Inscrit
24 Mai 2021
Messages
2
Reactions
0
#27
Hello !

Super projet, tu me donnes envie de m'y remettre, après quelques essais infructueux ou décevant avec PyAutoGui
Je voudrais en effet profiter un maximum de AutoIt pour que mes actions soient le plus semblables possible à celles d'un humain
Mais je pense en te lisant qu'il faut aussi profiter au maximum des requêtes, au moins pour obtenir des informations sur le Client autrement que par analyse d'image.

J'aurais 2 petites questions pour commencer :
  • Je n'arrive pas à utiliser autoit en Python cependant ...
Donc pour l'instant je vais commencer à programmer dans l'IDE AutoIt même

Si ça vous est arrivé, mon erreur est :
OSError: Cannot load AutoItX from path: c:\users\[moi]\anaconda3\lib\site-packages\autoit\lib\AutoItX3_x64.dll

Mais je n'ai pas de fichier lib dans c:\users\[moi]\anaconda3\lib\site-packages\autoit ...
  • Je ne sais pas du tout comment intercepter les requêtes, ni comment les analyser.
Est-ce que vous sauriez m'indiquer par où je pourrais commencer ? J'ai vu passer plusieurs fois les travaux de LaBot, mais je n'ai aucune idée de comment mettre ça en place


Merci d'avance :)
Par curiosité, valchimiiste tu en es où de ton projet ? Tu le considères fini ?
 
Inscrit
10 Juin 2016
Messages
2
Reactions
4
#28
Hello,

Concernant l'interception des requêtes en Python, je pense que tu peut te diriger vers Scapy -> https://scapy.net/
Pour l'analyse, je crois qu'il y a plusieurs posts qui traitent de ce sujet :)

Concernant ton souci de dll, peut etre que ça t'aidera -> stack
 
Haut Bas