Bonjour,
J'ai créé un outil web pour dofus qui utilisait une partie des data/common ainsi que les fichiers i18n, la problématique était donc de gagner du temps sur les mises à jour hebdomadaires du jeu, également, un bot pourrais utiliser cette méthode pour build son protocole.
Les trois endpoints avec leurs paramètres :
# Récupérer la version des jeux Ankama.
https://launcher.cdn.ankama.com/cytrus.json
# Récupérer les hashs d'un jeu spécifique,
# d'un type de version spécifique (beta/live),
# d'une plateforme spécifique et
# d'une version spécifique.
https://launcher.cdn.ankama.com/{game}/releases/{version}/{platform}/{version_nb}.json
Exemple : https://launcher.cdn.ankama.com/dofus/releases/main/windows/5.0_2.55.5.7.json
# Récupérer un fichier spécifique.
https://launcher.cdn.ankama.com/dofus/hashes/{2 premiers charactères du hash}/{hash}
Exemple : https://launcher.cdn.ankama.com/dofus/hashes/b7/b76631fd4bf12e6d38e1c81f61a23f9b5af0badc
En dessous suit la méthode utilisée et quelques exemples.
Je vais vous expliquer dans un premier temps comment je m'y suis pris pour récupérer les données nécessaires puis, je vais rapidement vous présenter des bouts de code.
Alors, plusieurs méthodes peuvent être utilisées :
La méthode que j'ai utilisé
Cliquez pour révéler
Cliquez pour masquer
Tout d'abord, j'ai lancé fiddler pour voir si je pouvais capter des requêtes http faites par le launcher :
![[Image Introuvable]](https://i.imgur.com/XFbdesp.png)
Par exemple, celle-ci est assez intéressante puisque le launcher se connecte donc à un endpoint en http pour récupérer la version des jeux dofus.
D'ailleurs, aucun check n'est réalisé côté serveur puisque qu'aucun paramètre n'est passé en headers ou dans l'url et donc, n'importe qui ou n'importe quel outil peut utiliser cet endpoint tant qu'il ne se fait pas bloquer par cloudflare.
Parfait, nous avons la méthode pour vérifier si il y a eu une mise à jour.
Bien, maintenant, j'ai besoin de certains fichiers.
Alors, j'ai commencé par inspecter les dossiers dans : "AppData\Local\Ankama\zaap\dofus\data" pour y retrouver un fichier nommé data.meta dans chacun d'eux.
![[Image Introuvable]](https://i.imgur.com/F8y4bOC.png)
On apprend alors que chaque fichier équivaut à un hash, bien, cela fait une information de plus pour la suite.
J'ai décidé d'utiliser process hacker pour voir les strings contenues dans le launcher.
Dans un premier temps, je n'ai rien trouvé d'intéressant mais, il s'avère que le launcher ne se met à jour que si il détecte que la version a changé via le cytrus.json téléchargé à l'ouverture, donc, impossible de trouver ni les hashs, ni les fichiers dans les strings. Donc, si on décide de réparer le launcher :
![[Image Introuvable]](https://i.imgur.com/H0qOX1Z.png)
On découvre directement les hashs des fichiers, également dans fiddler j'ai retrouvé cette requête :
![[Image Introuvable]](https://i.imgur.com/TK1sIiL.png)
Ainsi, dans cette requête-ci, on retrouve le hash de chaque fichiers.
Et puis en supprimant quelques fichiers et en cherchant leur hash après réparation ou en cherchant pour l'host launcher.cdn.ankama on retrouve par exemple :
![[Image Introuvable]](https://i.imgur.com/adKJnsL.png)
Et voilà, on a tout ce qu'il nous faut.
La méthode que je n'ai pas utilisé
Cliquez pour révéler
Cliquez pour masquer
- Le ankama launcher étant une application electron et vue.js :
- Vous pouviez unpack le app.asar (https://stackoverflow.com/questions/38523617/how-to-unpack-an-asar-file)
- (AppData\Local\Programs\zaap\resources\app.asar)
- Beautifier le code js a l'intérieur et récupérer les endpoints.
Donc, si l'on résume en pratique et avec python:
L'example pour récupérer la version de dofus (live)
import requests
request = requests.get('https://launcher.cdn.ankama.com/cytrus.json')
data = request.json()
version = data['games']['dofus']['platforms']['windows']['main']
print('Version : {} | Version affiché par le launcher : {}'.format(version, version.split('_')[1]))
L'example pour récupérer les hash de dofus (live)
platform = 'windows'
request = requests.get('https://launcher.cdn.ankama.com/dofus/releases/main/{platform}/{version}.json'.format(platform=platform, version=version))
hashs = request.json()
# keys contenues dans data :
# configuration
# lang_de
# lang_en
# lang_es
# lang_fr
# lang_it
# lang_pt
# main
# win32
# win64
L'example pour récupérer et sauvegarder Servers.d2o:
file_name = 'Servers.d2o'
hash = hashs['main']['files'][file_name]
url = 'https://launcher.cdn.ankama.com/dofus/hashes/' + hash[:2] + '/' + hash
request = requests.get(url)
with open(file_name, 'wb') as f:
f.write(request.content)
L'example pour récupérer et sauvegarder i18n_fr.d2i :
lang = 'fr'
file_name = 'i18n_{}.d2i'.format(lang)
hash = hashs['lang_{}'.format(lang)]['files']['data/i18n/i18n_{}.d2i'.format(lang)]
url = 'https://launcher.cdn.ankama.com/dofus/hashes/' + hash[:2] + '/' + hash
request = requests.get(url)
with open(file_name, 'wb') as f:
f.write(request.content)