« Documentation de l'API Jeuxvideo.com » : différence entre les versions

correction d'informations devenues erronées
(correction d'informations devenues erronées)
 
(24 versions intermédiaires par 5 utilisateurs non affichées)
Ligne 1 : Ligne 1 :
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.
{{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]].}}


Actuellement, deux API sont utilisées : l'api ''v4'' et l'api ''jvc.gg'' :
L''''API de [[jeuxvideo.com]]''', conçue par les développeurs du site pour l'application mobile, permet de programmatiser l'envoi de requêtes à JVC.
* L'API ''v4'' est hébergée sur le sous-domaine ''api'', et est actuellement à sa quatrième version (''v4''). Elle est utilisée par l'application mobile JVC. Cette API est privée et ne peut être documentée que par rétro-ingénierie de l'application mobile.
Étant à l'origine réservée à un usage privé, on ne dispose pas de sa documentation officielle. Toutefois, il est possible de détailler son fonctionnement grâce à un travail de rétro-ingéniérie.
* L'API ''jvc.gg'', d'importance moindre, est hébergée à ''api.jvc.gg''. C'est une API utilisée par les pages Phoenix du site qui sert notamment à la recherche des jeux.


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.
En juin 2025, l'API est hébergée sur le sous-domaine ''api'', et est à sa quatrième version (''v4'').
 
L'ancienne API ''jvc.gg'' était hébergée à ''api.jvc.gg'' jusqu'à son abandon en février 2025. Elle était utilisée par les pages Phoenix du site, notamment pour la recherche des jeux. Sa documentation (non-officielle) est toujours consultable sur cet article.
 
Les anciennes versions sont toujours exploitables avec les ''tokens'' qui leur sont propres{{Commentaire|Autre=très probablement 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 96 :
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 108 : Ligne 122 :


Vous pouvez désormais voir quelles requêtes sont passées à l'API, ainsi que les ''headers'' et ''body'' associés. Par exemple lorsque l'on se connecte :
Vous pouvez désormais voir quelles requêtes sont passées à l'API, ainsi que les ''headers'' et ''body'' associés. Par exemple lorsque l'on se connecte :
[[File:http_toolkit.png|400px]]
[[File:http_toolkit.png|center|500px]]


=API v4=
=API v4=
Ligne 131 : Ligne 145 :


<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 sous-domaine, de manière similaire au site www.jeuxvideo.com de base : 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 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 154 :
{{clear}}
{{clear}}


==Endpoints « formels » ==
==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>''  


*'''URL''': URL de l'endpoint
*'''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 171 :
|+POST
|+POST
!NOM
!NOM
!URL
!PATH
!PARAMS, HEADERS
!PARAMS, HEADERS
!BODY
!BODY
Ligne 311 : Ligne 326 :
|+GET
|+GET
!NOM
!NOM
!URL
!PATH
!PARAMS, HEADERS
!PARAMS, HEADERS
!QUERY  
!QUERY  
Ligne 665 : Ligne 680 :
|+PUT
|+PUT
!NOM
!NOM
!URL
!PATH
!PARAMS, HEADERS
!PARAMS, HEADERS
!BODY
!BODY
Ligne 683 : Ligne 698 :
|
|
|<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 734 :
|+DELETE
|+DELETE
!NOM
!NOM
!URL
!PATH
!PARAMS, HEADERS
!PARAMS, HEADERS
!BODY
!BODY
Ligne 728 : Ligne 758 :
|accounts/me/favorites/games
|accounts/me/favorites/games
|
|
|<code>"forums" : [{"id":"ID du jeu", "machine":"ID de la machine"}]</code>
|<code>"games" : [{"id":"ID du jeu", "machine":"ID de la machine"}]</code>
|-
|-
|deleteFavorisTopics
|deleteFavorisTopics
Ligne 754 : Ligne 784 :
     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(query))
        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 823 : Ligne 854 :
En second lieu, vous ne devrez pas seulement envoyer aux serveurs le contenu de votre message (et le titre du topic si besoin) : la requête ''POST'' devra aussi contenir des paires clés-valeurs générées par le site lui-même et qui agissent comme une sorte de protection. Celles-ci sont : ''fs_session'', ''fs_timestamp'', ''fs_version'', ''form_alias_rang'' ainsi qu'un ''hash''.
En second lieu, vous ne devrez pas seulement envoyer aux serveurs le contenu de votre message (et le titre du topic si besoin) : la requête ''POST'' devra aussi contenir des paires clés-valeurs générées par le site lui-même et qui agissent comme une sorte de protection. Celles-ci sont : ''fs_session'', ''fs_timestamp'', ''fs_version'', ''form_alias_rang'' ainsi qu'un ''hash''.


Heureusement, ces valeurs sont directement disponibles depuis des ''inputs'' cachées dans le code HTML des pages de forums/topics et situées dans la ''div'' nommée ''js-form-session-data''.
'''Depuis mai 2025''', suite à une mise à jour de JVC, les informations ''"fs_" '', sont offusqués dans une chaîne en base 64.


Si l'on veut envoyer un message sur un topic (ou un forum), il faudra d'abord envoyer une requête ''GET'' à l'URL associée et récupérer ces valeurs chiffrées avant d'envoyer une requête ''POST'' avec le contenu du message en plus de ces dernières.
Les fs_ sont récupérables via la balise script : ''window.jvc.forumsAppPayload''


=== Script Python ===
<script>window.jvc=window.jvc||{};window.jvc.forumsAppPayload=[CHAINE_A_RECUPERER]</script>
La classe Python suivante permet d'interagir avec les forums de cette manière. Il vous suffit d'entrer la valeur de votre cookie ''coniunctio'' et d'appeler les fonctions souhaitées avec le contenu des messages ou topics.


Bien que cette méthode permette d'outrepasser les captchas, il se peut que vous soyez bloqué par le site en envoyant un trop grand nombre de requêtes dans un trop court laps de temps.
Pour récupérer les valeurs dans la chaîne :
const forumsAppPayload = [...document.scripts].map(s => s.textContent.match(/forumsAppPayload\s*=\s*["']([^"']+)["']/)).filter(Boolean)[0][1];
const decoded = JSON.parse(atob(forumsAppPayload));


Auparavant, ces valeurs étaient disponibles depuis des ''inputs'' cachées dans le code HTML des pages de forums/topics et situées dans la ''div'' nommée ''js-form-session-data''.
Si l'on veut envoyer un message sur un topic (ou un forum), il faudra d'abord envoyer une requête ''GET'' à l'URL associée et récupérer ces valeurs chiffrées avant d'envoyer une requête ''POST'' à l'URL avec le contenu du message en plus de ces dernières.
'''Pour poster un message''', la requête POST devra être faite à <code>https://www.jeuxvideo.com/forums/message/add</code> avec le ''header'' <code>Content-Type</code> valant <code>multipart/form-data</code> et les données suivantes en ''body'' :
<pre>
<pre>
import requests, json
text : le contenu du message
from requests import Response
topicId : ID du topic cible
from bs4 import BeautifulSoup
topicTitle : titre du topic (si c'est une création du topic)
forumId : ID du forum cible
group : mettre à 1
messageId : undefined
toutes les clé/valeurs qui commencent par fs_ (à trouver selon la méthode donnée précédemment) + ajax_hash
</pre>


DIV_CLASS = 'js-form-session-data'
'''Pour poster un topic''',  la requête POST devra être faite à <code>https://www.jeuxvideo.com/forums/topic/add</code> avec le ''header'' <code>Content-Type</code> valant <code>multipart/form-data</code> et les données suivantes en ''body'' :
<pre>
text : le contenu du message
topicId : mettre à 0
topicTitle : titre du topic (si c'est une création du topic)
forumId : ID du forum cible
group : mettre à 1
messageId : undefined
toutes les clé/valeurs qui commencent par fs_ (à trouver selon la méthode donnée précédemment) + ajax_hash
submitSurvey : true pour ajouter un sondage, false sinon
answerSurvey : titre du sondage s'il y en a un
responsesSurvey[] : une réponse au sondage
</pre>


class ForumClient:
'''Note''' : À date, ces informations sont uniquement offusquées dans la partie forum. Les messages privés conservent les informations en clair dans le HTML comme mentionné plus haut.
    def __init__(self, coniuntio: str):
        self._cookies = {'coniunctio':coniuntio}


    def _scrape_input_tokens(self, res: Response) -> dict:
== Limitations ==
        soup = BeautifulSoup(res.text, 'html.parser')
L'API v4 comporte plusieurs limitations :
        form = soup.find('div', {'class':DIV_CLASS})
* Il est impossible d'outrepasser les protections [[captcha|captchas]] requises par le site notamment pour [[DDB|signaler]] un message.
        jsi = form.findChildren("input")
* Il est impossible de s'inscrire en utilisation l'''endpoint'' <code>accounts/register</code> car celui-ci nécessite un ''header'' contenant le ''token'' FireBase généré lors de l'installation de l'application (voir le [[#jvc-auth-header|paragraphe à ce sujet]]). Une solution serait de créer un grand nombre de machines virtuelles (ou d'en automatiser la création), et pour chacune d'entre elles d'intercepter le trafic de l'application (voir [[#interception|section associée]]) pour récupérer et conserver les ''tokens'' dans un fichier. Cette méthode, longue et fastidieuse, ne permettrait donc pas de générer un nombre infini de comptes. Une autre méthode possible, bien qu'elle n'utilise pas l'API, serait de créer un compte sur le site à l'aide d'un ''webdriver''. Celle-ci fonctionne (l'auteur de ce paragraphe l'a déjà implémentée) mais il serait difficile de la rendre compatible pour toutes les plateformes (du fait de la nécessité d'avoir un VPN gérable depuis un script).
       
* Il est particulièrement hardu de faire du ''web scraping'' sur les pages de forum puisque l'API renvoie une page HTML et non un fichier JSON dans ce cas.
        tokens = {
            "fs_session":jsi[0].attrs["value"],
            "fs_timestamp":jsi[1].attrs["value"],
            "fs_version":jsi[2].attrs["value"],
            jsi[3].attrs["name"]:jsi[3].attrs["value"],
            "form_alias_rang":"1",
            "g-recaptcha-response":""
        }
       
        return tokens


    def _get_forum_URL(self, forum_id) -> str:
==Ressources==
        return requests.get(f'https://www.jeuxvideo.com/forums/0-{forum_id}-0-1-0-1-0-a.htm').url
*[https://archive.org/details/jeuxvideo.com-pc-et-consoles-5.4.7-apkpure APK 5.4.7] décompilable avec JADX.
*[https://pastebin.com/LWNDQDKy Classe PHP] exploitant l'API (cette classe est incomplète et sera possiblement rendue obsolète dans le temps).


    def _get_topic_URL(self, topic_id) -> str:
= API jvc.gg (dépréciée) =
        return requests.get(f'https://www.jeuxvideo.com/forums/42-1-{topic_id}-1-0-1-0-a.htm').url
{{Bannière Note|Contenu=Le contenu qui va suivre concerne l'ancienne API qui n'existe plus.}}


    def post_message(self, topic_id: int, message: str) -> Response:
[[File:phoenix.png|300px|vignette|La page Phoenix des jeux.]]
        """
        topic_id, int : ID du topic
        message, str : votre message


        renvoie un objet Response
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].
        """
        topic_URL = self._get_topic_URL(topic_id)
        res = requests.get(topic_URL, cookies=self._cookies)


        data = self._scrape_input_tokens(res)
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.
        data['message_topic'] = message


        res = requests.post(topic_URL, data=data, cookies=self._cookies)
{{clear}}


        return res
== Rétro-ingénierie ==
L'API étant privée, il a fallu procéder par rétro-ingénierie pour la documenter.


    def post_topic(self, forum_id: int, titre: str, message: str, sondage: dict = None) -> Response:
Les appels à l'API sont effectués depuis un script chargé par les pages Phoenix. Les noms de variable sont obfusqués mais pas les chaînes de caractère : ainsi une partie des ''endpoints'' y sont lisibles. Ce script est téléchargeable [https://archive.org/details/phoenix_script ici].
        """
        forum_id, int : ID du forum
        titre, str : titre du topic
        message, str : corps du topic


        [sondage], dict : dictionnaire de la forme {
Il est également possible d'observer les URL et les contenus des requêtes depuis le panneau ''Network'' (ou ''Réseau'') des [https://developer.mozilla.org/fr/docs/Learn/Common_questions/Tools_and_setup/What_are_browser_developer_tools outils de développement Web].
            "question_sondage" : "Question ?",
            "reponse_sondage[]" : ["reponse 1", "reponse 2"]
        }
        """
        forum_URL = self._get_forum_URL(forum_id)
        res = requests.get(forum_URL, cookies=self._cookies)
        data = self._scrape_input_tokens(res)


        data['titre_topic'] = titre
== Préambule ==
        data['message_topic'] = message
L'API jvc.gg est basée sur l'utilisation de ''JSON Web Token'' (JWT), un standard utilisé pour créer des jetons de sécurité qui permettent de transférer de l'information de manière sécurisée entre deux parties au format JSON.
        if sondage:
            data |= sondage
            data['submit_sondage'] = '1'


        res = requests.post(forum_URL, data=data, cookies=self._cookies)
Lorsque vous visitez pour la première fois une page Phoenix, le serveur de JVC renvoie une requête comportant un cookie ''accessToken''. La valeur de ce cookie est une chaîne de caractères encodée au format JWT qui contient notamment votre ID de compte et la valeur de votre cookie ''coniunctio''. La fonction Python suivante permet de récupérer le cookie ''accessToken'' en fonction de votre cookie ''coniunctio'' :
 
<pre>
        return res
 
if __name__ == '__main__':
    client = ForumClient("votre coniunctio ici")
    # Exemples d'utilisation
    # Pour poster un message
    client.post_message(74204156, "Je poste depuis Python :)")
    # Pour poster un topic
    client.post_topic(51, 'Je poste depuis Python', 'Et toi ? :)')
</pre>
 
== Limitations ==
L'API v4 comporte plusieurs limitations :
* Il est impossible d'outrepasser les protections [[captcha|captchas]] requises par le site notamment pour [[DDB|signaler]] un message.
* Il est impossible de s'inscrire en utilisation l'''endpoint'' <code>accounts/register</code> car celui-ci nécessite un ''header'' contenant le ''token'' FireBase généré lors de l'installation de l'application (voir le [[#jvc-auth-header|paragraphe à ce sujet]]). Une solution serait de créer un grand nombre de machines virtuelles (ou d'en automatiser la création), et pour chacune d'entre elles d'intercepter le trafic de l'application (voir [[#interception|section associée]]) pour récupérer et conserver les ''tokens'' dans un fichier. Cette méthode, longue et fastidieuse, ne permettrait donc pas de générer un nombre infini de comptes. Une autre méthode possible, bien qu'elle n'utilise pas l'API, serait de créer un compte sur le site à l'aide d'un ''webdriver''. Celle-ci fonctionne (l'auteur de ce paragraphe l'a déjà implémentée) mais il serait difficile de la rendre compatible pour toutes les plateformes (du fait de la nécessité d'avoir un VPN gérable depuis un script).
* Il est particulièrement hardu de faire du ''web scraping'' sur les pages de forum puisque l'API renvoie une page HTML et non un fichier JSON dans ce cas.
 
==Ressources==
*[https://archive.org/details/jeuxvideo.com-pc-et-consoles-5.4.7-apkpure APK 5.4.7] décompilable avec JADX.
*[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 =
Cette API est une API distincte de la ''v4'' et utilisée par la partie Phoenix du site, c'est-à-dire les pages listant les jeux dont la principale est [https://www.jeuxvideo.com/tous-les-jeux/ celle-ci]. Elle est hébergée sur le domaine [https://api.jvc.gg api.jvc.gg].
 
== Préambule ==
L'API jvc.gg est basée sur l'utilisation de ''JSON Web Token'' (JWT), un standard utilisé pour créer des jetons de sécurité qui permettent de transférer de l'information de manière sécurisée entre deux parties au format JSON.
 
Lorsque vous visitez pour la première fois une page Phoenix, le serveur de JVC renvoie une requête comportant un cookie ''accessToken''. La valeur de ce cookie est une chaîne de caractères encodée au format JWT qui contient notamment votre ID de compte et la valeur de votre cookie ''coniunctio''. La fonction Python suivante permet de récupérer le cookie ''accessToken'' en fonction de votre cookie ''coniunctio'' :
<pre>
def get_access_cookie(coniunctio: str) -> str:
def get_access_cookie(coniunctio: str) -> str:
   cookies = {'coniunctio':coniunctio}
   cookies = {'coniunctio':coniunctio}
Ligne 946 : Ligne 941 :
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 969 : Ligne 964 :
Par exemple, si vous souhaitez obtenir la liste des jeux PS4 de genre action RPG et de forme multi en ligne, votre chaîne de ''queries'' devra être <code>platform=ps4&gameGenre=action_rpg&gameMode=multiplayer_online</code>.
Par exemple, si vous souhaitez obtenir la liste des jeux PS4 de genre action RPG et de forme multi en ligne, votre chaîne de ''queries'' devra être <code>platform=ps4&gameGenre=action_rpg&gameMode=multiplayer_online</code>.


De plus, les ''queries'' ''offset'' et ''limit'', de type ''int'', représentent respectivement le numéro du jeu dans la liste à partir duquel les jeux sont listés (par défaut 0) et le nombre du jeu à lister (par défaut 100).
De plus, le ''query'' ''release'' désigne la date de sortie du jeu, '''compatible seulement avec les catégories <code>best</code> et <code>releases</code>'''. Il peut s'agir d'une année ou d'une décennie (dans ce cas, la valeur du ''query'' représentera la première année de la décennie suivie du caractère 'd' ; par exemple, <code>2010d</code> pour les années 2010). Pour les jeux pas encore sortis, ce ''query'' peut également contenir le mois (par exemple : <code>2024-07</code> pour juillet 2024). Incompatible avec la catégorie <code>currentBest</code>.
 
Enfin, le ''query'' ''release'' désigne la date de sortie du jeu, '''compatible seulement avec les catégories <code>best</code> et <code>releases</code>'''. Il peut s'agir d'une année ou d'une décennie (dans ce cas, la valeur du ''query'' représentera la première année de la décennie suivie du caractère 'd' ; par exemple, <code>2010d</code> pour les années 2010). Pour les jeux pas encore sortis, ce ''query'' peut également contenir le mois (par exemple : <code>2024-07</code> pour juillet 2024). Incompatible avec la catégorie <code>currentBest</code>.


=== Queries des news ===
=== Queries des news ===
Ligne 981 : Ligne 974 :


=== 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/Dk4SkDkA ici].
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 988 : Ligne 981 :
Notez que le ''query editorialRatingRange'' doit être encodé au format URL avant d'être envoyé.
Notez que le ''query editorialRatingRange'' doit être encodé au format URL avant d'être envoyé.


=== Liste des endpoints connus ===
=== Queries des previews ===
Les ''queries'' renseignent la plateforme, le genre et l'événement des jeux testés. La liste complète des valeurs des ''queries'' possibles pour ces attributs est disponible au format JSON [https://pastebin.com/xaqTQPfr ici].
 
Par exemple, si vous souhaitez obtenir la liste des ''previews'' des jeux PS5 de genre FPS en rapport avec l'événement ''Find Your Next Game'', votre chaîne de ''queries'' devra être <code>platform=ps5&gameGenre=fps&event=fyng</code>.
 
=== Queries des vidéos ===
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].


{| class="wikitable"
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>.
|+GET
 
=== 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 ===
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 ===
 
{| class="wikitable"
|+GET
!PATH
!PATH
!PARAMS
!PARAMS
Ligne 1 015 : Ligne 1 031 :
'''limit''' int <br>
'''limit''' int <br>
'''release''' str
'''release''' str
|Renvoie la liste des jeux tendances triés par note décroissante des rédacteurs JVC et satisfaisant les ''queries''.
|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 025 : Ligne 1 041 :
'''limit''' int <br>
'''limit''' int <br>
'''release''' str
'''release''' str
|Renvoie la liste des jeux attendus triés par date de sortie croissante et satisfaisant les ''queries''.
|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 035 : Ligne 1 051 :
'''limit''' int <br>
'''limit''' int <br>
'''release''' str
'''release''' str
|Renvoie la liste des jeux attendus triés par titre croissant et satisfaisant les ''queries''.
|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 047 : Ligne 1 063 :
'''limit''' int
'''limit''' int
|Renvoie la liste des actualités triées par date de publication croissante et satisfaisant les ''queries''.
|Renvoie la liste des actualités triées par date de publication croissante et satisfaisant les ''queries''.
|-
|previews/datePublished.desc
|
| '''offset''' int <br>
'''limit''' int
|Renvoie la liste des annonces triées par date de publication croissante et satisfaisant les ''queries''.
|-
|-
|reviews/datePublished.desc
|reviews/datePublished.desc
Ligne 1 090 : Ligne 1 100 :
|Renvoie la liste des tests triés par nom croissant du jeu et satisfaisant les ''queries''.
|Renvoie la liste des tests triés par nom croissant du jeu et satisfaisant les ''queries''.
|-
|-
|topics/datePublished.desc
|previews/datePublished.desc
|
|
| '''offset''' int <br>
|'''platform''' str <br>
'''gameGenre''' str <br>
'''event''' str <br>
'''offset''' int <br>
'''limit''' int
'''limit''' int
|Renvoie la liste des articles triés 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
|
|
| '''offset''' int <br>
|'''publicationType''' str <br>
'''platform''' str <br>
'''gameGenre''' str <br>
'''event''' str <br>
'''offset''' int <br>
'''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 527 : Ligne 1 553 :
[[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é}}
Kheys
423

modifications