logo
Published on

通过PSN API获取PSN奖杯信息

通过PSN API获取PSN奖杯信息

想在主页加一个奖杯展示页面,发现PSN没有官方公开的API,但Github上有爬取获得的民间文档。

主要参考:
PlayStation-Trophies
psn-api-javascript

文档是比较全面的,这里简洁记录一下获取奖杯的主要流程

效果页

获取授权

获取NPSSO

{ "npsso": "<64 character token>" }

复制npsso的值,以供后续使用。

获取Access Code

curl -i -X GET \
'https://ca.account.sony.com/api/authz/v3/oauth/authorize?access_type=offline&client_id=09515159-7237-4370-9b40-3806e67c0891&redirect_uri=com.scee.psxandroid.scecompcall://redirect&response_type=code&scope=psn:mobile.v2.core%20psn:clientapp' \
-H 'Cookie: npsso=YOUR_NPSSO_TOKEN' \
-H 'Accept: application/json' \
--max-redirs 0

access code在返回的Location字段中:

Location: com.scee.psxandroid.scecompcall://redirect/?code='YOUR_ACCESS_CODE'&cid=xxxxxxx

获取Access Token & Refresh Token

curl -X POST 'https://ca.account.sony.com/api/authz/v3/oauth/token' \
-H 'Content-Type: application/x-www-form-urlencoded' \
-H 'Authorization: Basic MDk1MTUxNTktNzIzNy00MzcwLTliNDAtMzgwNmU2N2MwODkxOnVjUGprYTV0bnRCMktxc1A=' \
--data-urlencode 'code=YOUR_ACCESS_CODE' \
--data-urlencode 'redirect_uri=com.scee.psxandroid.scecompcall://redirect' \
--data-urlencode 'grant_type=authorization_code' \
--data-urlencode 'token_format=jwt'

即会返回Access Token和Refresh token

由于access token会很快过期,在实际获取奖杯List时,先用Refresh Token交换Access Token

获取奖杯List

使用Refresh Token更新Access Token

curl -X POST 'https://ca.account.sony.com/api/authz/v3/oauth/token' \
-H 'Content-Type: application/x-www-form-urlencoded' \
-H 'Authorization: Basic MDk1MTUxNTktNzIzNy00MzcwLTliNDAtMzgwNmU2N2MwODkxOnVjUGprYTV0bnRCMktxc1A=' \
--data-urlencode 'refresh_token=YOUR_REFRESH_TOKEN' \
--data-urlencode 'grant_type=refresh_token' \
--data-urlencode 'token_format=jwt' \
--data-urlencode 'scope=psn:mobile.v2.core psn:clientapp'

之后只用到access_token字段

获取所有奖杯

curl -X GET 'https://m.np.playstation.com/api/trophy/v1/users/USER_ACCOUNT_ID/trophyTitles' \
-H 'Authorization: Bearer YOUR_ACCESS_TOKEN' \
-H 'Accept: application/json'

返回的奖杯列表如下:

{
   "trophyTitles":[
      {
         "npServiceName":"trophy2",
         "npCommunicationId":"NPWR29948_00",
         "trophySetVersion":"01.00",
         "trophyTitleName":"MONSTER HUNTER RISE",
         "trophyTitleIconUrl":"https://psnobj.prod.dl.playstation.net/psnobj/NPWR29948_00/c2784818-be41-4379-91db-c1fa28ed2593.png",
         "trophyTitlePlatform":"PS5",
         "hasTrophyGroups":true,
         "trophyGroupCount":7,
         "definedTrophies":{
            "bronze":78,
            "silver":15,
            "gold":6,
            "platinum":1
         },
         "progress":4,
         "earnedTrophies":{
            "bronze":6,
            "silver":0,
            "gold":0,
            "platinum":0
         },
         "hiddenFlag":false,
         "lastUpdatedDateTime":"2024-12-29T02:12:23Z"
      },
      {
         "npServiceName":"trophy2",
         "npCommunicationId":"NPWR37356_00",
         "trophySetVersion":"01.00",
         "trophyTitleName":"Stellar Blade",
         "trophyTitleIconUrl":"https://psnobj.prod.dl.playstation.net/psnobj/NPWR37356_00/d1f990db-1929-4092-84dc-4b1c64af872d.png",
         "trophyTitlePlatform":"PS5",
         "hasTrophyGroups":true,
         "trophyGroupCount":2,
         "definedTrophies":{
            "bronze":29,
            "silver":12,
            "gold":3,
            "platinum":1
         },
         "progress":67,
         "earnedTrophies":{
            "bronze":22,
            "silver":10,
            "gold":1,
            "platinum":0
         },
         "hiddenFlag":false,
         "lastUpdatedDateTime":"2024-10-24T14:23:18Z"
      },
      ...
      }
  ],
  "totalItemCount": 100
}

可选字段: limit&offset: pagination可用字段 例:https://m.np.playstation.com/api/trophy/v1/users/USER_ACCOUNT_ID/trophyTitles?limit=20&offset=2

对列表进行一番处理,大致效果如图:
showcase
应用的组件在这里