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

(Ajout des requêtes GET)
Ligne 2 : Ligne 2 :
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, ce qui fait qu'elle est plus facile à parser, mais aussi plus rapide à charger qu'une page web normale.
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'ancienne API était hébergée sur le sous-domaine "ws". Désormais, l'API est hébergée sur le sous-domaine "api".
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=
L'API v4 utilise un système de sécurité afin que même personne ne puisse accéder à l'API. Pour pouvoir accéder y accéder, l'''Header'' de vos requêtes devra toujours être de la forme :  
L'API v4 utilise un système de sécurité afin que même personne ne puisse accéder à l'API. Pour pouvoir accéder y accéder, l'''Header'' de vos requêtes devra toujours être de la forme :  
Jvc-Authorization: "'''''<u>header</u>'''''"


<code>Jvc-Authorization: "'''''<u>header"</u>'''''</code>
"User-Agent": "JeuxVideo-Android/267"


<code>"User-Agent": "JeuxVideo-Android/267"</code>
"Content-Type" : "application/json"
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)


<code>"Content-Type" : "application/json"</code>
====== Voici un script [https://www.python.org/ python] qui construit la signature ======
 
import hashlib
''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>'''".''
from datetime import datetime
 
Voici un script python qui construit la signature
api_version = 4
<pre>
partner_key = "550c04bf5cb2b"
import hashlib
date = datetime.utcnow().isoformat()
from datetime import datetime
method = "POST"
 
api_version = 4
signature = hashlib.sha256(f"{self.partner_key}\n{date}\n{method}\napi.jeuxvideo.com\n/v{self.api_version}/{path}".encode()).hexdigest()
partner_key = "550c04bf5cb2b"
date = datetime.utcnow().isoformat()
header = f"PartnerKey={partner_key}, Signature={signature}, Timestamp={date}"
method = "POST"
 
signature = hashlib.sha256(f"{self.partner_key}\n{date}\n{method}\napi.jeuxvideo.com\n/v{self.api_version}/{path}".encode()).hexdigest()
 
</pre>


== API endpoints ==
== API endpoints ==
Url de base : ''<nowiki>https://api.jeuxvideo.com/v4/</nowiki>''
Url de base : ''<nowiki>https://api.jeuxvideo.com/v4/</nowiki>''
* URL : endpoint
* PARAMS : variable entre accolades à remplacer dans l'URL.
* Exemple : <code>contents/{contentID}/comments</code> doit être appelé comme suivant  <code>contents/someID1234/comments</code>
* BODY : corps de la requête, au format JSON donc "content": "commentaire" sera en réalité {
* "content": "commentaire"
* }


{| class="wikitable mw-collapsible"
{| class="wikitable mw-collapsible"
Ligne 38 : Ligne 42 :
!NOM
!NOM
!URL
!URL
!METHOD
!PARAMS
!PARAMS
!BODY
!BODY
Ligne 44 : Ligne 47 :
|addComment
|addComment
|contents/{contentID}/comments
|contents/{contentID}/comments
|POST
|'''contentID''' str
|'''contentID''' str
|<pre>"content": "commentaire"</pre>
|<pre>"content": "commentaire"</pre>
Ligne 50 : Ligne 52 :
|addCommentVote
|addCommentVote
|contents/{contentID}/comments/{commentID}/vote
|contents/{contentID}/comments/{commentID}/vote
|POST
|'''contentID''' str
|'''contentID''' str
'''commentID''' str
'''commentID''' str
Ligne 57 : Ligne 58 :
|addFavorisGames
|addFavorisGames
|accounts/{accountId}/favorites/games
|accounts/{accountId}/favorites/games
|POST
|'''accountId''' str
|'''accountId''' str
|<pre>"games": [{
|<pre>"games": [{
Ligne 68 : Ligne 68 :
|addReply
|addReply
|contents/{contentID}/comments/{commentID}/answers
|contents/{contentID}/comments/{commentID}/answers
|POST
|'''contentID''' str
|'''contentID''' str
'''commentID''' str
'''commentID''' str
Ligne 75 : Ligne 74 :
|addReview
|addReview
|games/{id}/{machine}/reviews/users
|games/{id}/{machine}/reviews/users
|POST
|'''id''' int
|'''id''' int
'''machine''' str  
'''machine''' str  
Ligne 86 : Ligne 84 :
|login  
|login  
|accounts/login
|accounts/login
|POST
|
|
|"alias": "pseudo",
|"alias": "pseudo",
Ligne 94 : Ligne 91 :
|logout
|logout
|accounts/logout
|accounts/logout
|POST
|
|
|
|
Ligne 101 : Ligne 97 :
|accounts/register  
|accounts/register  
''l'<nowiki/>'''Header''' doit inclure'' : <code>"Jvc-Auth-Token" : str</code>
''l'<nowiki/>'''Header''' doit inclure'' : <code>"Jvc-Auth-Token" : str</code>
|POST
|
|
|<pre>"email": "email",
|<pre>"email": "email",
Ligne 111 : Ligne 106 :
|reinitPassword  
|reinitPassword  
|accounts/reset
|accounts/reset
|POST
|
|
|<pre>"alias": "pseudo",
|<pre>"alias": "pseudo",
Ligne 128 : Ligne 122 :
|reportAccount
|reportAccount
|accounts/{accountId}/report
|accounts/{accountId}/report
|POST
|'''accountId''' str
|'''accountId''' str
|<code>"reason": 1,</code>
|<code>"reason": 1,</code>
Ligne 136 : Ligne 129 :
|reportComment
|reportComment
|contents/{contentID}/comments/{commentID}/report
|contents/{contentID}/comments/{commentID}/report
|POST
|'''contentID''' str
|'''contentID''' str
'''commentID''' str
'''commentID''' str
Ligne 150 : Ligne 142 :
|reportReview
|reportReview
|games/{id}/{machine}/reviews/users/{reviewId}/report
|games/{id}/{machine}/reviews/users/{reviewId}/report
|POST
|'''id''' int
|'''id''' int
'''machine''' str
'''machine''' str
Ligne 164 : Ligne 155 :
|restoreComment
|restoreComment
|contents/{contentID}/comments/{commentID}
|contents/{contentID}/comments/{commentID}
|POST
|'''contentID''' str
|'''contentID''' str
'''commentID''' str
'''commentID''' str
Ligne 171 : Ligne 161 :
|validateAccount
|validateAccount
|accounts/confirm
|accounts/confirm
|POST
|
|
|<pre>"id": 123,
|<pre>"id": 123,
Ligne 181 : Ligne 170 :
|validateSignature
|validateSignature
|general/stores/android/validation
|general/stores/android/validation
|POST
|
|
|<pre>"signature": "signature",
|<pre>"signature": "signature",
"signed_data": "signed_data"
"signed_data": "signed_data"
</pre>
</pre>
|}
{| class="wikitable mw-collapsible"
|+GET
!NOM
!URL
!PARAMS
!QUERY
!HEADER
|-
|config
|general/config
|
|
|'''If-None-Match''' str
|-
|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
|'''If-None-Match''' 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
|'''If-None-Match''' str
|-
|getGameNews
|games/{id}/{machine}/news
|'''id''' int
|'''page''' int
'''perPage''' int
|
|-
|getGameReleaseList
|games/releases
|
|'''month''' str
'''year''' str
'''machines''' str
'''page''' int
'''perPage''' int
|'''If-None-Match''' str
|-
|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
|'''If-None-Match''' str
|-
|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
|'''If-None-Match''' str
|-
|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
|'''If-None-Match''' str
|-
|getTopWikis
|contents/wikis
|
|
|'''If-None-Match''' str
|-
|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
|'''If-None-Match''' str
|-
|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
|
|
|'''If-None-Match''' str
|}
|}


Ligne 509 : Ligne 935 :
  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 518 : Ligne 944 :


==Liens externes==
==Liens externes==
*[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]
Ligne 539 : Ligne 966 :
*L'APK de l'application Android tablette :
*L'APK de l'application Android tablette :
**[http://dl3.apk-dl.com/root/apk/2015/9/19/com.jeuxvideo.tablet_40.apk?f=Jeuxvideo.com%20tablette_1.0.4_apk-dl.com.apk Version 1.0.4]
**[http://dl3.apk-dl.com/root/apk/2015/9/19/com.jeuxvideo.tablet_40.apk?f=Jeuxvideo.com%20tablette_1.0.4_apk-dl.com.apk Version 1.0.4]
{{SectionRéférences}}
{{SectionRéférences}}
{{TableauCatégorieFonctionnementJVC}}
{{TableauCatégorieFonctionnementJVC}}