Python [Python] Bot socket ?

Inscrit
15 Janvier 2016
Messages
21
Reactions
1
#1
Bonsoir,

Une connaissance ayant codé son propre bot m'a redirigé vers ce site afin d'en apprendre plus sur les protocoles etc... de Dofus.
Y a-t'il un tutoriel afin d'expliquer les ressources à avoir, la manière générale de concevoir son bot ?

Je ne gère que le Python et qu'un peu de C (je ne suis pas un pro) d'où mon inscription dans ce channel.

Je n'ai pas besoin de GUI, simplement d'automatiser des tâches et pour cela j'aimerais avoir à disposition toutes les ressources possibles même si vous me renvoyez vers du rtfm (Read The Fucking Manual).

Est-il possible de faire ce que le .net a permis de faire, en Python ? Si oui, par où commencer ?

Bien à vous,

Skurra.
 
Inscrit
15 Mai 2015
Messages
41
Reactions
0
#2
Salut jokoast,

théoriquement tu peux faire la même chose en python qu'en .net. La différence sera peut être la manière de penser ton programme, sa forme.
Pour débuter tu devrais regarder comment utiliser les sockets en python et comment Dofus gère ses paquets. Il y a un très bon tuto de Labo qui m'a bien aidé pour commencer : viewtopic.php?f=25&t=1523
Ensuite à toi de faire des tests sur les serveurs d'Ankama pour avancer. Si tu ne l'as pas déjà, je te conseil d'utiliser JPEXS Decompiler pour accéder aux sources du jeu.
 

Labo

Membre Actif
Inscrit
16 Aout 2013
Messages
799
Reactions
15
#3
Oui, tu peux faire la même chose, et surtout tu as l'avantage d'un langage qui a une REPL : tu peux développer et tester ton code en même temps.

En gros, tu as une partie de communication avec le serveur, qui est la plus rapide à faire, une partie de traduction du protocole, et pour cela il est mieux de faire un traducteur de sources une fois qu'on a compris comment le client fonctionne (je te renvoie mon tuto cité par mon VDD), et après le bot en lui-même, mais c'est sûrement le plus stimulant à faire (tu vois le résultat au fur et à mesure).
 
Inscrit
15 Janvier 2016
Messages
21
Reactions
1
#4
Super, je vois que vous êtes réactifs et que vous savez de quoi vous parlez, c'est motivant. Je vais tenter l'expérience sur mon temps libre et déjà voir ce que j'arrive à faire.
Je vous remercie.

Dans quelle catégorie est le tutoriel de Labo ? Je n'ai pas accès à cette catégorie :).

Cdt,

Skurra.
 

Labo

Membre Actif
Inscrit
16 Aout 2013
Messages
799
Reactions
15
#5
Analyse
Faudra vraiment refondre le système des catégories...
 
Inscrit
15 Janvier 2016
Messages
21
Reactions
1
#6
Avec un id logique j'aurais pu le retrouver mais là, je voyais vraiment pas :D.

Je te remercie.
 
Inscrit
27 Juin 2012
Messages
238
Reactions
0
#7
Tu as tous les tutoriels de Labo dans sa signature, c'est dans la partie Apprentissage, et pour accéder à cette catégorie (si tu ne l'as pas) il faut s'abonner à cette catégorie dans tes abonnements sur ton profil.
 

Labo

Membre Actif
Inscrit
16 Aout 2013
Messages
799
Reactions
15
#8
Il y a analyse dans le titre.
 
Inscrit
15 Janvier 2016
Messages
21
Reactions
1
#9
J'vous remercie, j'avais compris où le trouver et vu que j'me suis inscris à cette catégorie (Python) il m'a été simple de deviner que la démarche était semblable pour m'abonner à la catégorie Analyse :).

J'vais regarder ça de plus près.

EDIT : Mon dieu j'ai manqué de me taper la honte --'. Wireshark catch aussi les trames des couches supérieurs j'allais vous demander pourquoi mes paquets eux commencent par b8 26 :o. Bref, juste vous dire que vous ne m'avez pas aidé en vain, je lis tout ça et suis à fond dedans. DofusInvoker.swf décompilé (sympas le tool), j'ai utilisé ton IDs.py (juste viré pickle et mis json afin d'avoir un format de sortie fichier à peu près lisible) du coup voilà où j'en suis :).

EDIT2 : L'authentification serveur est gérée par DofusInvoker.swf ? :o

EDIT3 :
Code:
def dumpIds(path='./Ids'):
    createIds()
    f = open(path, 'w')
    f.write(json.dumps(sorted(dictIds.items(), key=operator.itemgetter(0))).replace('],',"],\n"))
Pour avoir une sortie triée si on se fiche de pouvoir le réimporter. (le replace c'est juste pour sauter une ligne)

Sinon pour le moment j'ai choppé une trame "HelloConnectMessage" :p.
 

Labo

Membre Actif
Inscrit
16 Aout 2013
Messages
799
Reactions
15
#10
Oui, c'est vrai qu'à l'époque j'utilisais pas assez json :'( En plus mon code était assez moche à l'époque…
Sinon tu peux avoir les bonnes trames en sélectionnant la trame "data“.

Tu peux également éviter des sorted et operators avec l'option sort_keys = True de dumps.
Et puis pour le coup json c'est OP et replace c'est pas très propre.

Je propose :
Code:
def dumpIds(path='./Ids'):
    createIds()
    with open(path, 'w') as f:
        for id, name in sorted(dictIds.items()):
            f.write('{} -> {}\n'.format(id, name))
 
Dernière édition par un modérateur:
Inscrit
15 Janvier 2016
Messages
21
Reactions
1
#11
Ouais je vois :)
Ton code est purement libre ? Possible de le réutiliser dans un projet, j'te prendrais bien la génération du dictionnaire afin d'identifier les paquets par leur nom quand j'lui rentrerai des packets data de Wireshark.
Du coup oui, j'ai pris le suivi de trame TCP directement en hexa et j'l'ai mis dans un fichier.

EDIT :
[NOTICE] (951, 'GameMapMovementMessage')
[NOTICE] (950, 'GameMapMovementRequestMessage')
[NOTICE] (6362, 'BasicAckMessage')
[NOTICE] (952, 'GameMapMovementConfirmMessage')
[NOTICE] (6362, 'BasicAckMessage')
[NOTICE] (950, 'GameMapMovementRequestMessage')
[NOTICE] (6362, 'BasicAckMessage')
[NOTICE] (952, 'GameMapMovementConfirmMessage')
[NOTICE] (6362, 'BasicAckMessage')
[NOTICE] (221, 'ChangeMapMessage')
[NOTICE] (6362, 'BasicAckMessage')
[NOTICE] (225, 'MapInformationsRequestMessage')
[NOTICE] (6362, 'BasicAckMessage')
[NOTICE] (226, 'MapComplementaryInformationsDataMessage')
J'ai intégré la génération du dictionnaire et la récupération de l'id dans les trames, ça m'donne ça.
J'vais essayer de me concentrer sur l'authentification et la connexion pour commencer par là. (si j'arrive à me connecter je pourrais tester la récupération des IDs à plus grande échelle (comme ça j'ajoute les handlers au fur et à mesure que j'en croise)
 

Labo

Membre Actif
Inscrit
16 Aout 2013
Messages
799
Reactions
15
#12
Regarde le footer : "Tous les scripts et tutoriels by Cadernis est mis à disposition selon les termes de la licence Creative Commons Paternité-Pas d'Utilisation Commerciale-Pas de Modification 2.0 France."
Sinon mes codes postés sur des forums sont sous license http://www.wtfpl.net/

Bien joué !
 
Inscrit
15 Janvier 2016
Messages
21
Reactions
1
#13
Ah du coup j'vais le refaire à la main parce que je dois le modifier et c'est pour un projet, j'voudrais pas causer du tort à un bon samaritain.
Je vais aussi binder un sniffer en MITM pour pouvoir automatiser le traitement des paquets (pouvoir tester par la suite directement mes méthodes de traitement des paquets) cependant lorsque j'écoute avec Wireshark, impossible de trouver le DNS auquel on fait la requête pour obtenir le serveur d'auth même après un flush de mes DNS locaux.
J'arrive bien à trouver les nom de domaine des serveurs de jeu : lb10 et compagnie mais pas le serveur d'auth.
Un peu d'aide ? :)

EDIT :
J'ai plusieurs valeurs qui ressortent mais quand je les ping, aucune correspond à l'ip que j'ai dans mes trames de connexion.
Nom(s) de domaine trouvé(s) :
a337.w7.akamai.net et ankama.com.edgesuite.net , même IP par exemple
 

Sorrow

Membre Actif
Inscrit
5 Mai 2012
Messages
376
Reactions
26
#14
Ankama n'utilise pas de nom de domaine pour la connexion vers l'auth ou le world.
Ils utilisent directement des IPs, que tu trouveras dans config.xml pour l'auth.
Pour le world, celle-ci t'es envoyer quand tu a choisit ton serveur de jeu.
 
Inscrit
15 Janvier 2016
Messages
21
Reactions
1
#15
Je te remercie, j'ai eu la réponse dans un autre post.
Sinon, une librairie pour traiter les objets résultant de l'utilisation de bin() ?
Parce que les binaires sont gérés comme des strings sous Python3.x et je cherche un moyen cpuless de faire des traitement sur les binaires.
 
Inscrit
15 Janvier 2016
Messages
21
Reactions
1
#16
Je vous remercie, je reviendrais à l'occasion voir si mon tuto a été posté ou peut-être avant ça quand j'aurais besoin d'aide :).

(@Labo : Découpage des paquets englobant plusieurs paquets fait. Je catch une erreur de temps en temps ça doit être les paquets qui sont découpés, je vais implémenter le buffer sous peu puis après j'm'attaquerai aux handlers de message en réception)
 

Labo

Membre Actif
Inscrit
16 Aout 2013
Messages
799
Reactions
15
#17
Sinon, une librairie pour traiter les objets résultant de l'utilisation de bin() ?
Parce que les binaires sont gérés comme des strings sous Python3.x et je cherche un moyen cpuless de faire des traitement sur les binaires.
Tu peux développer ? Je n'ai pas compris :(
 
Inscrit
15 Janvier 2016
Messages
21
Reactions
1
#18
Nan c'est bon, c'est jute que selon les libs, la représentation des binaires ou hexa sont différentes et les objets les contenants sont spéciaux parfois :D.
En sortie de pyShark c'est des LayerContainer par exemple du coup je suis passé par le module bitstring qui me permet de sortir tout ce que je veux d'un binaire :)
 

Labo

Membre Actif
Inscrit
16 Aout 2013
Messages
799
Reactions
15
#19
Je t'assure que les bytes sont très bien.
Content que tu aies réussi !
 
Inscrit
15 Janvier 2016
Messages
21
Reactions
1
#20
Et bien vu que j'encapsule les moments où j'utilise bitstring (afin de pouvoir changer de solution si ça ne fonctionne pas) je pourrais passer à Bytes le moment venu si j'bute sur un soucis de lecture :D.

On m'a parlé de .d2o, j'ai trouvé l'endroit où on les lit mais à quoi servent-ils ?

Je vois des données sérializées donc je pense à une liste ou un dictionnaire d'objets (item du jeu ?).

Mais rien de sûr pour le moment.
 
Haut Bas