diff --git a/scripts/psn-account-id.go b/scripts/psn-account-id.go new file mode 100644 index 0000000..b05aff5 --- /dev/null +++ b/scripts/psn-account-id.go @@ -0,0 +1,103 @@ +package main + +import ( + "github.com/atotto/clipboard" + "github.com/pkg/browser" + "encoding/base64" + "encoding/binary" + "encoding/json" + "net/http" + "net/url" + "strings" + "strconv" + "bytes" + "bufio" + "flag" + "fmt" + "log" + "os" +) + +func main(){ + headless := flag.Bool("headless", false, "Operates in Headless mode") + flag.Parse() + fmt.Println( +`== PSN ID Scraper for Remote Play == +In order to get your Account code for Remote Play, You'll need to Login via a special Remote Play login webpage. +After logging in, you will see a webpage that displays "redirect" in the top-left. +When you see this page, Copy the entire URL from your browser, paste it below and then press *Enter* +`) + reader := bufio.NewReader(os.Stdin) + if *headless { + fmt.Println( +`[Headless] You'll need to open this page in a web browser that supports Javascript/ReCaptcha +[Headless] https://auth.api.sonyentertainmentnetwork.com/2.0/oauth/authorize?service_entity=urn:service-entity:psn&response_type=code&client_id=ba495a24-818c-472b-b12d-ff231c1b5745&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&`) + } else { + fmt.Println("Press Enter to open the PSN Remote Play login webpage in your browser") + reader.ReadString('\n') + browser.OpenURL("https://auth.api.sonyentertainmentnetwork.com/2.0/oauth/authorize?service_entity=urn:service-entity:psn&response_type=code&client_id=ba495a24-818c-472b-b12d-ff231c1b5745&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&") + } + + fmt.Print("Awaiting Input >") + response, _ := reader.ReadString('\n') + response = strings.TrimSpace(response) + URL, err := url.Parse(response) + if err != nil { + log.Fatal(err) + } + + query := URL.Query() + if query.Get("code") == ""{ + log.Fatal("Invalid URL has been submitted") + } + + client := &http.Client{} + data :=url.Values{} + data.Set("grant_type","authorization_code") + data.Set("code", query.Get("code")) + data.Set("redirect_uri","https://remoteplay.dl.playstation.net/remoteplay/redirect") + req, err := http.NewRequest("POST", "https://auth.api.sonyentertainmentnetwork.com/2.0/oauth/token", strings.NewReader(data.Encode())) + req.SetBasicAuth("ba495a24-818c-472b-b12d-ff231c1b5745", "mvaiZkRsAsI1IBkY") + req.Header.Add("Content-Type", "application/x-www-form-urlencoded") + req.Header.Add("Content-Length", strconv.Itoa(len(data.Encode()))) + res, err := client.Do(req) + + defer res.Body.Close() + access := AccessKeys{} + err = json.NewDecoder(res.Body).Decode(&access) + if err != nil { + log.Fatal(err) + } + + req, err = http.NewRequest("GET", fmt.Sprintf("https://auth.api.sonyentertainmentnetwork.com/2.0/oauth/token/%v", access.AccessToken), nil) + req.SetBasicAuth("ba495a24-818c-472b-b12d-ff231c1b5745", "mvaiZkRsAsI1IBkY") + res, err = client.Do(req) + + info := ClientInfo{} + err = json.NewDecoder(res.Body).Decode(&info) + if err != nil { + log.Fatal(err) + } + uid, _ := strconv.ParseInt(info.UserID, 10, 0) + + buf := new(bytes.Buffer) + err = binary.Write(buf, binary.LittleEndian, uid) + if err != nil { + log.Fatal(err) + } + + uidBytes := buf.Bytes() + fmt.Printf("Your AccountID is: %v (Copied to Clipboard)\n", base64.StdEncoding.EncodeToString(uidBytes)) + clipboard.WriteAll(base64.StdEncoding.EncodeToString(uidBytes)) + + fmt.Println("Press Enter to quit") + reader.ReadString('\n') +} + +type AccessKeys struct { + AccessToken string `json:"access_token"` +} + +type ClientInfo struct { + UserID string `json:"user_id"` +}