PSNにapiを使ってアクセスする話

1.はじめに

PSNにアクセスするapiを有志が公開しています。
それらのapiを使うと、各プレイヤーのオンライン状態などの各種情報をプログラムから取得することが出来ます。
(ブラウザからPlaystationのwebページにアクセスして検索するのと、本質的にやっていることは同じかと思います。)

①pythonでapiを使えるようにする


pythonのapiだとPlayStation Network API Wrapper Python (PSNAWP)などがあります。
https://github.com/isFakeAccount/psnawp
このapiはpython3の環境を作っておけば、pipコマンドで簡単にインストール出来ます。

pip install PSNAWP

②必要な情報の入手

ログインに必要な情報を取得する必要がありますが、Getting Startedに書いてあるように、Playstationにログインしたブラウザでwebページにアクセスして、npssoコードを取得してコードに貼り付ければ準備はOKです。

npssoという64文字のコードが必要だから、以下の手順をやってね。

1.ブラウザでマイプレイステーションにログインしてね
2.別のタブでhttps://ca.account.sony.com/api/v1/ssocookieにアクセスしてね
3.以下のテキストが表示されるよ
{"npsso":"<64 文字のnpssoコード>"}

https://github.com/isFakeAccount/psnawp

サンプルのコピペでも一通り情報を収集することが確認出来ます。

③試してみよう

例えば以下のコードは自分のフレンドのリストを取得して、特定のゲームを何人くらいやっているかを集計してみます。
ここで、集計する際に、ゲームのIDが必要になります。バーチャロンマスターピースの場合'CUSA16156_00'のようです。
自分が持っているゲームであれば、自分がプレイしつつget_presence()すればIDが分かります。

from psnawp_api import psnawp

psnawp_my = psnawp.PSNAWP('npssoコードを入れる')

#Clientは自分
client = psnawp.me()

#フレンドのリストを取得
friendIdList = client.get_friends()

#自分のオンラインIDからユーザ(自分)を取得
my_online_id = psnawp.user(online_id=client.online_id)
#online_idは"kijitora_azuki"などの文字列であり、
#account_idは内部IDである数桁の数字

#確認用に自分のオンラインIDとユーザ(自分)の現在の状態を取得
print(client.online_id)
print(my_online_id.get_presence())

#オンラインのユーザ数のカウント用
onlineVOMPNum=0
onlineKinsyoNum=0

#フレンドのリストに対して、ループを回す
for friendId in friendIdList:

   #フレンドを取得
   fr_online_id = psnawp.user(account_id= friendId)
   #APIの実行数には制限があるのでスリープを入れる(制限は10分に300回と言われている)
   time.sleep(5)

try:
   precense= fr_online_id.get_presence()
   #オンラインIDと現在の状態を表示
   print(fr_online_id)
   print(type(precense))
   
   #現在の状態からオンライン状態を取得
   onlineStatus = precense["primaryPlatformInfo"]["onlineStatus"]
   #オンライン状態がonlineだったら、実行中のゲームタイトルを取得
   if onlineStatus == 'online':
       titleId = precense["gameTitleInfoList"][0]["npTitleId"]

       #実行しているゲームタイトルのIDでチェックすると
       #どのゲームをやっているか集計出来る
       #VOMPプレイ中
       if titleId == 'CUSA16156_00':
           onlineVOMPNum=onlineVOMPNum+1
           print("VOMPやってる人がいたよ")

       #とある魔術の電脳戦機プレイ中
       if titleId == 'CUSA08425_00':
           onlineKinsyoNum=onlineKinsyoNum+1
           print("禁書やってる人がいたよ")

except Exception as e:
   #非公開状態になっているとforbiddenエクセスプションが出る
   print(e)

print("VOMPは"+str(onlineVOMPNum)+"人やってる")
print("禁書は"+str(onlineKinsyoNum)+"人やってる")

それで、このapiって何に使えるの?

①自分のゲームプレイログを残す

10分に一回程度、自分のget_presenceのログをタイムスタンプと残すと、どのゲームをどれくらい遊んでいたかの記録を残せます。

②特定ゲームのプレイ人口を推定する

特定のゲームのユーザのリストに対してget_presenceを取得して、時間毎に集計すると、何曜日の何時に何人くらいプレイしていたかを推定することが出来ます。
https://psnprofiles.com/

などでざっくりとしたプレイヤー一覧は取得することが出来るので、そのリストに対して情報収集すると良いでしょう。

③迷惑行為を行っているアカウントと別人だと証明する(※出来ない)

例えばあるPSIDの人と、迷惑行為を行っているPSIDが同一人物ではないかと疑われた際に、自分のプレイログを残すのと同じ方法で、真偽を証明出来るのではないでしょうか?

実はこのapiを試用し始めた時に、少し期待していたのですが、結論としては無理でした。
・そもそもサブアカウントと本アカウントで同時にログインすることが可能
(2台のPS4を使うと、同じソフトを起動することすら可能です)
・非公開状態になっているとデータが取れない

公開状態で迷惑行為を行っている人がいたら、その出没時間くらいは特定出来るかと思います。是非試してみて下さい。


いいなと思ったら応援しよう!