Documentation de l'API Jeuxvideo.com

Révision datée du 5 septembre 2023 à 12:17 par ChristianRonald (discussion | contributions) (Documentation pour l'API v4 (incomplète))

L'API de Jeuxvideo.com, utilisée à l'origine par les applications mobiles de Jeuxvideo.com, permet de développer plus facilement des applications, sites web, et autres scripts en rapport avec Jeuxvideo.com.

Elle est au format JSON, ce qui fait qu'elle est plus facile à parser, mais aussi plus rapide à charger qu'une page web normale.

L'ancienne API était hébergée sur le sous-domaine "ws". Désormais, l'API est hébergée sur le sous-domaine "api".

API v4

L'API v4 utilise un système de sécurité afin que même personne ne puisse accéder à l'API. Pour pouvoir accéder y accéder, l'Header de vos requêtes devra toujours être de la forme :

Jvc-Authorization: "header"

"User-Agent": "JeuxVideo-Android/267"

"Content-Type" : "application/json"

header est égal à une chaîne de charactère de cette forme : "PartnerKey=partner_key, Signature=signature, Timestamp=date".

Voici un script python qui construit la signature

import hashlib

from datetime import datetime

partner_key = "550c04bf5cb2b"

date = datetime.utcnow().isoformat()

signature = hashlib.sha256(f"{self.partner_key}\n{date}\n{method}\napi.jeuxvideo.com\n/v{self.api_version}/{path}"

.encode()).hexdigest()

API endpoints

Url de base : https://api.jeuxvideo.com/v4/

POST
NOM URL METHOD PARAMS BODY
addComment contents/{contentID}/comments POST contentID str "content": "commentaire"
addCommentVote contents/{contentID}/comments/{commentID}/vote POST contentID str

commentID str

"type": 1 ou -1
addFavorisGames accounts/{accountId}/favorites/games POST accountId str "games": [{

"id": 1,

    "machine": 100

}]

addReply contents/{contentID}/comments/{commentID}/answers POST contentID str

commentID str

"content": "Super jeu !"
addReview games/{id}/{machine}/reviews/users POST id int

machine str

"content": "Super jeu !",

"mark": 4,

"onProfile": true

login accounts/login POST "alias": "pseudo",

"password": "mot_de_passe"

logout accounts/logout POST
register accounts/register

l'Header doit inclure : "Jvc-Auth-Token" : str

POST "email": "email",

"alias": "pseudo",

"password": "motdepasse",

"optin": false

reinitPassword accounts/reset POST "alias": "pseudo",

"password": "nouveau",

"session": "",

"captcha": {

    "imageKey": "",

    "imageName": "",

    "imageValues": [

        "val1",

        "val2" ]}

reportAccount accounts/{accountId}/report POST accountId str "reason": 1,

"message": "Raison"

reportComment contents/{contentID}/comments/{commentID}/report POST contentID str

commentID str

"reason": 1,

"message": "Raison",

"captcha": {

    "session": "clé"

    "clé_captcha": "Valeur"

    "valeur_captcha": "Valeur"

}

reportReview games/{id}/{machine}/reviews/users/{reviewId}/report POST id int

machine str reviewId int

"reason": 1,

"message": "Raison",

"captcha": {

"session": "clé"

"clé_captcha": ""

"valeur_captcha": ""

}

restoreComment contents/{contentID}/comments/{commentID} POST contentID str

commentID str

"content" : "comment"
validateAccount accounts/confirm POST "id": 123,

"hash": "hash",

"alias": "pseudo",

"password": "mdp"

validateSignature general/stores/android/validation POST "signature": "signature",

"signed_data": "signed_data"


Classe PHP exploitant l'API

-> https://pastebin.com/LWNDQDKy

Cette classe est incomplète et sera possiblement rendue obsolète dans le temps.

Ancienne API

Le contenu qui va suivre concerne l'ancienne API, qui n'existe plus. Si quelqu'un est courageux pour de nouveau documenter l'API actuelle de JV, nous en serions tous ravis.

Identification

L'API utilise le nom de domaine ws.jeuxvideo.com. Pour y accéder, il faut utiliser un des identifiants ci-dessous (authentification HTTP basique).

Tous ces identifiants fonctionnement actuellement, et je n'ai pas repéré de page semblant afficher un comportement différent selon.

Utilisateur Mot de passe
Android 1.0 appandr e32!cdf
Android 2.0.3 app_and_gnw FC?4554?
Android 2.5 app_and_ms D9!mVR4c
Android MP app_ag_jvmp LXnb45=d#
Android Tab nex12sz GT4!V2cT
iPhone app_ios_nw W!P45-R
iPad ip45de XpD5!FT

L'API est accessible en HTTP et en HTTPS, préférez la version HTTPS !

Utilisation

Connexion

Pour vous connecter, utilisez la page mon_compte/connexion.php.

Voici les paramètres à envoyer (GET ou POST) :

Vous renconterez potentiellement une erreur vous demandant de remplir un captcha, avec un lien vers l'image, et une balise params_form, qu'il faudra ajouter aux paramètres de la première requête, ainsi que le paramètre code avec la valeur du captcha.

Important : n'ouvrez pas le lien du captcha dans votre navigateur si vous êtes connecté à votre compte JVC ; un captcha différent est renvoyé selon la présence du cookie coniunctio (qui ne doit PAS être présent pour afficher un captcha de l'API, sinon vous aurez systématiquement une erreur de captcha invalide).

En réponse, vous recevez plusieurs informations présentes dans la CDV, mais surtout le cookie coniunctio, que vous devrez utiliser pour poster sur les forums et utiliser les messages privés.

Pour information, coniunctio signifie logjvnew à l'envers, et c'est le cookie de session de JVC dont le nom a subi plusieurs transformations au fil des années.

Pour le renvoi de mot de passe, utilisez cette URL (en remplaçant Cisla par le pseudo ou bien l'adresse e-mail) :

https://ws.jeuxvideo.com/cgi-bin/passperdu_ws.cgi?email_pseudo=Cisla

Jeux, astuces, news...

URL Description
00.machines_version.xml
00.version_tablette.xml
Dernière version de l'application, informations sur la publicité, liste des consoles
01.flux_jeux_nouveautes.xml
01.flux_jeux_prochainement.xml
Listes de jeux
01.jeux/21963.xml
01.jeux/details/21963.xml
01.jeux/videos/21963.xml
01.jeux/screen/21963.xml
03.preview/43689.xml
03.test_complet/9813.xml
01.jeux/news/21963.xml
05.jeu_astuce/41030.xml
05.astuce/33258.xml
01.jeux/screen_ast/38024.xml
Informations sur le jeu (le nombre correspond à l'id)
03.dossier/18270.xml
03.dossier/18270/1.xml
Un dossier : 18270 est l'id du dossier, 1 est la page (si vous n'en mettez pas, vous avez le sommaire)
02.flux_news.xml
02.flux_news-4.xml
La liste des dernières news. Dans le deuxième exemple, en ajoutant le nombre 4, vous retournez 4 jours en arrière (ça peut aller jusqu'à 9)
03.flux_articles_tests.xml
03.flux_articles_tests-4.xml
03.flux_articles_apercus.xml
03.flux_articles_apercus-4.xml
03.flux_articles_dossier.xml
03.flux_articles_dossier-4.xml
04.flux_videos_cliq.xml
04.flux_videos_cliq-4.xml
04.flux_videos_gaming.xml
04.flux_videos_gaming-4.xml
04.flux_videos_autres.xml
04.flux_videos_autres-4.xml
05.flux_astuces.xml
05.flux_astuces-4.xml
04.flux_videos_chroniques.xml
04.flux_videos_chroniques-4.xml
04.flux_toutes_les_videos.xml
04.flux_toutes_les_videos-4.xml
Même chose pour les derniers articles, tests, astuces et aperçus
02.news/1234.xml
02.news_screen/1234.xml
Voir une news (le nombre correspond à l'id)
ean.php?ean=0045496830144 Voir le jeu associé au code-barre (EAN) 0045496830144
forums_index.xml Liste des forums généraux
search_n/mario
search/mario
search_sug/mario
search_forums/mario
search_forums_sug/mario
Effectuer une recherche dans le nom des jeux ou des forums
tab_suggest_blocs.xml
tab_suggest_forums.xml
À compléter
cgi-bin/liste.cgi À compléter

Forums

Pour les forums, les URL sont les mêmes que pour JVC, à part que :

  • Le .htm est transformé en .xml
  • Le www.jeuxvideo.com est remplacé par un ws.jeuxvideo.com
  • La chaîne de caractères à la fin de l'URL (comme blabla-15-18-ans ou nom-du-topic) est remplacée par un 0 (sauf pour la recherche).

Par exemple :
http://www.jeuxvideo.com/forums/0-50-0-1-0-1-0-blabla-15-18-ans.htm
Devient :
https://ws.jeuxvideo.com/forums/0-50-0-1-0-1-0-0.xml

Exemples d'URL :

URL Description
https://ws.jeuxvideo.com/forums/0-50-0-1-0-1-0-0.xml La liste des sujets
https://ws.jeuxvideo.com/forums/0-50-0-1-0-1-2-cactus.xml Rechercher « cactus » dans le titre des topics
https://ws.jeuxvideo.com/forums/1-50-1-1-0-1-0-0.xml Un topic
https://ws.jeuxvideo.com/forums/3-50-0-1-0-1-0-0.xml Formulaire pour créer un topic
https://ws.jeuxvideo.com/forums/3-50-128244545-1-0-1-0-0.xml 10 derniers messages d'un topic + formulaire
https://ws.jeuxvideo.com/forums/5-50-128244545-1-0-1-0-0.xml Formulaire de réponse à un topic
https://ws.jeuxvideo.com/cgi-bin/jvforums/forums.cgi Envoyer un message (avec les données POST)
https://ws.jeuxvideo.com/profil/cisla.xml Voir une CDV

Pour envoyer un message ou créer un topic : aux données de formulaires qui vous sont communiquées dans la balise params_form, vous devez ajouter le paramètre yournewmessage qui contient le message et newsujet qui contient le titre du topic (si vous créez un nouveau topic). Vous devez ensuite attendre une seconde avant d'envoyer les données POST à la page forums.cgi. En cas de captcha à gérer, vous devez répéter l'opération à partir des informations qu'on vous envoie en réponse, avec la solution du captcha en paramètre code.

Vous devez être connecté (envoyer le cookie coniunctio) pour récupérer et envoyer un formulaire.

Le même formulaire peut aussi bien être envoyé au forums.cgi de ws.jeuxvideo.com qu'à celui de www.jeuxvideo.com, ce qui vous permet de choisir entre apparaître « via mobile » ou non. Les données POST à envoyer sont donc les mêmes sur toutes les versions de JVC.

Messages privés

L'id de l'utilisateur mentionnée ci-dessous correspond à la partie du cookie coniunctio qui se trouve avant le premier "$".

Une fois connecté, vous devez envoyer le cookie coniunctio à chaque requête.

URL Description
jvmp.xml Dernière version de l'application, liste des consoles et des smileys, lien vers la charte, pub activée ou non
messages-prives/connexion_ws.php Les paramètres sont les mêmes que pour la connexion depuis mon_compte/connexion.php, décrite plus haut. Cependant, la réponse XML contient quelques informations supplémentaires à propos des MP.
messages-prives/boite-reception_ws.php Permet de connaître le contenu de la boîte de réception. Paramètre à envoyer :
  • id_user : id de l'utilisateur
messages-prives/envoyes_ws.php Permet de connaître la liste des messages envoyés. Paramètre à envoyer :
  • id_user : id de l'utilisateur
messages-prives/message_ws.php Permet de lire le contenu d'un message privé. Paramètres à envoyer :
  • id_user : id de l'utilisateur
  • id_discussion : id de la discussion
  • nb_clic : le nombre de fois où l'utilisateur a cliqué sur « Voir les messages précédents »
  • last_position_message : Si ce paramètre vaut 0, les 5 derniers messages sont affichés. Sinon, les 10 messages les plus anciens en partant du xème sont affichés, la numérotation débutant à partir de 0.
messages-prives/nouveau_ws.php Permet d'envoyer un nouveau message privé. Paramètres à envoyer :
  • id_user : id de l'utilisateur
  • all_dest : les destinataires, séparés pas des point-virgules
  • sujet : le titre du MP
  • yournewmessage : le contenu du MP
  • tmp : le timestamp actuel
  • control : md5("k_ys4+a]x" + idUtilisateur + "j6A=d?6-W*-" + timestamp + "z_.Im")

Il se peut également que vous ayez à gérer un code de confirmation.

messages-prives/repondre_ws.php Permet de répondre à un message privé. Paramètres à envoyer :
  • id_user : id de l'utilisateur
  • id_discussion : id de la discussion
  • yournewmessage : le contenu du message
  • tmp : le timestamp actuel
  • control : md5("vx*96-dP" + timestamp + "8e63ddO_" + idUtilisateur + "al)orc9W")
  • box : 1

Il se peut également que vous ayez à gérer un code de confirmation.

messages-prives/suggest_pseudo_ws.php Liste quelques pseudos qui commencent par ce que l'utilisateur est en train de taper. Paramètres à envoyer :
  • id_user : id de l'utilisateur
  • search : ce que l'utilisateur est en train de taper
messages-prives/indesirable_ws.php Liste les utilisateurs ajoutés en indésirable. Paramètres à envoyer :
  • id_user : id de l'utilisateur
messages-prives/add_indesirable_ws.php Permet d'ajouter un utilisateur dans les indésirables. Certaines données nécessaires pour former la requête doivent être récupérés avec info_alerte_ws.php. Paramètres à envoyer :
  • id_user : id de l'utilisateur actuel
  • pseudo : pseudo de l'utilisateur
  • id_user_indesirable : id de l'utilisateur à ajouter en indésirable
  • pseudo_indesirable : pseudo de l'utilisateur à ajouter en indésirable
  • time_indesirable : le timestamp actuel
  • key_indesirable : md5("5d*" + timestamp + "v1S{" + idIndesirable + "I,5|S9z)" + pseudoIndesirable + "52Sx69,")
messages-prives/del_indesirable_ws.php Permet d'enlever un utilisateur des indésirables. Paramètres à envoyer :
  • id_user : id de l'utilisateur actuel
  • id_user_indesirable : id de l'utilisateur à enlever des indésirables
messages-prives/info_alerte_ws.php Permet de connaître les informations qui permettront de faire une DDB ou une mise en indésirable sur un message. Paramètres à envoyer :
  • id_user : id de l'utilisateur qui fait la DDB
  • id_message : id du message concerné
messages-prives/alerte_ws.php Permet d'effectuer une DDB (ce qui est inutile, étant donné qu'elles ne sont jamais traitées). Certaines données nécessaires pour former la requête doivent être récupérés avec info_alerte_ws.php. Paramètres à envoyer :
  • id_user : id de l'utilisateur qui fait la DDB
  • pseudo : pseudo de l'utilisateur
  • motif : le motif, par exemple Piratage (les mêmes motifs que dans les MP sur JVC normal)
  • id_message : id du message concerné
  • id_discussion : id de la discussion concernée
  • time_alerte : timestamp actuel
  • key_alerte : md5("v6dE{" + idDiscussion + "d96/" + idMessage + "mvn85Qa" + timestamp + "auxarmeheuuuuuuu")
messages-prives/connexion_valid_ws.php Permet d'afficher le nombre de messages non-lus ainsi que l'URL de l'avatar. Paramètres à envoyer :
  • id_user : id de l'utilisateur
  • pseudo : pseudo de l'utilisateur
messages-prives/add_destinataire_ws.php Permet d'ajouter un destinataire à un message privé. Paramètres à envoyer :
  • id_user : id de l'utilisateur
  • id_discussion : id de la discussion
  • tab_pseudo : liste des destinataires à ajouter, séparés par un point-virgule
messages-prives/del_message_ws.php Permet de supprimer un message privé. Paramètres à envoyer :
  • id_user : id de l'utilisateur
  • del_discussion : id des discussions à supprimer séparés par un tiret
  • box : 1

Reverse-engineering

Décompilation

Cette section concerne la décompilation de l'application Android de JVC sous Linux.

Pour décompiler l'application JVC, commencez par récupérer le fichier APK ici (version 2.5). Ensuite, décompressez-le avec 7-Zip :

$ 7z x com.jeuxvideo-2.5.apk

Puis, transformez le .dex en .jar à l'aide de l'utilitaire dex2jar :

$ dex2jar classes.dex

Ensuite, vous pouvez ouvrir le .jar dans jd-gui, qui s'occupera de décompiler les fichiers :

$ jd-gui classes-dex2jar.jar

Déobfuscation

En parcourant le code source, vous verrez des choses de ce genre à la place des chaînes de caractères :

this.g.getString(2131230723)

Cela correspond à des chaînes de caractères stockées dans un fichier séparé, resources.arsc. Pour en extraire le contenu, nous allons utiliser l'utilitaire apktool :

$ apktool d com.jeuxvideo-2.5.apk strings

Ensuite, vous pourrez trouver dans le fichier strings/res/values/strings.xml la liste des chaînes de caractères associées à leurs variables, et dans strings/res/values/public.xml, la liste des variables associées aux nombres (en hexadécimal) comme 2131230723 que vous voyez dans le code décompilé. Ce n'est pas très pratique mais je n'ai pas trouvé d'outil qui modifie directement le code décompilé pour y intégrer les valeurs du resources.arsc (mais je n'ai pas beaucoup cherché non plus).

Ce n'est pas tout. À partir de la version 2.0.3 de l'application JVC, et pour toutes les version de l'application JVC MP, vous pourrez également voir dans le fichier strings.xml des variables telles que :

<string name="md5_a">290B2FB20CFD682C120BBBFFFE5928D9</string>

Ces chaînes de caractères (des URL et quelques salts) sont obfusquées. Après avoir lu un peu de code, j'ai trouvé comment les restituer. Voici un bout de Python qui montre comment faire :

from Crypto.Cipher import AES
from passlib.utils.pbkdf2 import pbkdf2

cle = 'package android.content'
cle = AES.new(pbkdf2(cle, cle, 10, 128/8, 'hmac-sha1'))

string = '290B2FB20CFD682C120BBBFFFE5928D9'
string = cle.decrypt(string.decode('hex'))
print repr(string[:-ord(string[-1])])

Modifiez la clé selon l'application que vous décompilez :

  • Pour l'application Jeuxvideo.com (version >= 2.0.3), c'est package com.jeuxvideo.activity
  • Pour l'application Jeuxvideo.com (version >= 2.5), c'est package android.content
  • Pour l'application Jeuxvideo.com MP (version >= 1.0), c'est package com.jeuxvideomp.activity

L'application pour tablettes n'est pas concernée par ce mécanisme d'obfuscation.

Liens externes


Références


  Toutes les catégories  
  Forums AvenoelBlabla 18-25 ansForum WarForums de ForumJVForums de jeuxvideo.comForums généralistesJVC-LikeOnche.org
  Forumeurs Administrateurs de Jeuxvideo.comForumeurs du 15-18Forumeurs du 18-25Forumeurs légendaireModérateurs
  Jeux et Divertissements DivertissementsFicsRisimonJVCraftJeux indépendantsMineCommuRadios
  Actions et Évènements MalveillancesPEMT du Nouvel AnRaids et AgissementsAffairesHistoire du Blabla 18-25 ans
  Fondamentaux Boucles du 18-25DéliresPavésTopicsVocabulaire courantVocabulaire rareVocabulaire exerneAbréviations et AcronymesPersonnalités
  Thèmes BrisésConcepts et ThéoriesGastronomieMortsQuelle époqueTarésTypes de personneCovid-19Ni oubli ni pardon
  Sectes et Groupes Groupes de forumeursHapismeNoelismeMouvements sectaires de jeuxvideo.comPeurisme
  Outils et Technique Extensions et outilsSites d'hébergements d'imagesSites de la kheyosphèreSites WebFonctionnement de jeuxvideo.comRubriques de jeuxvideo.com
  JVFlux et Médias Articles de qualitéArticles manquants, médiocres ou incompletsContribuer au WikiFichiers et médiasMusiqueVocarooBankStickers