Add AccountID Script

This commit is contained in:
Florian Märkl 2019-10-12 15:13:46 +02:00
commit bf4a3f4020
No known key found for this signature in database
GPG key ID: 125BC8A5A6A1E857
2 changed files with 100 additions and 0 deletions

View file

@ -43,6 +43,13 @@ cmake ..
make
```
## Obtaining your PSN AccountID
Starting with PS4 7.0, it is necessary to use a so-called "AccountID" as opposed to the "Online-ID" for registration (streaming itself did not change).
This ID seems to be a unique identifier for a PSN Account and it can be obtained from the PSN after logging in using OAuth.
A Python 3 script which does this is provided in [scripts/psn-account-id.py](scripts/psn-account-id.py).
Simply run it in a terminal and follow the instructions. Once you know your ID, write it down. You will likely never have to do this process again.
## Acknowledgements
This project has only been made possible because of the following Open Source projects:
@ -52,6 +59,7 @@ This project has only been made possible because of the following Open Source pr
[x64dbg](https://x64dbg.com/).
Also thanks to [delroth](https://github.com/delroth) for analyzing the registration and wakeup protocol,
[grill2010](https://github.com/grill2010) for analyzing the PSN's OAuth Login,
as well as a huge thank you to [FioraAeterna](https://github.com/FioraAeterna) for giving me some
extremely helpful information about FEC and error correction.

92
scripts/psn-account-id.py Executable file
View file

@ -0,0 +1,92 @@
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import sys
if sys.version_info < (3, 0, 0):
print("DO NOT use Python 2.\nEVER.\nhttps://pythonclock.org")
exit(1)
try:
import requests
except ImportError as e:
print(e)
print("\"requests\" is not available. Install it with pip whatever.")
exit(1)
from urllib.parse import urlparse, parse_qs, quote, urljoin
import pprint
import base64
# Remote Play Windows Client
CLIENT_ID = "ba495a24-818c-472b-b12d-ff231c1b5745"
CLIENT_SECRET = "mvaiZkRsAsI1IBkY"
LOGIN_URL = "https://auth.api.sonyentertainmentnetwork.com/2.0/oauth/authorize?service_entity=urn:service-entity:psn&response_type=code&client_id={}&redirect_uri=https://remoteplay.dl.playstation.net/remoteplay/redirect&scope=psn:clientapp&request_locale=en_US&ui=pr&service_logo=ps&layout_type=popup&smcid=remoteplay&prompt=always&PlatformPrivacyWs1=minimal&".format(CLIENT_ID)
TOKEN_URL = "https://auth.api.sonyentertainmentnetwork.com/2.0/oauth/token"
print()
print("########################################################")
print(" Script to determine PSN AccountID")
print(" thanks to grill2010")
print(" (This script will perform network operations.)")
print("########################################################")
print()
print("➡️ Open the following URL in your Browser and log in:")
print()
print(LOGIN_URL)
print()
print("➡️ After logging in, when the page shows \"redirect\", copy the URL from the address bar and paste it here:")
code_url_s = input("> ")
code_url = urlparse(code_url_s)
query = parse_qs(code_url.query)
if "code" not in query or len(query["code"]) == 0 or len(query["code"][0]) == 0:
print("☠️ URL did not contain code parameter")
exit(1)
code = query["code"][0]
print("🌏 Requesting OAuth Token")
api_auth = requests.auth.HTTPBasicAuth(CLIENT_ID, CLIENT_SECRET)
body = "grant_type=authorization_code&code={}&redirect_uri=https://remoteplay.dl.playstation.net/remoteplay/redirect&".format(code)
token_request = requests.post(TOKEN_URL,
auth = api_auth,
headers = { "Content-Type": "application/x-www-form-urlencoded" },
data = body.encode("ascii"))
print("⚠️ WARNING: From this point on, output might contain sensitive information in some cases!")
if token_request.status_code != 200:
print("☠️ Request failed with code {}:\n{}".format(token_request.status_code, token_request.text))
exit(1)
token_json = token_request.json()
if "access_token" not in token_json:
print("☠️ \"access_token\" is missing in response JSON:\n{}".format(token_request.text))
exit(1)
token = token_json["access_token"]
print("🌏 Requesting Account Info")
account_request = requests.get(TOKEN_URL + "/" + quote(token),
auth = api_auth)
if account_request.status_code != 200:
print("☠️ Request failed with code {}:\n{}".format(account_request.status_code, account_request.text))
exit(1)
account_info = account_request.json()
print("🥦 Received Account Info:")
pprint.pprint(account_info)
if "user_id" not in account_info:
print("☠️ \"user_id\" is missing in response or not a string")
exit(1)
user_id = int(account_info["user_id"])
user_id_base64 = base64.b64encode(user_id.to_bytes(8, "little")).decode()
print()
print("🍙 This is your AccountID:")
print(user_id_base64)