Discuss Scratch

Sky_Thunder
Scratcher
100+ posts

Scratch APIに対して理解を深めるトピック

#258
なるほど!そのような場合があるのですね。とても勉強になります(こういう類のやつ大体CORSだと思ってた)
#259
(ついでというか、APIの用途が不明なので書いておきます)
Scratchドメイン下での公式API取得であればそのままで大丈夫なのですが、
もしScratchドメインじゃない所でAPIを使用する予定でしたら、TurbowarpのAPIがお勧めです(CORS起きないので)
https://trampoline.turbowarp.org/api/users/${username}
https://trampoline.turbowarp.org/api/projects/${project_id}/
https://trampoline.turbowarp.org/api/studios/${studio_id}/projects
hi-ro951
Scratcher
29 posts

Scratch APIに対して理解を深めるトピック

ユーザーのフォロワー数を取得するapiってありますか?
https://api.scratch.mit.edu/users/hi-ro951/followers/?limit=40&offset=0←を何度も繰り返して取得するようにしてもなぜか本来のフォロワー数より数十人多くなってしまいます。
あと、https://scratchdb.lefty.one/v3/user/info/<username>/で取得できる数値ってなんで減ったんですか?

Last edited by hi-ro951 (Oct. 19, 2023 07:11:33)

p_nuts
Scratcher
1000+ posts

Scratch APIに対して理解を深めるトピック

https://api.scratch.mit.edu/explore/projects から取得するできるデータと
https://api.scratch.mit.edu/projects/<id> で取得できるデータには
一部かけ離れている部分があるのですが、なぜでしょうか?
{"visibility":"notvisible","public":false,"comments_allowed":false,"is_published":false,"remix":{"root":null}}
この挙動は明らかに変だと思います。
yu-yu0202
Scratcher
100+ posts

Scratch APIに対して理解を深めるトピック

Scratch APIに連続でGETするときの、待機時間の目安はありますか?
kouhei-1
Scratcher
1000+ posts

Scratch APIに対して理解を深めるトピック

スタジオに作品をaddするPOSTは何ですか?
ito-noizi
Scratcher
100+ posts

Scratch APIに対して理解を深めるトピック

#265
https://api.scratch.mit.edu/studios/スタジオID/project/追加したいプロジェクトID
で、bodyには特に何もいりません。削除はDELETEを使います。
ito-noizi
Scratcher
100+ posts

Scratch APIに対して理解を深めるトピック

#264
基本的に、GETリクエストではリクエストを送りすぎてエラーになるということはないはずです。
(前、ミスで一桁間違えて非同期で一度にユーザーの基本情報を得るAPIを500回リクエストしてしまいましたが、無事にデータは取れました。)
しかし、故意にあまりに多いリクエストを行うのはやはりスパムで、サーバーに負荷をかけようとしているようにしか思えないので、どのリクエストでもマナーとして、やめましょう。

Last edited by ito-noizi (Dec. 1, 2023 11:52:20)

Catapult-
Scratcher
100+ posts

Scratch APIに対して理解を深めるトピック

Google Apps Scriptを利用してScratchにログインしようとしています。
ログイン周りのAPIを調べてみたところ、
https://scratch.mit.edu/csrf_token/
https://scratch.mit.edu/session
https://scratch.mit.edu/accounts/login/
当たりが関係していそうだと思い、以下のコードを組みました。
function Login() {
  var response = UrlFetchApp.fetch("https://scratch.mit.edu/csrf_token/",);
  var cookies = response.getHeaders()["Set-Cookie"];
  Logger.log(cookies.match(new RegExp("scratchcsrftoken"+'\=([^\;]*)\;*'))[1]);
 
  UrlFetchApp.fetch("https://scratch.mit.edu/session",);
  
  response = UrlFetchApp.fetch("https://scratch.mit.edu/accounts/login/", {
    headers: {
    "accept": "application/json",
    "content-type": "application/json",
    "x-csrftoken": cookies.match(new RegExp("scratchcsrftoken"+'\=([^\;]*)\;*'))[1],
    "X-Requested-With": "XMLHttpRequest"
    },
    body: "{\"username\":\"<username>\",\"password\":\"<password>\",\"useMessages\":true}",
    method: "POST",
  });
  Logger.log(response);
}
最初にcsrfトークンを取得して、取得したトークンを使ってログインしています。sessionの意味は分かっていません。

しかし、コードを実行しても、間隔を開けているにもかかわらず429エラーが返ってきたり、レスポンスが
[{"username": "", "num_tries": 0, "success": 0, "msg": "Something went wrong", "messages": [], "id": null}]
とログイン失敗したりしてしまいます。
・429エラーの原因
・ログイン失敗の原因
どちらかでもわかる方、教えてください。
Sky_Thunder
Scratcher
100+ posts

Scratch APIに対して理解を深めるトピック

#268
確かGASのIPはScratch側にブロックされていた覚えがあります(Replit等も)
それが429が出る理由です(出典探し中)

—- 出典について
2:02 >> 出典とは言い難いですが、このトピックでも「ReplitがScratchにブロックされている」との記述を見つけました
2:04 >> このトピックも見つけました。

Last edited by Sky_Thunder (Dec. 1, 2023 17:06:16)

ito-noizi
Scratcher
100+ posts

Scratch APIに対して理解を深めるトピック

#269
GASは、Scratchのデータを取得しようとすると、傾向の取得と参照数を増やすAPI、ログインはすべて、
{
"response": "Too many requests"
}
のように出ました。
しかし、クラウド変数のログのAPIは問題なく取得できていました。
https://clouddata.scratch.mit.edu/logs?projectid= プロジェクトID &limit= どこまで調べるか(100まで) &offset= どこから調べるか 
(今年の4月頃です。最近、クラウドモニターが不安定なのを考えると、メンテナンスとかで仕様が変わってる可能性はあります。)

また、参考までにReplitですが、「パスワードではログインできないが、セッションID使ってログインできる」と、別のSNSで何人かが話していました。(いまいちPythonはわからないので、詳しい情報持っている人がいたら教えてください。)
tabakenn
Scratcher
100+ posts

Scratch APIに対して理解を深めるトピック

ユーザーネーム+パスワード → https://scratch.mit.edu/login/ → sessionID, x-token
x-token → https://api.scratch.mit.edu/projects/{projectId}?x-token={token} → project_info, project_token
project_token → https://projects.scratch.mit.edu/{projectId}?token={project_token} → project_json
sessionID → wss: //clouddata.scratch.mit.edu(scratchsessionsid={sessionId};)→ クラウド変数への接続

なので、/login がGAS をブロックしていてsessionID が取得できなくても、もともとsessionID を持っていればクラウド変数などに接続できるとかそういう話なのかな??
(もしsessionID から x-token を取得できるなら文字通りログインできるのですごい)

Last edited by tabakenn (Dec. 2, 2023 03:36:42)

yu-yu0202
Scratcher
100+ posts

Scratch APIに対して理解を深めるトピック

勘違いのため削除

Last edited by yu-yu0202 (Dec. 2, 2023 06:29:51)

ito-noizi
Scratcher
100+ posts

Scratch APIに対して理解を深めるトピック

#271
まずまず、GASがブロックされているかとかの前に、GASはWebSocketを使えないはずです。(自分が知らないだけかも)
Catapult-
Scratcher
100+ posts

Scratch APIに対して理解を深めるトピック

#269#273
ありがとうございます。sessionIDによるログインを試して、無理だったらwebサーバを経由してログインしてみます。
Catapult-
Scratcher
100+ posts

Scratch APIに対して理解を深めるトピック

今、GASでscratchsessionsidによるログインを試みています。
tokenは取得できるのですが、scratchcsrftokenが取得できません。
ネットワークログを見てもいつの間にかcookieに入っており、レスポンスヘッダやレスポンスを見ても見つかりません。
どこから取得できるのでしょうか?
yu-yu0202
Scratcher
100+ posts

Scratch APIに対して理解を深めるトピック

Chromeの場合、F12→アプリケーション→Cookieで行けた…はずです。
追記 F11じゃなかったです

Last edited by yu-yu0202 (Dec. 6, 2023 02:28:26)

Catapult-
Scratcher
100+ posts

Scratch APIに対して理解を深めるトピック

#276ありがとうございます。
すみません、自己解決しました。/csrf_tokenにscratchsessionsidを含めてGETすると、ヘッダーのSet-Cookieから取得できました。
429を吐くことも多いですが、4~5回に一回程度は通るので使えそうです。

質問続きで申し訳ないのですが、scratchsessionsidは不変のものなのでしょうか。見ていた限りでは変わってなさそうですが、月に一回程度変わったりするものなのでしょうか。
newmomizi_txt
Scratcher
1000+ posts

Scratch APIに対して理解を深めるトピック

#277
sessionidについて分かっているのは以下の2つです。

・Cookieを編集してsessionidをいじると、強制的にログアウトされた。
・「複数デバイスでログインすると片方が強制ログアウトされる」現象で、それが実際に発生したとき、sessionidが変わっていた。

このことから、「sessionidがサーバー側の値と一致しない場合、強制的にログアウトされる」という仕様があると推測できます(当たり前ですが)。

そして、私は数か月前からノートPCとデスクトップPCの両方でnewmomizi_txtのアカウントにログインしていますが、その間強制ログアウトは発生しなかったため、sessionidも変わっていないということになります。

結論としては、
「sessionidは何らかの要因により変わることもあるが、基本的には変わらないものと見なしても問題ない。変わったらその都度対応すればいい」
という感じです。
InfinityServerSystem
Scratcher
1 post

Scratch APIに対して理解を深めるトピック

https://scratch.mit.edu/accounts/login/
の使い方を教えて下さい。
tabakenn
Scratcher
100+ posts

Scratch APIに対して理解を深めるトピック

/accounts/login/ を使用することで、sessionID とx-token という個人を表すキーを入手できます。(絶対に流出させてはダメ)
ユーザーネーム+パスワード → https://scratch.mit.edu/accounts/login/ → sessionID, x-token
x-token → https://api.scratch.mit.edu/projects/{projectId}?x-token={token} → project_info, project_token
project_token → https://projects.scratch.mit.edu/{projectId}?token={project_token} → project_json
sessionID → wss: //clouddata.scratch.mit.edu(scratchsessionsid={sessionId};)→ クラウド変数への接続

POST(ヘッダーとクッキー、JSON → クッキーとJSON)(ブラウザの検索バーから使用することはできません。)
import json
import requests

# def login(username: str, password: str) -> (token: str, scratchsessionsid: str, scratchcsrftoken: str)

url = "https://scratch.mit.edu/accounts/login/
headers = {
”x-csrftoken“: ”a“,
”x-requested-with“: ”XMLHttpRequest“,
”Cookie“: f”scratchcsrftoken=a;“,
”referer“: ”https://scratch.mit.edu“,
”user-agent“: ”“
}
data = json.dumps({
”username“: username,
”password“: password
})

response = requests.post(url, data=data, headers=headers)

if response.status_code == 403: # Forbidden
raise Exception(”Incorrect username or password.")
response.raise_for_status()

content = response.json()
cookie = response.headers

token = content
import re
scratchsessionsid = re.search(
“scratchsessionsid\”.*?\“);”, cookie).group(1)
scratchcsrftoken = re.search(
“scratchcsrftoken.*?);”, cookie).group(1)

https://scratch.mit.edu/accounts/login/ と、https://scratch.mit.edu/login/ は同じものらしいです。

Last edited by tabakenn (Dec. 6, 2023 05:10:53)

Powered by DjangoBB