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

De JVFlux
(→‎Ressources : Utilisation, connexion, mise en page)
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.
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<ref>https://fr.wikipedia.org/wiki/JavaScript_Object_Notation</ref>, ce qui fait qu'elle est plus facile à parser<ref>[https://fr.wiktionary.org/wiki/parser#:~:text=Verbe,-parser%20%5Cpa%CA%81.se&text=(Anglicisme%20informatique)%20(Programmation),ou%20en%20extraire%20des%20%C3%A9l%C3%A9ments. https://fr.wiktionary.org/wiki/parser#:~:text=Verbe,-parser%20%5Cpa%CA%81.se&text=(Anglicisme%20informatique)%20(Programmation),ou%20en%20extraire%20des%20%C3%A9l%C3%A9ments.]</ref>, mais aussi plus rapide à charger qu'une page web normale.
L'API est hébergée sur le sous-domaine "api", et est actuellement à sa quatrième version (v4).


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", et est actuellement à sa quatrième version (v4).
=API v4=


=API v4=
===Utilisation ===
L'API v4 utilise une sécurité afin que personne ne puisse y accéder. Pour la contourner, le ''header'' de vos requêtes devra toujours être de la forme :
L'API v4 utilise une sécurité, l'en-tête HTTP <code>Jvc-Authorization</code> , sa valeur dépend d'une clé fixe <code>partner_key</code>, d'une <code>signature</code>  et de la <code>date</code> .
 
Le ''header'' de vos requêtes devra toujours être de la forme:
<pre>
<pre>
"Jvc-Authorization " : "header"
"Jvc-Authorization " : "header"
Ligne 12 : Ligne 14 :
"Content-Type" : "application/json"
"Content-Type" : "application/json"
</pre>
</pre>
Où '''''header''''' est égal à une chaîne de charactère de cette forme : ''"PartnerKey='''<u>partner_key</u>''', Signature='''<u>signature</u>''', Timestamp='''<u>date</u>'''".'' (Voir section rétro-ingénierie pour plus d'information)
Où '''''header''''' est égal à une chaîne de charactère de cette forme: ''"PartnerKey='''<u>partner_key</u>''', Signature='''<u>signature</u>''', Timestamp='''<u>date</u>'''".''


'''Voici un script [https://www.python.org/ python] qui construit "''header''"'''
'''Voici un script [https://www.python.org/ python] qui construit "''header''"'''
Ligne 43 : Ligne 45 :
print(authorizationHeader)
print(authorizationHeader)
</pre>
</pre>
== API endpoints ==
{{BoxNotice|Si vous remarquez qu'une information est erronée ou si vous êtes assez compétent en programmation pour nous aider à complèter la documentation, n'hésitez pas à venir sur le [https://discord.gg/wKBSHv2mdU discord de Jvflux] ou à me contacter en message privé sur [https://onche.org/profil/christianronald Onche]}}
'''URL de base de l'API''' : ''<nowiki>https://api.jeuxvideo.com/v4/</nowiki>''


* '''T''' : Est-ce que l'endpoint à été testé ? N = non, O = Oui
===Connexion===
* '''URL''' : URL de l'endpoint
Comme pour l'ancienne API, le cookie '''''coniunctio''''' est toujours le cookie de session utilisateur. Il doit être récupéré avec l'appel au point d'entrée ''login'' (voir tableau POST) puis il doit être envoyé dans une en-tête HTTP "Cookie": "'''''coniunctio'''''" pour chaque appel.
* '''PARAMS''' : Variable entre accolades à remplacer dans l'URL, suivi de son type ''str'' ou ''int''.  
 
** <code>contents/{contentID}/comments</code> doit être appelé comme suivant <code>contents/someID1234/comments</code>
==API endpoints==
* '''QUERY''' : '''''page''''' int '''''perPage''''' int : <code>api.jeuxvideo.com/v4/contents/1234ID/comments?page=1&perPage=30</code>
{{BoxInfo|Si vous remarquez qu'une information est erronée ou si vous êtes assez compétent en programmation pour nous aider à complèter la documentation, n'hésitez pas à venir sur le [https://discord.gg/wKBSHv2mdU discord de Jvflux] ou à me contacter en message privé sur [https://onche.org/profil/christianronald Onche]}}
* '''BODY''' : Corps de la requête au format JSON
'''URL de base de l'API''': ''<nowiki>https://api.jeuxvideo.com/v4/</nowiki>''
Le fichier JSON avec les <code>ids</code> pour les ''params'' et les ''query strings'' <code>chronicles</code> <code>modes</code> <code>genres</code> <code>events</code> <code>machine</code> <code>categories</code> (obtenu via la requête '''GET''' ''config'') : https://pastebin.com/L1DXfP0C
 
{| class="wikitable mw-collapsible"
*'''URL''': URL de l'endpoint
*'''PARAMS''': Variable entre accolades à remplacer dans l'URL, suivi de son type ''str'' ou ''int''.  
**<code>contents/{contentID}/comments</code> doit être appelé comme suivant <code>contents/someID1234/comments</code>
*'''QUERY''': Par exemple pour les deux query '''''page''''' int, '''''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
Le fichier JSON avec les <code>ids</code> pour les ''params'' et les ''query strings'' <code>chronicles</code> <code>modes</code> <code>genres</code> <code>events</code> <code>machine</code> <code>categories</code> (obtenu via la requête '''GET''' ''config'') https://pastebin.com/L1DXfP0C
{| class="wikitable sortable"
|+POST
|+POST
!NOM
!NOM
!URL
!URL
!PARAMS
!PARAMS  
!BODY
!BODY
!T
|-
|-
|addComment
|addComment
Ligne 66 : Ligne 70 :
|'''contentID''' str
|'''contentID''' str
|<pre>"content": "commentaire"</pre>
|<pre>"content": "commentaire"</pre>
|N
|-
|-
|addCommentVote
|addCommentVote
Ligne 73 : Ligne 76 :
'''commentID''' str
'''commentID''' str
|<pre>"type": 1 ou -1</pre>
|<pre>"type": 1 ou -1</pre>
|N
|-
|-
|addFavorisGames
|addFavorisGames
|accounts/{accountId}/favorites/games
|accounts/{accountId}/favorites/games
|'''accountId''' str
| '''accountId''' str
|<pre>"games": [{
|<pre>"games": [{
     "id": 1,
     "id": 1,
Ligne 83 : Ligne 85 :
]}
]}
</pre>
</pre>
|N
|-
|-
|addReply
|addReply
Ligne 90 : Ligne 91 :
'''commentID''' str
'''commentID''' str
|"content": "Super jeu !"
|"content": "Super jeu !"
|N
|-
|-
|addReview
|addReview
|games/{id}/{machine}/reviews/users
|games/{id}/{machine}/reviews/users  
|'''id''' int
|'''id''' int
'''machine''' str  
'''machine''' str  
Ligne 101 : Ligne 101 :
"onProfile": true
"onProfile": true
</pre>
</pre>
|N
|-
|-
|login  
|login
|accounts/login
|accounts/login
|
|
Ligne 109 : Ligne 108 :


"password": "mot_de_passe"
"password": "mot_de_passe"
|O
|-
|-
|logout
|logout
Ligne 115 : Ligne 113 :
|
|
|
|
|O
|-
|-
|register  
|register
|accounts/register  
|accounts/register  
''l'<nowiki/>'''Header''' doit inclure'' : "Jvc-Auth-Token" : str
''l'<nowiki/>'''Header''' doit inclure'' : "Jvc-Auth-Token" : str
Ligne 126 : Ligne 123 :
"optin": false
"optin": false
</pre>
</pre>
|N
|-
|-
|reinitPassword  
|reinitPassword
|accounts/reset
|accounts/reset
|
|
Ligne 143 : Ligne 139 :
        "val2" ]}
        "val2" ]}
</pre>
</pre>
|N
|-
|-
|reportAccount
|reportAccount
Ligne 151 : Ligne 146 :


"message": "Raison"
"message": "Raison"
|N
|-
|-
|reportComment
| reportComment
|contents/{contentID}/comments/{commentID}/report
|contents/{contentID}/comments/{commentID}/report
|'''contentID''' str
|'''contentID''' str
'''commentID''' str
'''commentID''' str  
|<pre>"reason": 1,
|<pre>"reason": 1,
"message": "Raison",
"message": "Raison",
Ligne 165 : Ligne 159 :
}
}
</pre>
</pre>
|N
|-
|-
|reportReview
|reportReview
Ligne 179 : Ligne 172 :
     "valeur_captcha": ""
     "valeur_captcha": ""
}</pre>
}</pre>
|N
|-
|-
|restoreComment
|restoreComment
Ligne 186 : Ligne 178 :
'''commentID''' str
'''commentID''' str
|"content" : "comment"
|"content" : "comment"
|N
|-
|-
|validateAccount
|validateAccount
Ligne 196 : Ligne 187 :
"password": "mdp"
"password": "mdp"
</pre>
</pre>
|N
|-
|-
|validateSignature
|validateSignature
Ligne 204 : Ligne 194 :
"signed_data": "signed_data"
"signed_data": "signed_data"
</pre>
</pre>
|N
|}
|}
{| class="wikitable mw-collapsible"
{| class="wikitable"
|+GET
|+GET
!NOM
!NOM
!URL
!URL
!PARAMS
!PARAMS
!QUERY
!QUERY  
!T
|-
|-
|config
|config
Ligne 218 : Ligne 206 :
|
|
|
|
|O
|-
|-
|getAccount
|getAccount
Ligne 224 : Ligne 211 :
|'''accountId''' str
|'''accountId''' str
|
|
|O
|-
|-
|getAllFavorisGames
|getAllFavorisGames
Ligne 230 : Ligne 216 :
|'''accountId''' str
|'''accountId''' str
|
|
|O
|-
|-
|getArticle
|getArticle
Ligne 236 : Ligne 221 :
|'''id''' int
|'''id''' int
|
|
|N
|-
|-
|getArticleList
|getArticleList
Ligne 244 : Ligne 228 :
'''perPage''' int
'''perPage''' int
'''types''' str
'''types''' str
|N
|-
|-
|getCaptcha
|getCaptcha
Ligne 250 : Ligne 233 :
|
|
|'''nb''' int
|'''nb''' int
|O
|-
|-
|getChroniclesSummary
|getChroniclesSummary
Ligne 256 : Ligne 238 :
|
|
|'''machines''' str
|'''machines''' str
|N
|-
|-
|getComment
|getComment
Ligne 263 : Ligne 244 :
'''commentID''' str
'''commentID''' str
|
|
|N
|-
|-
|getCommentAnswers
|getCommentAnswers
Ligne 270 : Ligne 250 :
'''commentID''' str
'''commentID''' str
|
|
|N
|-
|-
|getComments
|getComments
Ligne 277 : Ligne 256 :
|'''page''' int
|'''page''' int
'''perPage''' int
'''perPage''' int
|N
|-
|-
|getContentBean
|getContentBean
|contents/{id}
|contents/{id}
|'''id''' int
|'''id''' int
|
|
|
|-
|-
Ligne 294 : Ligne 271 :
'''page''' int
'''page''' int
'''perPage''' int
'''perPage''' int
|N
|-
|-
|getCurrentAccountReport
|getCurrentAccountReport
|accounts/{accountId}/report
|accounts/{accountId}/report
|'''accountId''' str
|'''accountId''' str
|
|
|
|-
|-
Ligne 307 : Ligne 282 :
'''commentID''' str
'''commentID''' str
|
|
|N
|-
|-
|getCurrentReviewReport
|getCurrentReviewReport
Ligne 315 : Ligne 289 :
'''reviewId''' int
'''reviewId''' int
|
|
|N
|-
|-
|getFavoris
|getFavoris
Ligne 321 : Ligne 294 :
|'''accountId''' str
|'''accountId''' str
|
|
|N
|-
|-
|getFavorisForum
|getFavorisForum
Ligne 328 : Ligne 300 :
|'''page''' int
|'''page''' int
'''perPage''' int
'''perPage''' int
|N
|-
|-
|getFavorisGames
|getFavorisGames
|accounts/{accountId}/favorites/games
|accounts/{accountId}/favorites/games  
|'''accountId''' str
|'''accountId''' str
|
|
|N
|-
|-
|getFavorisTopics
|getFavorisTopics
Ligne 341 : Ligne 311 :
|'''page''' int
|'''page''' int
'''perPage''' int
'''perPage''' int
|N
|-
|-
|getFolder
|getFolder
|contents/{id}
|contents/{id}
|'''id''' int
|'''id''' int  
|
|
|N
|-
|-
|getGame
|getGame
Ligne 354 : Ligne 322 :
'''machine''' str
'''machine''' str
|
|
|N
|-
|-
|getGameDetails
| getGameDetails
|games/{id}/{machine}/details
|games/{id}/{machine}/details
|'''id''' int
|'''id''' int
'''machine''' str
'''machine''' str
|
|
|N
|-
|-
|getGameImages
|getGameImages
Ligne 369 : Ligne 335 :
|'''page''' int
|'''page''' int
'''perPage''' int
'''perPage''' int
|N
|-
|-
|getGameList
|getGameList
Ligne 380 : Ligne 345 :
'''page''' int
'''page''' int
'''perPage''' int
'''perPage''' int
|N
|-
|-
|getGameNews
|getGameNews
Ligne 387 : Ligne 351 :
|'''page''' int
|'''page''' int
'''perPage''' int
'''perPage''' int
|N
|-
|-
|getGameReleaseList
|getGameReleaseList
|games/releases
| games/releases
|
|
|'''month''' str
| '''month''' str
'''year''' str
'''year''' str
'''machines''' str
'''machines''' str
'''page''' int
'''page''' int
'''perPage''' int
'''perPage''' int
|N
|-
|-
|getGameReview
|getGameReview
Ligne 405 : Ligne 367 :
'''review''' str
'''review''' str
|
|
|N
|-
|-
|getGameReviews
|getGameReviews
Ligne 411 : Ligne 372 :
|'''id''' int
|'''id''' int
|
|
|N
|-
|-
|getGameReviews
|getGameReviews
Ligne 418 : Ligne 378 :
'''machine''' str
'''machine''' str
|
|
|N
|-
|-
|getGameSummary
|getGameSummary  
|contents/games
|contents/games
|
|
|'''machines''' str
|'''machines''' str
|N
|-
|-
|getGameUserReviews
|getGameUserReviews
Ligne 432 : Ligne 390 :
|'''page''' int
|'''page''' int
'''perPage''' int
'''perPage''' int
|N
|-
|-
|getGameVideos
|getGameVideos
|games/{id}/{machine}/videos
|games/{id}/{machine}/videos  
|'''id''' int
|'''id''' int
'''machine''' str
'''machine''' str
|'''page''' int
|'''page''' int
'''perPage''' int
'''perPage''' int
|N
|-
|-
|getGameWikis
|getGameWikis
Ligne 448 : Ligne 404 :
|'''page''' int
|'''page''' int
'''perPage''' int
'''perPage''' int
|N
|-
|-
|getHeadlineList
|getHeadlineList
|contents/trending
| contents/trending
|
|
|'''machines''' str
|'''machines''' str
'''page''' int
'''page''' int
'''perPage''' int
'''perPage''' int
|N
|-
|-
|getHighTechSummary
| getHighTechSummary
|contents/hightech
|contents/hightech
|
|
|'''machines''' str
|'''machines''' str
|N
|-
|-
|getLightGame
|getLightGame
Ligne 469 : Ligne 422 :
'''machine''' str
'''machine''' str
|
|
|N
|-
|-
|getNews
|getNews
Ligne 475 : Ligne 427 :
|'''id''' int
|'''id''' int
|
|
|N
|-
|-
|getNewsHighTech
|getNewsHighTech
Ligne 482 : Ligne 433 :
|'''page''' int
|'''page''' int
'''perPage''' int
'''perPage''' int
|N
|-
|-
|getPageContents
|getPageContents  
|accounts/{accountId}/page/contents
|accounts/{accountId}/page/contents
|'''accountId''' str
|'''accountId''' str
|'''page''' int
|'''page''' int
'''perPage''' int
'''perPage''' int
|N
|-
|-
|getPageReviews
|getPageReviews
Ligne 496 : Ligne 445 :
|'''page''' int
|'''page''' int
'''perPage''' int
'''perPage''' int
|N
|-
|-
|getProfile
|getProfile
Ligne 502 : Ligne 450 :
|'''accountId''' str
|'''accountId''' str
|
|
|N
|-
|-
|getProfilePage
|getProfilePage
Ligne 508 : Ligne 455 :
|'''accountId''' str
|'''accountId''' str
|
|
|N
|-
|-
|getRelatedNews
|getRelatedNews
Ligne 515 : Ligne 461 :
|'''page''' int
|'''page''' int
'''perPage''' int
'''perPage''' int
|N
|-
|-
|getRelatedVideos
|getRelatedVideos
Ligne 522 : Ligne 467 :
|'''page''' int
|'''page''' int
'''perPage''' int
'''perPage''' int
|N
|-
|-
|getRelatedWikis
|getRelatedWikis
Ligne 529 : Ligne 473 :
|'''page''' int
|'''page''' int
'''perPage''' int
'''perPage''' int
|N
|-
|-
|getSpecificNews
|getSpecificNews
Ligne 535 : Ligne 478 :
|
|
|
|
|N
|-
|-
|getStores
|getStores
Ligne 542 : Ligne 484 :
'''machine''' str
'''machine''' str
|
|
|N
|-
|-
|getTechList
|getTechList
Ligne 549 : Ligne 490 :
|'''page''' int
|'''page''' int
'''perPage''' int
'''perPage''' int
|N
|-
|-
|getTopWikis
|getTopWikis
Ligne 555 : Ligne 495 :
|
|
|
|
|N
|-
|-
|getTopsComments
|getTopsComments
Ligne 561 : Ligne 500 :
|'''contentID''' str
|'''contentID''' str
|
|
|N
|-
|-
|getVideo
|getVideo
Ligne 567 : Ligne 505 :
|'''id''' int
|'''id''' int
|
|
|N
|-
|-
|getVideoList
|getVideoList
Ligne 578 : Ligne 515 :
'''page''' int
'''page''' int
'''perPage''' int
'''perPage''' int
|N
|-
|-
|getVideosSummary
|getVideosSummary
|contents/videos
|contents/videos
|
|
|'''machines''' str
|'''machines''' str  
|N
|-
|-
|search
|search
Ligne 590 : Ligne 525 :
|
|
|'''q''' str
|'''q''' str
|N
|-
|-
|searchArticles
|searchArticles
Ligne 598 : Ligne 532 :
'''page''' int
'''page''' int
'''perPage''' int
'''perPage''' int
|N
|-
|-
|searchAutocomplete
|searchAutocomplete
Ligne 604 : Ligne 537 :
|
|
|'''q''' str
|'''q''' str
|N
|-
|-
|searchGames
|searchGames
Ligne 612 : Ligne 544 :
'''page''' int
'''page''' int
'''perPage''' int
'''perPage''' int
|N
|-
|-
|searchNews
|searchNews
Ligne 620 : Ligne 551 :
'''page''' int
'''page''' int
'''perPage''' int
'''perPage''' int
|N
|-
|-
|searchVideos
|searchVideos
Ligne 628 : Ligne 558 :
'''page''' int
'''page''' int
'''perPage''' int
'''perPage''' int
|N
|-
|-
|searchWikis
|searchWikis
|search/wikis
| search/wikis
|
|
|'''q''' str
|'''q''' str
'''page''' int
'''page''' int
'''perPage''' int
'''perPage''' int
|N
|-
|-
|sponso
|sponso
Ligne 642 : Ligne 570 :
|
|
|
|
|N
|}
|}
{| class="wikitable mw-collapsible"
{| class="wikitable sortable"
|+PUT
|+PUT
!NOM
!NOM
Ligne 650 : Ligne 577 :
!PARAMS
!PARAMS
!BODY
!BODY
!T
|-
|-
|saveDescription
|saveDescription
|accounts/me/profile/description
|accounts/me/profile/description  
|
|
|''rétro-ingénierie à faire''
|''rétro-ingénierie à faire''
|N
|-
|-
|saveExcludedMachines
|saveExcludedMachines
Ligne 662 : Ligne 587 :
|
|
|"machines" : [1, 2, 3, 4]  // id des machines
|"machines" : [1, 2, 3, 4]  // id des machines
|N
|-
|-
|saveMachines
|saveMachines
Ligne 668 : Ligne 592 :
|
|
|"machines" : [1, 2, 3, 4]  // id des machines
|"machines" : [1, 2, 3, 4]  // id des machines
|N
|-
|-
|updateComment  
|updateComment
 
|contents/{contentID}/comments/{commentID}
|contents/{contentID}/comments/{commentID}
|'''contentID''' str
|'''contentID''' str
'''commentID''' str
'''commentID''' str
|"content": "Super jeu !"
|"content": "Super jeu !"
|N
|-
|-
|uploadAvatar  
|uploadAvatar
|accounts/me/avatar
|accounts/me/avatar
|
|
|''rétro-ingénierie à faire''
|''rétro-ingénierie à faire''
|N
|-
|-
|uploadCover
|uploadCover
Ligne 687 : Ligne 609 :
|
|
|''rétro-ingénierie à faire''
|''rétro-ingénierie à faire''
|N
|}
|}
{| class="wikitable mw-collapsible"
{| class="wikitable sortable"
|+DELETE
|+GET
!NOM
!NOM
!URL
!URL
!PARAMS
!PARAMS
!T
|-
|-
|deleteComment  
|deleteComment
|contents/{contentID}/comments/{commentID}
|contents/{contentID}/comments/{commentID}
|'''contentID''' str
|'''contentID''' str
'''commentID''' str
'''commentID''' str
|N
|-
|-
|deleteCommentVote
|deleteCommentVote
Ligne 706 : Ligne 625 :
|'''contentID''' str
|'''contentID''' str
'''commentID''' str
'''commentID''' str
|N
|}
|}
{| class="wikitable mw-collapsible"
{| class="wikitable sortable"
|+CUSTOM HTTP (''rétro-ingénierie à faire'')
|+CUSTOM HTTP (''rétro-ingénierie à faire'')
!NOM
! NOM
!URL
!URL
!PARAMS
!PARAMS
!T
|-
|-
|deleteFavorisForum  
|deleteFavorisForum
|accounts/{accountId}/favorites/forums
|accounts/{accountId}/favorites/forums  
|'''accountId''' str
|'''accountId''' str
|N
|-
|-
|deleteFavorisGames
| deleteFavorisGames
|accounts/{accountId}/favorites/games
|accounts/{accountId}/favorites/games
|'''accountId''' str
|'''accountId''' str
|N
|-
|-
|deleteFavorisTopics  
|deleteFavorisTopics
|accounts/{accountId}/favorites/topics
|accounts/{accountId}/favorites/topics
|'''accountId''' str
|'''accountId''' str
|N
|}
|}


== Rétro-ingénierie de l'API et de l'application JVC ==
==Rétro-ingénierie de l'API et de l'application JVC==
Pour connaître les endpoints de l'API, il faut décompiler l'appli JVC.
Pour connaître les endpoints de l'API, il faut décompiler l'appli JVC.  


# Décompresser l'APK de l'application avec 7zip/Winrar/etc.
#Décompresser l'APK de l'application avec 7zip/Winrar/etc.
# Utiliser un décompilateur Dex vers Java, comme '''[https://github.com/skylot/jadx Jadx]''' .
#Utiliser un décompilateur Dex vers Java, comme '''[https://github.com/skylot/jadx Jadx]''' .


==== JvApiService ====
====JvApiService====
Une fois le code Java disponible, on peut ouvrir l'interface ''com.jeuxvideo.api.web.'''JvApiService''''', qui contient tous les endpoints. L'appli utilise le bibliothèque [https://square.github.io/retrofit/ Retrofit 2.x] pour gérer l'API, on peut facilement parcourir la documentation de cette bibliothèque pour découvrir ce qu'il faut faire comme requête aux différentes URL de l'API.
Une fois le code Java disponible, on peut ouvrir l'interface ''com.jeuxvideo.api.web.'''JvApiService''''', qui contient tous les endpoints. L'appli utilise le bibliothèque [https://square.github.io/retrofit/ Retrofit 2.x] pour gérer l'API, on peut facilement parcourir la documentation de cette bibliothèque pour découvrir ce qu'il faut faire comme requête aux différentes URL de l'API.


Ligne 771 : Ligne 685 :
</pre>
</pre>


== Ressources ==
==Ressources==
* Classe PHP exploitant l'API : https://pastebin.com/LWNDQDKy (Cette classe est incomplète et sera possiblement rendue obsolète dans le temps).
*Classe PHP exploitant l'API : https://pastebin.com/LWNDQDKy (Cette classe est incomplète et sera possiblement rendue obsolète dans le temps).
* ''(en cours de documentation)'' Fichier JSON modélisant l'API complète (compatible avec [https://www.postman.com/ Postman] et divers clients).
*''(en cours de documentation)'' Fichier JSON modélisant l'API complète (compatible avec [https://www.postman.com/ Postman] et divers clients).
* ''(en cours de documentation)'' Une bibliothèque JavaScript pour pouvoir interagir avec l'API sans devoir gérer les cookies et les headers.
*''(en cours de dev)'' Une bibliothèque JavaScript pour pouvoir interagir avec l'API sans devoir gérer les cookies et les headers.
 
=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==
=Ancienne API=
{{BoxNotice|Le contenu qui va suivre concerne l'ancienne API qui n'existe plus.}}
==Identification ==
L'API utilise le nom de domaine [https://ws.jeuxvideo.com/ ws.jeuxvideo.com]. Pour y accéder, il faut utiliser un des identifiants ci-dessous (authentification HTTP basique).
L'API utilise le nom de domaine [https://ws.jeuxvideo.com/ ws.jeuxvideo.com]. Pour y accéder, il faut utiliser un des identifiants ci-dessous (authentification HTTP basique).


Ligne 790 : Ligne 702 :
! scope="col" |Mot de passe
! scope="col" |Mot de passe
|-
|-
! scope="row" | Android 1.0
! scope="row" |Android 1.0
|appandr
|appandr  
|e32!cdf
|e32!cdf
|-
|-
! scope="row" |Android 2.0.3
! scope="row" |Android 2.0.3
| app_and_gnw
|app_and_gnw
| FC?4554?
|FC?4554?
|-
|-
! scope="row" | Android 2.5
! scope="row" |Android 2.5
|app_and_ms
|app_and_ms  
| D9!mVR4c
|D9!mVR4c
|-
|-
! scope="row" |Android MP
! scope="row" |Android MP
Ligne 806 : Ligne 718 :
|LXnb45=d#
|LXnb45=d#
|-
|-
! scope="row" | Android Tab
! scope="row" |Android Tab
|nex12sz
|nex12sz
| GT4!V2cT
|GT4!V2cT
|-
|-
! scope="row" |iPhone
! scope="row" |iPhone
Ligne 814 : Ligne 726 :
|W!P45-R
|W!P45-R
|-
|-
! scope="row" |iPad
! scope="row" |iPad  
|ip45de
|ip45de
|XpD5!FT
|XpD5!FT
Ligne 821 : Ligne 733 :
L'API est accessible en HTTP et en HTTPS, préférez la version HTTPS !
L'API est accessible en HTTP et en HTTPS, préférez la version HTTPS !


==Utilisation==
==Utilisation ==
===Connexion ===
===Connexion===
Pour vous connecter, utilisez la page [https://ws.jeuxvideo.com/mon_compte/connexion.php mon_compte/connexion.php].
Pour vous connecter, utilisez la page [https://ws.jeuxvideo.com/mon_compte/connexion.php mon_compte/connexion.php].


Ligne 833 : Ligne 745 :
|Le pseudo de l'utilisateur.
|Le pseudo de l'utilisateur.
|-
|-
|stamp
| stamp
|Le timestamp (le nombre de secondes depuis le 1er janvier 1970) à l'heure où la requête est envoyée.
|Le timestamp (le nombre de secondes depuis le 1er janvier 1970) à l'heure où la requête est envoyée.
|-
|-
Ligne 876 : Ligne 788 :
|-
|-
|02.news/''1234''.xml<br>02.news_screen/''1234''.xml
|02.news/''1234''.xml<br>02.news_screen/''1234''.xml
| Voir une news (le nombre correspond à l'id)
|Voir une news (le nombre correspond à l'id)
|-
|-
|ean.php?ean=''0045496830144''
|ean.php?ean=''0045496830144''
|Voir le jeu associé au code-barre (EAN) 0045496830144
|Voir le jeu associé au code-barre (EAN) 0045496830144
|-
|-
|forums_index.xml
| forums_index.xml
|Liste des forums généraux
|Liste des forums généraux
|-
|-
|search_n/''mario''<br>search/''mario''<br>search_sug/''mario''<br>search_forums/''mario''<br>search_forums_sug/''mario''
|search_n/''mario''<br>search/''mario''<br>search_sug/''mario''<br>search_forums/''mario''<br>search_forums_sug/''mario''
| Effectuer une recherche dans le nom des jeux ou des forums
|Effectuer une recherche dans le nom des jeux ou des forums
|-
|-
|tab_suggest_blocs.xml<br>tab_suggest_forums.xml
|tab_suggest_blocs.xml<br>tab_suggest_forums.xml
|''À compléter''
| ''À compléter''
|-
|-
|cgi-bin/liste.cgi
| cgi-bin/liste.cgi
|''À compléter''
|''À compléter''
|}
|}
Ligne 896 : Ligne 808 :
===Forums===
===Forums===
Pour les forums, les URL sont les mêmes que pour JVC, à part que :
Pour les forums, les URL sont les mêmes que pour JVC, à part que :
*Le .htm est transformé en .xml
* Le .htm est transformé en .xml
*Le www.jeuxvideo.com est remplacé par un ws.jeuxvideo.com
* 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).
*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 :<br>
Par exemple :<br>
Ligne 915 : Ligne 827 :
|-
|-
|https://ws.jeuxvideo.com/forums/0-50-0-1-0-1-2-cactus.xml
|https://ws.jeuxvideo.com/forums/0-50-0-1-0-1-2-cactus.xml
| Rechercher « cactus » dans le titre des topics
|Rechercher « cactus » dans le titre des topics
|-
|-
|https://ws.jeuxvideo.com/forums/1-50-1-1-0-1-0-0.xml
|https://ws.jeuxvideo.com/forums/1-50-1-1-0-1-0-0.xml
| Un topic
|Un topic
|-
|-
|https://ws.jeuxvideo.com/forums/3-50-0-1-0-1-0-0.xml
|https://ws.jeuxvideo.com/forums/3-50-0-1-0-1-0-0.xml
Ligne 926 : Ligne 838 :
|10 derniers messages d'un topic + formulaire
|10 derniers messages d'un topic + formulaire
|-
|-
|https://ws.jeuxvideo.com/forums/5-50-128244545-1-0-1-0-0.xml
|https://ws.jeuxvideo.com/forums/5-50-128244545-1-0-1-0-0.xml  
| Formulaire de réponse à un topic
| Formulaire de réponse à un topic
|-
|-
|https://ws.jeuxvideo.com/cgi-bin/jvforums/forums.cgi
|https://ws.jeuxvideo.com/cgi-bin/jvforums/forums.cgi
|Envoyer un message (avec les données POST)
|Envoyer un message (avec les données POST)  
|-
|-
|https://ws.jeuxvideo.com/profil/cisla.xml
|https://ws.jeuxvideo.com/profil/cisla.xml  
|Voir une CDV
| Voir une CDV  
|}
|}


Ligne 942 : Ligne 854 :
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.
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===
=== Messages privés===
L'id de l'utilisateur mentionnée ci-dessous correspond à la partie du cookie ''coniunctio'' qui se trouve avant le premier "$".
L'id de l'utilisateur mentionnée ci-dessous correspond à la partie du cookie ''coniunctio'' qui se trouve avant le premier "$".


Ligne 948 : Ligne 860 :


{| class="wikitable alternance centre"
{| class="wikitable alternance centre"
! scope="col" |URL
! scope="col" |URL  
! scope="col" |Description
! scope="col" |Description
|-
|-
Ligne 954 : Ligne 866 :
|Dernière version de l'application, liste des consoles et des smileys, lien vers la charte, pub activée ou non
|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
| messages-prives/connexion_ws.php  
|Les paramètres sont les mêmes que pour la connexion depuis ''mon_compte/connexion.php'', décrite [[#Connexion|plus haut]]. Cependant, la réponse XML contient quelques informations supplémentaires à propos des MP.
|Les paramètres sont les mêmes que pour la connexion depuis ''mon_compte/connexion.php'', décrite [[#Connexion|plus haut]]. Cependant, la réponse XML contient quelques informations supplémentaires à propos des MP.
|-
|-
|messages-prives/boite-reception_ws.php
|messages-prives/boite-reception_ws.php
|Permet de connaître le contenu de la boîte de réception. Paramètre à envoyer :
|Permet de connaître le contenu de la boîte de réception. Paramètre à envoyer :
* ''id_user'' : id de l'utilisateur
*''id_user'' : id de l'utilisateur  
|-
|-
|messages-prives/envoyes_ws.php
|messages-prives/envoyes_ws.php
|Permet de connaître la liste des messages envoyés. Paramètre à envoyer :
|Permet de connaître la liste des messages envoyés. Paramètre à envoyer :
* ''id_user'' : id de l'utilisateur
*''id_user'' : id de l'utilisateur
|-
|-
|messages-prives/message_ws.php
|messages-prives/message_ws.php  
|Permet de lire le contenu d'un message privé. Paramètres à envoyer :
| Permet de lire le contenu d'un message privé. Paramètres à envoyer :
* ''id_user'' : id de l'utilisateur
*''id_user'' : id de l'utilisateur
*''id_discussion'' : id de la discussion
*''id_discussion'' : id de la discussion
* ''nb_clic'' : le nombre de fois où l'utilisateur a cliqué sur « Voir les messages précédents »
*''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''<sup>ème</sup> sont affichés, la numérotation débutant à partir de 0.
*''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''<sup>ème</sup> sont affichés, la numérotation débutant à partir de 0.
|-
|-
|messages-prives/nouveau_ws.php
| messages-prives/nouveau_ws.php
|Permet d'envoyer un nouveau message privé. Paramètres à envoyer :
|Permet d'envoyer un nouveau message privé. Paramètres à envoyer :  
* ''id_user'' : id de l'utilisateur
*''id_user'' : id de l'utilisateur
*''all_dest'' : les destinataires, séparés pas des point-virgules
*''all_dest'' : les destinataires, séparés pas des point-virgules
*''sujet'' : le titre du MP
*''sujet'' : le titre du MP
*''yournewmessage'' : le contenu du MP
*''yournewmessage'' : le contenu du MP
*''tmp'' : le timestamp actuel
*''tmp'' : le timestamp actuel
* ''control'' : md5("k_ys4+a]x" + idUtilisateur + "j6A=d?6-W*-" + timestamp + "z_.Im")
*''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.
Il se peut également que vous ayez à gérer un code de confirmation.
|-
|-
|messages-prives/repondre_ws.php
|messages-prives/repondre_ws.php
|Permet de répondre à un message privé. Paramètres à envoyer :
|Permet de répondre à un message privé. Paramètres à envoyer :
* ''id_user'' : id de l'utilisateur
*''id_user'' : id de l'utilisateur
*''id_discussion'' : id de la discussion
*''id_discussion'' : id de la discussion
*''yournewmessage'' : le contenu du message
*''yournewmessage'' : le contenu du message
Ligne 994 : Ligne 906 :
|messages-prives/suggest_pseudo_ws.php
|messages-prives/suggest_pseudo_ws.php
|Liste quelques pseudos qui commencent par ce que l'utilisateur est en train de taper. Paramètres à envoyer :
|Liste quelques pseudos qui commencent par ce que l'utilisateur est en train de taper. Paramètres à envoyer :
* ''id_user'' : id de l'utilisateur
*''id_user'' : id de l'utilisateur
*''search'' : ce que l'utilisateur est en train de taper
*''search'' : ce que l'utilisateur est en train de taper
|-
|-
Ligne 1 012 : Ligne 924 :
|messages-prives/del_indesirable_ws.php
|messages-prives/del_indesirable_ws.php
|Permet d'enlever un utilisateur des indésirables. Paramètres à envoyer :
|Permet d'enlever un utilisateur des indésirables. Paramètres à envoyer :
* ''id_user'' : id de l'utilisateur actuel
*''id_user'' : id de l'utilisateur actuel
*''id_user_indesirable'' : id de l'utilisateur à enlever des indésirables
* ''id_user_indesirable'' : id de l'utilisateur à enlever des indésirables  
|-
|-
|messages-prives/info_alerte_ws.php
|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 :
|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_user'' : id de l'utilisateur qui fait la DDB
*''id_message'' : id du message concerné
* ''id_message'' : id du message concerné  
|-
|-
|messages-prives/alerte_ws.php
|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 :
| 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
*''id_user'' : id de l'utilisateur qui fait la DDB
*''pseudo'' : pseudo de l'utilisateur
*''pseudo'' : pseudo de l'utilisateur
*''motif'' : le motif, par exemple ''Piratage'' (les mêmes motifs que dans les MP sur JVC normal)
*''motif'' : le motif, par exemple ''Piratage'' (les mêmes motifs que dans les MP sur JVC normal)
Ligne 1 031 : Ligne 943 :
|-
|-
|messages-prives/connexion_valid_ws.php
|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 :
|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
*''id_user'' : id de l'utilisateur
*''pseudo'' : pseudo de l'utilisateur
*''pseudo'' : pseudo de l'utilisateur
|-
|-
|messages-prives/add_destinataire_ws.php
|messages-prives/add_destinataire_ws.php
|Permet d'ajouter un destinataire à un message privé. Paramètres à envoyer :
|Permet d'ajouter un destinataire à un message privé. Paramètres à envoyer :
* ''id_user'' : id de l'utilisateur
*''id_user'' : id de l'utilisateur
*''id_discussion'' : id de la discussion
*''id_discussion'' : id de la discussion
*''tab_pseudo'' : liste des destinataires à ajouter, séparés par un point-virgule
*''tab_pseudo'' : liste des destinataires à ajouter, séparés par un point-virgule
Ligne 1 091 : Ligne 1 003 :
  print repr(string[:-ord(string[-1])])
  print repr(string[:-ord(string[-1])])


Modifiez la clé selon l'application que vous décompilez:
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.0.3), c'est ''package com.jeuxvideo.activity''
Ligne 1 100 : Ligne 1 012 :


==Liens externes==
==Liens externes==
*[https://fr.wikipedia.org/wiki/Interface_de_programmation API sur Wikipédia]  
*[https://fr.wikipedia.org/wiki/Interface_de_programmation API sur Wikipédia]
*[http://www.jeuxvideo.com/forums/1-1000021-1691093-1-0-1-0-documentation-de-l-api-de-jeuxvideo-com.htm Lien du topic sur JVC pour poser vos questions]
*[http://www.jeuxvideo.com/forums/1-1000021-1691093-1-0-1-0-documentation-de-l-api-de-jeuxvideo-com.htm Lien du topic sur JVC pour poser vos questions]
*[https://play.google.com/store/apps/details?id=com.jeuxvideo&hl=fr L'application Android]
*[https://play.google.com/store/apps/details?id=com.jeuxvideo&hl=fr L'application Android]

Version du 7 septembre 2023 à 15:01

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 est hébergée sur le sous-domaine "api", et est actuellement à sa quatrième version (v4).

API v4

Utilisation

L'API v4 utilise une sécurité, l'en-tête HTTP Jvc-Authorization , sa valeur dépend d'une clé fixe partner_key, d'une signature et de la date .

Le 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 "header"

import hmac
import hashlib
import datetime

apiVersion = 4
partnerKey = '550c04bf5cb2b'
hmacSecret = 'd84e9e5f191ea4ffc39c22d11c77dd6c'

def createJvcAuthorizationHeader(method, path):
    # Étape 1 : Calcul de la date et de l'heure actuelles au format ISO
    date = datetime.datetime.utcnow().isoformat()
    
    # Étape 2 : Construction de la chaîne signatureStr
    signatureStr = f"{partnerKey}\n{date}\n{method}\napi.jeuxvideo.com\n/v{apiVersion}/{path}\n"
    
    # Étape 3 et 4 : Calcul de la signature HMAC SHA-256
    secret = bytes.fromhex(hmacSecret)
    signature = hmac.new(secret, signatureStr.encode('utf-8'), hashlib.sha256).hexdigest()
    
    # Étape 5 et 6 : Retour d'une chaîne formatée comme en-tête d'autorisation
    return f"PartnerKey={partnerKey}, Signature={signature}, Timestamp={date}"

method = 'GET'
apiPath = 'api/endpoint'
authorizationHeader = createJvcAuthorizationHeader(method, apiPath)
print(authorizationHeader)

Connexion

Comme pour l'ancienne API, le cookie coniunctio est toujours le cookie de session utilisateur. Il doit être récupéré avec l'appel au point d'entrée login (voir tableau POST) puis il doit être envoyé dans une en-tête HTTP "Cookie": "coniunctio" pour chaque appel.

API endpoints

Modèle:BoxInfo URL de base de l'API: https://api.jeuxvideo.com/v4/

  • URL: URL de l'endpoint
  • PARAMS: Variable entre accolades à remplacer dans l'URL, suivi de son type str ou int.
    • contents/{contentID}/comments doit être appelé comme suivant contents/someID1234/comments
  • QUERY: Par exemple pour les deux query page int, perPage int, l'URL devra être: api.jeuxvideo.com/v4/contents/1234ID/comments?page=1&perPage=30
  • BODY: Corps de la requête au format JSON

Le fichier JSON avec les ids pour les params et les query strings chronicles modes genres events machine categories (obtenu via la requête GET config) https://pastebin.com/L1DXfP0C

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

commentID str

"type": 1 ou -1
addFavorisGames accounts/{accountId}/favorites/games accountId str
"games": [{
    "id": 1,
    "machine": 100
]}
addReply contents/{contentID}/comments/{commentID}/answers contentID str

commentID str

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

machine str

"content": "Super jeu !",
"mark": 4,

"onProfile": true
login accounts/login "alias": "pseudo",

"password": "mot_de_passe"

logout accounts/logout
register accounts/register

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

"email": "email",
"alias": "pseudo",
"password": "motdepasse",
"optin": false
reinitPassword accounts/reset
"alias": "pseudo",
"password": "nouveau",

"session": "",

"captcha": {
    "imageKey": "",
    "imageName": "",
    "imageValues": [
        "val1",
        "val2" ]}
reportAccount accounts/{accountId}/report accountId str "reason": 1,

"message": "Raison"

reportComment contents/{contentID}/comments/{commentID}/report 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 id int

machine str reviewId int

"reason": 1, 
"message": "Raison",
"captcha": {
    "session": "clé"
    "clé_captcha": ""
    "valeur_captcha": ""
}
restoreComment contents/{contentID}/comments/{commentID} contentID str

commentID str

"content" : "comment"
validateAccount accounts/confirm
"id": 123,
"hash": "hash",
"alias": "pseudo",
"password": "mdp"
validateSignature general/stores/android/validation
"signature": "signature",
"signed_data": "signed_data"
GET
NOM URL PARAMS QUERY
config general/config
getAccount accounts/{accountId} accountId str
getAllFavorisGames accounts/{accountId}/favorites/games/all accountId str
getArticle contents/{id} id int
getArticleList rétro-ingénierie à faire page int

perPage int types str

getCaptcha captcha/start nb int
getChroniclesSummary contents/chronicles machines str
getComment contents/{contentID}/comments/{commentID} contentID str

commentID str

getCommentAnswers contents/{contentID}/comments/{commentID}/answers contentID str

commentID str

getComments contents/{contentID}/comments contentID str page int

perPage int

getContentBean contents/{id} id int
getContentList rétro-ingénierie à faire categories str

types str events str machines str page int perPage int

getCurrentAccountReport accounts/{accountId}/report accountId str
getCurrentCommentReport contents/{contentID}/comments/{commentID}/report contentID str

commentID str

getCurrentReviewReport games/{id}/{machine}/reviews/users/{reviewId}/report id int

machine str reviewId int

getFavoris accounts/{accountId}/favorites accountId str
getFavorisForum accounts/{accountId}/favorites/forums accountId str page int

perPage int

getFavorisGames accounts/{accountId}/favorites/games accountId str
getFavorisTopics accounts/{accountId}/favorites/topics accountId str page int

perPage int

getFolder contents/{id} id int
getGame games/{id}/{machine} id int

machine str

getGameDetails games/{id}/{machine}/details id int

machine str

getGameImages games/{id}/{machine}/images id int

machine str

page int

perPage int

getGameList games/{type} type str machines str

machine str genre str mode str page int perPage int

getGameNews games/{id}/{machine}/news id int page int

perPage int

getGameReleaseList games/releases month str

year str machines str page int perPage int

getGameReview games/{id}/{machine}/reviews/users/{review} id int

machine str review str

getGameReviews games/{id}/any/reviews id int
getGameReviews games/{id}/{machine}/reviews id int

machine str

getGameSummary contents/games machines str
getGameUserReviews games/{id}/{machine}/reviews/users id int

machine str

page int

perPage int

getGameVideos games/{id}/{machine}/videos id int

machine str

page int

perPage int

getGameWikis games/{id}/{machine}/wikis id int

machine str

page int

perPage int

getHeadlineList contents/trending machines str

page int perPage int

getHighTechSummary contents/hightech machines str
getLightGame games/{id}/{machine}/light id int

machine str

getNews contents/{id} id int
getNewsHighTech contents/hightech page int

perPage int

getPageContents accounts/{accountId}/page/contents accountId str page int

perPage int

getPageReviews accounts/{accountId}/page/reviews accountId str page int

perPage int

getProfile accounts/{accountId}/profile accountId str
getProfilePage accounts/{accountId}/page accountId str
getRelatedNews contents/{id}/news id int page int

perPage int

getRelatedVideos contents/{id}/videos id int page int

perPage int

getRelatedWikis contents/{id}/wikis id int page int

perPage int

getSpecificNews rétro-ingénierie à faire
getStores games/{id}/{machine}/stores id int

machine str

getTechList contents/hightech page int

perPage int

getTopWikis contents/wikis
getTopsComments contents/{contentID}/comments/tops contentID str
getVideo videos/{id} id int
getVideoList rétro-ingénierie à faire categories str

chronicles str machines str types str page int perPage int

getVideosSummary contents/videos machines str
search rétro-ingénierie à faire q str
searchArticles search/articles q str

page int perPage int

searchAutocomplete search/games/autocomplete q str
searchGames search/games q str

page int perPage int

searchNews search/news q str

page int perPage int

searchVideos search/videos q str

page int perPage int

searchWikis search/wikis q str

page int perPage int

sponso general/nativeads
PUT
NOM URL PARAMS BODY
saveDescription accounts/me/profile/description rétro-ingénierie à faire
saveExcludedMachines accounts/me/profile/excluded-machines "machines" : [1, 2, 3, 4]  // id des machines
saveMachines accounts/me/profile/machines "machines" : [1, 2, 3, 4]  // id des machines
updateComment contents/{contentID}/comments/{commentID} contentID str

commentID str

"content": "Super jeu !"
uploadAvatar accounts/me/avatar rétro-ingénierie à faire
uploadCover accounts/me/cover rétro-ingénierie à faire
GET
NOM URL PARAMS
deleteComment contents/{contentID}/comments/{commentID} contentID str

commentID str

deleteCommentVote contents/{contentID}/comments/{commentID}/vote contentID str

commentID str

CUSTOM HTTP (rétro-ingénierie à faire)
NOM URL PARAMS
deleteFavorisForum accounts/{accountId}/favorites/forums accountId str
deleteFavorisGames accounts/{accountId}/favorites/games accountId str
deleteFavorisTopics accounts/{accountId}/favorites/topics accountId str

Rétro-ingénierie de l'API et de l'application JVC

Pour connaître les endpoints de l'API, il faut décompiler l'appli JVC.

  1. Décompresser l'APK de l'application avec 7zip/Winrar/etc.
  2. Utiliser un décompilateur Dex vers Java, comme Jadx .

JvApiService

Une fois le code Java disponible, on peut ouvrir l'interface com.jeuxvideo.api.web.JvApiService, qui contient tous les endpoints. L'appli utilise le bibliothèque Retrofit 2.x pour gérer l'API, on peut facilement parcourir la documentation de cette bibliothèque pour découvrir ce qu'il faut faire comme requête aux différentes URL de l'API.

Exemple de code dans l'interface JvApiService

    @POST("contents/{contentID}/comments")
    Call<UserComment> addComment(@Path("contentID") String str, @Body UserComment.Body body);

    @POST("contents/{contentID}/comments/{commentID}/vote")
    Call<UserComment> addCommentVote(@Path("contentID") String str, @Path("commentID") String str2, @Body UserComment.Vote vote);

ApiLogin

La classe com.jeuxvideo.utils.ApiLogin (nom de la classe donné arbitrairement car perdu lors de la compilation), permet de déduire qu'il faut mettre dans le header de la requête à l'API Jvc-Authorization : header ainsi que l'algorithme permettant de trouver ce qu'il faut mettre à la place de header. (Voir code ci-dessous)

    public static String f(String str, String str2, String str3, String str4, String str5) {
        StringBuilder sb2 = new StringBuilder();
        sb2.append("550c04bf5cb2b\n");
        sb2.append(str);
        sb2.append("\n");
        sb2.append(str2);
        sb2.append("\n");
        sb2.append(str3);
        sb2.append("\n");
        sb2.append(str4);
        sb2.append("\n");
        if (str5 == null) {
            str5 = "";
        }
        sb2.append(str5);
        String b10 = j5.f.b("d84e9e5f191ea4ffc39c22d11c77dd6c", sb2.toString());
        return "PartnerKey=550c04bf5cb2b, Signature=" + b10 + ", Timestamp=" + str;
    }

Ressources

  • Classe PHP exploitant l'API : https://pastebin.com/LWNDQDKy (Cette classe est incomplète et sera possiblement rendue obsolète dans le temps).
  • (en cours de documentation) Fichier JSON modélisant l'API complète (compatible avec Postman et divers clients).
  • (en cours de dev) Une bibliothèque JavaScript pour pouvoir interagir avec l'API sans devoir gérer les cookies et les headers.

Ancienne API

Modèle:BoxNotice

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