Kheys
423
modifications
m (Div anchor sur JVClient) |
|||
| (17 versions intermédiaires par 4 utilisateurs non affichées) | |||
| Ligne 1 : | Ligne 1 : | ||
{{Bannière Info|Contenu=Cette page documente l'API v4 de jeuxvideo.com. Le fonctionnement du site est quant à lui détaillé sur [[Fonctionnement technique de Jeuxvideo.com]].}} | |||
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. | 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. | ||
| Ligne 6 : | Ligne 8 : | ||
Les anciennes versions sont toujours exploitables avec les ''tokens'' qui leur sont propres{{Commentaire|Autre=potentiellement obsolète}}, mais certains ''endpoints'' renvoient des erreurs HTTP 403. | Les anciennes versions sont toujours exploitables avec les ''tokens'' qui leur sont propres{{Commentaire|Autre=potentiellement obsolète}}, mais certains ''endpoints'' renvoient des erreurs HTTP 403. | ||
<div id="jvclient"></div> | |||
=JVClient= | |||
[[File:icon-512x512.png|vignette|256px|Le logo de JVClient : « Le pouvoir par les données ».]] | |||
[https://www.npmjs.com/package/jv-client '''JVClient'''] est une '''librairie Node.js''' écrite en TypeScript qui fournit des classes et des fonctions permettant d'interagir avec l'API v4 de jeuxvideo.com ainsi que le site JVC lui-même. | |||
Publiée en février 2025, son objectif est de servir de base aux programmeurs pour le ''scraping'' de données sur des jeux, articles, forums, topics, etc. et pour l'exécution d'opérations nécessitant un compte connecté (comme poster des topics). Le code est ''open source'' et disponible sur Github<ref>https://github.com/Contrapunctus-XIV/jv-client</ref>. | |||
Elle dispose également d'une documentation complète<ref>https://contrapunctus-xiv.github.io/jv-client/</ref> qui explique en détail l'organisation des données de jeuxvideo.com. | |||
{{clear}} | |||
=Rétro-ingénierie de l'application mobile JVC= | =Rétro-ingénierie de l'application mobile JVC= | ||
| Ligne 82 : | Ligne 95 : | ||
Il s'avère que ''Jvc-Auth-Header'' contient le [https://stackoverflow.com/questions/37671380/what-is-fcm-token-in-firebase token FCM], un token créé par la plateforme ''FireBase'' de Google et utilisé par l'application mobile pour accéder aux bases de données. Ce token est unique à chaque appareil et est créé à chaque installation de l'application mobile. En outre, il permet à l'API de savoir si l'application a déjà effectué une requête d'inscription dans les dernières 24 heures et, le cas échéant, de bloquer les requêtes d'inscription. | Il s'avère que ''Jvc-Auth-Header'' contient le [https://stackoverflow.com/questions/37671380/what-is-fcm-token-in-firebase token FCM], un token créé par la plateforme ''FireBase'' de Google et utilisé par l'application mobile pour accéder aux bases de données. Ce token est unique à chaque appareil et est créé à chaque installation de l'application mobile. En outre, il permet à l'API de savoir si l'application a déjà effectué une requête d'inscription dans les dernières 24 heures et, le cas échéant, de bloquer les requêtes d'inscription. | ||
Il semble malheureusement impossible de générer de tels tokens « à la demande », en tout cas sans connaître les noms et clés des services FireBase dédiés à l'application. | Il semble malheureusement impossible de générer de tels tokens « à la demande », en tout cas sans connaître les noms et clés des services FireBase dédiés à l'application. Une alternative "temporaire" consisterait à spawner des Android virtualisés, d'y installer de façon automatisée l'APK de JVC, puis de créer des comptes. Mais dans ce type de contexte, ce n'est plus vraiment de la rétro-ingiénierie. | ||
<div id="interception"></div> | <div id="interception"></div> | ||
| Ligne 131 : | Ligne 144 : | ||
<div id="sous-domaine"></div> | <div id="sous-domaine"></div> | ||
== Comportement du sous-domaine == | == Comportement du sous-domaine pour les forums == | ||
Il est intéressant de remarquer que l'API se comporte souvent en véritable | Il est intéressant de remarquer que l'API se comporte souvent en véritable site Web, qui réplique les forums du site www.jeuxvideo.com : par exemple, si vous êtes sur un [[topic]] ou un [[forum]], il vous suffit de remplacer dans l'URL « www » par « api » et vous vous trouverez sur une page aux informations identiques quoique présentées de manière différente. Ainsi, les URL seront de la forme <code>https://api.jeuxvideo.com/forums/0-51-0-1-0-1-0-blabla-18-25-ans.htm</code>. Il manque cependant de nombreuses fonctionnalités comme les pages de profils sur le sous-domaine API. | ||
[[File:forum_api.png|vignette|350px|Le forum [[Blabla 18-25 ans]] sur le site de l'API.]] | [[File:forum_api.png|vignette|350px|Le forum [[Blabla 18-25 ans]] sur le site de l'API.]] | ||
| Ligne 140 : | Ligne 153 : | ||
{{clear}} | {{clear}} | ||
==Endpoints | ==Endpoints de service== | ||
Il s'agit des ''endpoints'' « documentés » dans le code de l'application mobile et qui se comportent différemment des services de l'API qui ne se contentent que de « copier » le contenu JVC (voir sous-section précédente). | Il s'agit des ''endpoints'' « documentés » dans le code de l'application mobile et qui se comportent différemment des services de l'API qui ne se contentent que de « copier » le contenu JVC (voir sous-section précédente). | ||
On rappelle que l'accès à ces ''endpoints'' nécessite un token d'authentification à fournir dans le header ''Jvc-Authorization''. Voir l'[[#annexe|annexe]] pour le générer. | |||
'''URL de base''': ''<nowiki>https://api.jeuxvideo.com/v4/</nowiki>'' | '''URL de base''': ''<nowiki>https://api.jeuxvideo.com/v4/</nowiki>'' | ||
*''' | *'''PATH''': chemin d'accès de l'''endpoint'' | ||
*'''PARAMS, HEADERS''': | *'''PARAMS, HEADERS''': | ||
** '''param''' : variable entre accolades à remplacer dans l'URL, suivie dans la documentation de son type (''str'' ou ''int''). Par exemple, <code>contents/{contentID}/comments</code> doit être appelé comme suit : <code>contents/123456/comments</code>. <br> Note : dans la plupart des cas, le paramètre <code>accountId</code> peut être remplacé par la valeur <code>me</code> lorsque la requête doit pointer sur le compte connecté. | ** '''param''' : variable entre accolades à remplacer dans l'URL, suivie dans la documentation de son type (''str'' ou ''int''). Par exemple, <code>contents/{contentID}/comments</code> doit être appelé comme suit : <code>contents/123456/comments</code>. <br> Note : dans la plupart des cas, le paramètre <code>accountId</code> peut être remplacé par la valeur <code>me</code> lorsque la requête doit pointer sur le compte connecté. | ||
| Ligne 156 : | Ligne 170 : | ||
|+POST | |+POST | ||
!NOM | !NOM | ||
! | !PATH | ||
!PARAMS, HEADERS | !PARAMS, HEADERS | ||
!BODY | !BODY | ||
| Ligne 311 : | Ligne 325 : | ||
|+GET | |+GET | ||
!NOM | !NOM | ||
! | !PATH | ||
!PARAMS, HEADERS | !PARAMS, HEADERS | ||
!QUERY | !QUERY | ||
| Ligne 665 : | Ligne 679 : | ||
|+PUT | |+PUT | ||
!NOM | !NOM | ||
! | !PATH | ||
!PARAMS, HEADERS | !PARAMS, HEADERS | ||
!BODY | !BODY | ||
| Ligne 683 : | Ligne 697 : | ||
| | | | ||
|<pre>"machines" : [1, 2, 3, 4] // id des machines</pre> | |<pre>"machines" : [1, 2, 3, 4] // id des machines</pre> | ||
|- | |||
|setFavorisForum | |||
|accounts/me/favorites/forums | |||
| | |||
|<code>"forums" : [50,51,52] # ID des forums</code> | |||
|- | |||
|setFavorisGames | |||
|accounts/me/favorites/games | |||
| | |||
|<code>"games" : [{"id":"ID du jeu", "machine":"ID de la machine"}]</code> | |||
|- | |||
|setFavorisTopics | |||
|accounts/me/favorites/topics | |||
| | |||
|<code>"topics" : [74229153, 74229154] # ID des topics</code> | |||
|- | |- | ||
|updateComment | |updateComment | ||
| Ligne 704 : | Ligne 733 : | ||
|+DELETE | |+DELETE | ||
!NOM | !NOM | ||
! | !PATH | ||
!PARAMS, HEADERS | !PARAMS, HEADERS | ||
!BODY | !BODY | ||
| Ligne 728 : | Ligne 757 : | ||
|accounts/me/favorites/games | |accounts/me/favorites/games | ||
| | | | ||
|<code>" | |<code>"games" : [{"id":"ID du jeu", "machine":"ID de la machine"}]</code> | ||
|- | |- | ||
|deleteFavorisTopics | |deleteFavorisTopics | ||
| Ligne 754 : | Ligne 783 : | ||
parsed_url = urllib.parse.urlparse(f"https://{DOMAIN}/v{API_VERSION}/{path}") | parsed_url = urllib.parse.urlparse(f"https://{DOMAIN}/v{API_VERSION}/{path}") | ||
if query: | if query: | ||
parsed_url = parsed_url._replace(query=urllib.parse.urlencode( | sorted_query = dict(sorted(query.items())) | ||
parsed_url = parsed_url._replace(query=urllib.parse.urlencode(sorted_query)) | |||
# Création de la chaîne à hash | # Création de la chaîne à hash | ||
| Ligne 926 : | Ligne 956 : | ||
*[https://pastebin.com/LWNDQDKy Classe PHP] exploitant l'API (cette classe est incomplète et sera possiblement rendue obsolète dans le temps). | *[https://pastebin.com/LWNDQDKy Classe PHP] exploitant l'API (cette classe est incomplète et sera possiblement rendue obsolète dans le temps). | ||
= API jvc.gg = | = API jvc.gg (dépréciée) = | ||
{{Bannière Note|Contenu=Le contenu qui va suivre concerne l'ancienne API qui n'existe plus.}} | |||
[[File:phoenix.png|300px|vignette|La page Phoenix des jeux.]] | [[File:phoenix.png|300px|vignette|La page Phoenix des jeux.]] | ||
Cette API | Cette API était une API distincte de la ''v4'' et utilisée par la partie Phoenix du site, c'est-à-dire les pages listant les jeux, ''reviews'', vidéos, etc., comme [https://www.jeuxvideo.com/tous-les-jeux/ celle-ci]. Elle était hébergée sur le domaine [https://api.jvc.gg api.jvc.gg]. | ||
L'API est fermée début février 2025 à la suite de la refonte des pages Phoenix de JVC qui adoptent désormais le même fonctionnement que les autres pages du site. | |||
{{clear}} | {{clear}} | ||
| Ligne 957 : | Ligne 991 : | ||
Le tableau suivant répertorie les ''endpoints'' connus de cette API. Voici la signification de ses colonnes : | Le tableau suivant répertorie les ''endpoints'' connus de cette API. Voici la signification de ses colonnes : | ||
*'''PATH''': chemin de l'''endpoint''. | *'''PATH''' : chemin de l'''endpoint''. | ||
*'''PARAMS, HEADERS''': | *'''PARAMS, HEADERS''' : | ||
** '''param''' : variable entre accolades à remplacer dans l'URL, suivie dans la documentation de son type (''str'' ou ''int''). Par exemple, <code>contents/{contentID}/comments</code> doit être appelé comme suit : <code>contents/123456/comments</code>. | ** '''param''' : variable entre accolades à remplacer dans l'URL, suivie dans la documentation de son type (''str'' ou ''int''). Par exemple, <code>contents/{contentID}/comments</code> doit être appelé comme suit : <code>contents/123456/comments</code>. | ||
** '''header''' : ''header'' particulier à inclure dans l'en-tête de la requête. Si pas de spécification, l'en-tête ne contient que les ''headers'' de base spécifiés plus haut (''User-Agent'', ''Jvc-Authorization'', etc.). | ** '''header''' : ''header'' particulier à inclure dans l'en-tête de la requête. Si pas de spécification, l'en-tête ne contient que les ''headers'' de base spécifiés plus haut (''User-Agent'', ''Jvc-Authorization'', etc.). | ||
*'''QUERY''': valeur à ajouter à l'URL permettant si précisée de filtrer les résultats. Par exemple pour les deux query ''page'', ''perPage'' int, l'URL devra être: <code>api.jeuxvideo.com/v4/contents/1234ID/comments?page=1&perPage=30</code> | *'''QUERY''' : valeur à ajouter à l'URL permettant si précisée de filtrer les résultats. Par exemple pour les deux query ''page'', ''perPage'' int, l'URL devra être: <code>api.jeuxvideo.com/v4/contents/1234ID/comments?page=1&perPage=30</code> | ||
*'''BODY''': Corps de la requête au format JSON | *'''BODY''' : Corps de la requête au format JSON | ||
=== Les paramètres spéciaux === | === Les paramètres spéciaux === | ||
| Ligne 990 : | Ligne 1 024 : | ||
=== Queries des tests === | === Queries des tests === | ||
Les ''queries'' renseignent la plateforme, le mode et le genre des jeux testés, ainsi que l'encadrement de la note des rédacteurs et la date de publication. La liste complète des valeurs des ''queries'' possibles pour ces attributs est disponible au format JSON [https://pastebin.com/ | Les ''queries'' renseignent la plateforme, le mode et le genre des jeux testés, ainsi que l'encadrement de la note des rédacteurs et la date de publication. La liste complète des valeurs des ''queries'' possibles pour ces attributs est disponible au format JSON [https://pastebin.com/YxKif1DJ ici]. | ||
Par exemple, si vous souhaitez obtenir la liste des tests de jeux PC de genre aventure, de mode solo ayant eu au moins 14 et datant d'il y a au plus 6 mois, votre chaîne de ''queries'' devra être | Par exemple, si vous souhaitez obtenir la liste des tests de jeux PC de genre aventure, de mode solo ayant eu au moins 14 et datant d'il y a au plus 6 mois, votre chaîne de ''queries'' devra être | ||
| Ligne 1 005 : | Ligne 1 039 : | ||
Les ''queries'' renseignent le type des vidéos ainsi que la plateforme, le genre et l'événement des jeux traités. La liste complète des valeurs des ''queries'' possibles pour ces attributs est disponible au format JSON [https://pastebin.com/nBUAP4XX ici]. | Les ''queries'' renseignent le type des vidéos ainsi que la plateforme, le genre et l'événement des jeux traités. La liste complète des valeurs des ''queries'' possibles pour ces attributs est disponible au format JSON [https://pastebin.com/nBUAP4XX ici]. | ||
Par exemple, si vous souhaitez obtenir la liste des vidéos ''gameplays'' des jeux PC de genre Action en rapport avec l'événement E3, votre | Par exemple, si vous souhaitez obtenir la liste des vidéos ''gameplays'' des jeux PC de genre Action en rapport avec l'événement E3, votre chaîne de ''queries'' devra être <code>publicationType=gameplay&platform=pc&gameGenre=action&event=e3</code>. | ||
=== Queries des dossiers === | |||
Les ''queries'' renseignent la plateforme, le genre et l'événement des jeux traités. La liste complète des valeurs des ''queries'' possibles pour ces attributs est disponible au format JSON [https://pastebin.com/UGd3b2qJ ici]. | |||
Par exemple, si vous souhaitez obtenir la liste des vidéos ''gameplays'' des jeux PC de genre Action en rapport avec l'événement E3, votre chaîne de ''queries'' devra être <code>publicationType=gameplay&platform=pc&gameGenre=action&event=e3</code>. | |||
=== Queries globaux === | === Queries globaux === | ||
Ce sont les ''queries'' ''offset'' et ''limit'', de type ''int'', qui représentent respectivement l'indice de l'item dans la liste à partir duquel les items sont listés (par défaut 0) et le nombre d'items à lister (par défaut 100). Ils fonctionnent avec toutes les recherches. | Ce sont les ''queries'' ''offset'' et ''limit'', de type ''int'', qui représentent respectivement l'indice de l'item dans la liste à partir duquel les items sont listés (par défaut 0) et le nombre d'items à lister (par défaut 100). Ils fonctionnent avec toutes les recherches. | ||
=== Requêtes auxiliaires === | |||
En parallèle des requêtes envoyées par le site pour rechercher des jeux, news, previews, vidéos ou tests, des requêtes auxiliaires sont adressées aux serveurs. Elles permettent en particulier de connaître ce qu'il faut afficher sur la page, les URL des pages ainsi que les options (''queries'') restantes selon ce qui a déjà été entré dans le panel de recherche. | |||
Ces requêtes utilisent un ''endpoint'' contenant un token JWT dans lequel sont stockées des informations générales sur la requête (''queries'' notamment). Comme cette clé secrète n'est pas connue, il nous est malheureusement impossible de générer de tels tokens à la demande. | |||
=== Liste des endpoints connus === | === Liste des endpoints connus === | ||
| Ligne 1 037 : | Ligne 1 081 : | ||
'''limit''' int <br> | '''limit''' int <br> | ||
'''release''' str | '''release''' str | ||
|Renvoie la liste des jeux | |Renvoie la liste des jeux de la catégorie <code>{gameCategory}</code> triés par popularité décroissante et satisfaisant les ''queries''. | ||
|- | |- | ||
|games/{gameCategory}/releaseDate.asc | |games/{gameCategory}/releaseDate.asc | ||
| Ligne 1 047 : | Ligne 1 091 : | ||
'''limit''' int <br> | '''limit''' int <br> | ||
'''release''' str | '''release''' str | ||
|Renvoie la liste des jeux | |Renvoie la liste des jeux de la catégorie <code>{gameCategory}</code> triés par popularité décroissante et satisfaisant les ''queries''. | ||
|- | |- | ||
|games/{gameCategory}/title.asc | |games/{gameCategory}/title.asc | ||
| Ligne 1 057 : | Ligne 1 101 : | ||
'''limit''' int <br> | '''limit''' int <br> | ||
'''release''' str | '''release''' str | ||
|Renvoie la liste des jeux | |Renvoie la liste des jeux de la catégorie <code>{gameCategory}</code> triés par popularité décroissante et satisfaisant les ''queries''. | ||
|- | |- | ||
|news/datePublished.desc | |news/datePublished.desc | ||
| Ligne 1 114 : | Ligne 1 158 : | ||
'''limit''' int | '''limit''' int | ||
|Renvoie la liste des annonces triées par date de publication croissante et satisfaisant les ''queries''. | |Renvoie la liste des annonces triées par date de publication croissante et satisfaisant les ''queries''. | ||
|- | |- | ||
|videos/datePublished.desc | |videos/datePublished.desc | ||
| Ligne 1 130 : | Ligne 1 168 : | ||
'''limit''' int | '''limit''' int | ||
|Renvoie la liste des vidéos triées par date de publication croissante et satisfaisant les ''queries''. | |Renvoie la liste des vidéos triées par date de publication croissante et satisfaisant les ''queries''. | ||
|- | |||
|topics/datePublished.desc | |||
| | |||
|'''platform''' str <br> | |||
'''gameGenre''' str <br> | |||
'''event''' str <br> | |||
'''offset''' int <br> | |||
'''limit''' int | |||
|Renvoie la liste des dossiers triés par date de publication croissante et satisfaisant les ''queries''. | |||
|- | |- | ||
|me/{accessToken}/privateMessages | |me/{accessToken}/privateMessages | ||
| Ligne 1 556 : | Ligne 1 603 : | ||
[[Catégorie:Fonctionnement technique de Jeuxvideo.com]] | [[Catégorie:Fonctionnement technique de Jeuxvideo.com]] | ||
[[Catégorie:Extensions et outils]] | [[Catégorie:Extensions et outils]] | ||
[[Catégorie:Article de qualité]] | |||
{{Article de qualité}} | |||