|
|
| (Une version intermédiaire par le même utilisateur non affichée) |
| 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]].}} | | {{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]]''', conçue par les développeurs du site pour l'application mobile, permet de programmatiser l'envoi de requêtes à JVC. |
| | É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. |
|
| |
|
| Actuellement, deux API sont utilisées : l'api ''v4'' et l'api ''jvc.gg'' :
| | En juin 2025, l'API est hébergée sur le sous-domaine ''api'', et est à sa quatrième version (''v4''). |
| * 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.
| |
| * 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. | | 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> | | <div id="jvclient"></div> |
| Ligne 894 : |
Ligne 895 : |
|
| |
|
| '''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. | | '''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. |
|
| |
| === Script Python ===
| |
| 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.
| |
|
| |
| <pre>
| |
| import requests, json
| |
| from requests import Response
| |
| from bs4 import BeautifulSoup
| |
|
| |
| DIV_CLASS = 'js-form-session-data'
| |
|
| |
| class ForumClient:
| |
| def __init__(self, coniuntio: str):
| |
| self._cookies = {'coniunctio':coniuntio}
| |
|
| |
| def _scrape_input_tokens(self, res: Response) -> dict:
| |
| soup = BeautifulSoup(res.text, 'html.parser')
| |
| form = soup.find('div', {'class':DIV_CLASS})
| |
| jsi = form.findChildren("input")
| |
|
| |
| 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:
| |
| return requests.get(f'https://www.jeuxvideo.com/forums/0-{forum_id}-0-1-0-1-0-a.htm').url
| |
|
| |
| def _get_topic_URL(self, topic_id) -> str:
| |
| return requests.get(f'https://www.jeuxvideo.com/forums/42-1-{topic_id}-1-0-1-0-a.htm').url
| |
|
| |
| def post_message(self, topic_id: int, message: str) -> Response:
| |
| """
| |
| topic_id, int : ID du topic
| |
| message, str : votre message
| |
|
| |
| renvoie un objet Response
| |
| """
| |
| topic_URL = self._get_topic_URL(topic_id)
| |
| res = requests.get(topic_URL, cookies=self._cookies)
| |
|
| |
| data = self._scrape_input_tokens(res)
| |
| data['message_topic'] = message
| |
|
| |
| res = requests.post(topic_URL, data=data, cookies=self._cookies)
| |
|
| |
| return res
| |
|
| |
| def post_topic(self, forum_id: int, titre: str, message: str, sondage: dict = None) -> Response:
| |
| """
| |
| forum_id, int : ID du forum
| |
| titre, str : titre du topic
| |
| message, str : corps du topic
| |
|
| |
| [sondage], dict : dictionnaire de la forme {
| |
| "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
| |
| data['message_topic'] = message
| |
| if sondage:
| |
| data |= sondage
| |
| data['submit_sondage'] = '1'
| |
|
| |
| res = requests.post(forum_URL, data=data, cookies=self._cookies)
| |
|
| |
| 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 == | | == Limitations == |