Discuss Scratch

neko_k_neko
New Scratcher
0 posts

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

APIでなんか流用できます?
Teba_eleven
Scratcher
5 posts

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

API素人ですが、質問があります。
APIを利用してScratchのWeb上に公開されているプロジェクトのプログラムデータ(jsonデータ?)を取得したいのですが、どのようにすれば良いのでしょうか。色々と調べてみたのですが、作品のプログラムを取得する方法についての回答を見つけることができなかったため、こちらで質問させていただきました。何卒よろしくお願いします。
Catapult-
Scratcher
100+ posts

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

#202
javascriptを使える方なら、このサイトのコードを読むことをお勧めします。おそらくやろうとしていることに近いことを行っています。
私もまだ深く読んでいませんが、
①turbowarpからプロジェクトのトークンを取得し、(公開されているプロジェクトじゃないと読み込めないため)
②読み込んだトークンを使ってScratchからJSONを読み込んでいる
ように見えます。
async function getjson(projectid){
  const token=(await(await fetch("https://trampoline.turbowarp.org/proxy/projects/"+projectid)).json()).project_token;
  const jsondata=(await(await fetch("https://projects.scratch.mit.edu/"+projectid+"/?token="+token)).json());
  console.log(jsondata);
}
こんな感じで取得できました。①②が関数内の1行目2行目に対応しています。それぞれawaitで処理が終わるまで待って、最後にコンソールに吐き出すという関数です。(コンソールで実行できますが、他人の書いたコードなので信用しないでください。実行する前に意味を理解することを強くお勧めします。)

Last edited by Catapult- (March 17, 2023 02:06:24)

ryufox
Scratcher
100+ posts

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

外部からプロジェクトを上書きするにはどうすればいいのですか。
できればブラウザでできるものがいいです。

Last edited by ryufox (March 21, 2023 05:21:15)

Catapult-
Scratcher
100+ posts

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

既にあるプロジェクトを上書きするには、
https://projects.scratch.mit.edu/<projectid>
にPUT通信を行うことでできます。
headersにcontent-type:application/json,
bodyにproject.json,
あとCookieも添付してあげると行けます。(cookieの中でもscratchsessionsidはHTTPOnlyなので注意!私の2時間を吸われました!)
→よってScratch以外のサイトから書き換えるのは難しそうです。

今すぐ書き換えしたいならブラウザのコンソールで
await fetch(
  "https://projects.scratch.mit.edu/<projectid>",
  {headers:{
    "content-type": "application/json"
  },
  credentials: 'include',
  body:JSON.stringify(/*ここにproject.jsonを張り付け*/),
  method:"PUT"}
);
を実行することで書き換えられますが、このコードが悪意のあるコードである可能性をお忘れなく。
このコードの意味が全く分からない場合は、「HTTPプロトコル」「javascript」「JSON」などの用語で検索してみることをお勧めします。がんばれ!
Teba_eleven
Scratcher
5 posts

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

#203
ありがとうございます。turbowarpのapi以外で取得する方法はありませんか?
Catapult-
Scratcher
100+ posts

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

#206今探してみたら、
https://api.scratch.mit.edu/projects/<projectid>
のproject_tokenに書いてありました。
(API探しはコンソールのネットワークタブ見ると便利ですよ)
const token = (await (await fetch("https://api.scratch.mit.edu/projects/"+projectid)).json()).project_token;
みたいな感じで取得できます。
認証とかは特に必要なかったです。なんなら検索窓にURLを張り付けるだけでも閲覧できます。
magicAho
Scratcher
1000+ posts

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

スタジオにプロジェクトを追加するAPI及び追加する方法と必要なtokenの名前等を教えてください。
Catapult-
Scratcher
100+ posts

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

#208
だいたい何をしたいのかは薄々わかりますが
https://api.scratch.mit.edu/studios/<studioid>/project/<projectid>
にPOST通信すればいけます。bodyは何もなくてOK、ただheaderにx-tokenを要求してくるので事前に/sessionからGETしておく必要があります。
(さらにこのトークン取得にも“x-requested-with”: “XMLHttpRequest”を指定する必要があります)

jsなら自作関数どうぞ(自作の拡張機能に組み込んでるやつです)
async function addtostudio(studioid,projectid){
  const token = (await(await fetch("/session",{headers:{"x-requested-with": "XMLHttpRequest"}})).json()).user.token;
  await fetch("https://api.scratch.mit.edu/studios/"+studioid+"/project/"+projectid,{headers:{"x-token": token,"x-requested-with": "XMLHttpRequest"},method:"POST"})
}

Last edited by Catapult- (March 22, 2023 14:48:50)

Atridott
Scratcher
500+ posts

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

ちょっと説明力がなくて恐縮なのですが
今自分がなんのアカウントでログインしているか、を取得できるAPIはありますか?
yukku
Scratcher
1000+ posts

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

https://scratch.mit.edu/session/をcookieを含めてGETするとログインしているユーザーの情報が入手できます。
注意点としてヘッダーのx-requested-withの値をXMLHttpRequestにする必要があります。
ryufox
Scratcher
100+ posts

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

スクラッチ アカウントを作った日を確認?するapiってありますか?
yukku
Scratcher
1000+ posts

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

>> #212

https://api.scratch.mit.edu/users/<username>/ の history > joined がそれだと思います。
Mario-098
Scratcher
100+ posts

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

拡張機能「翻訳」のプログラムを教えてください(トピ違いだったら許して)
Teba_eleven
Scratcher
5 posts

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

>> #207

ありがとうございます!!scratchの公式APIのみを用いてJSONデータを取得することができました。ありがとうございます。JavaScriptについてはある程度理解しているのですが、API関連には疎いので、本当に勉強になりました。

もしよければ、APIの解析についての勉強法などについても教えていただきたいです。また、ScratchのAPIの情報はどこから閲覧することができますか?よろしくお願いいたします。
Catapult-
Scratcher
100+ posts

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

#215
私も最近APIをいじり始めたばかりですが、このノートなどを参考にしました。
APIを探す時は、デベロッパーツールの「ネットワーク」タブを開いた状態でAPIを取得したいアクションを起こすと、
どのAPIにアクセスしたかを詳しく見ることができますよ。(ただしクラウド変数のようなsocketを使う通信は監視できません)
ito-noizi
Scratcher
100+ posts

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

GAS(Google Apps Script)でこのプロジェクトのクラウド変数をスクレイピングするプログラムを書きましたがこれだとエラーが出ます。どこが間違っているのか、またどのように直せばよいのか教えてくれるととても嬉しいです。お願いします。また返信はプロフィールに連絡してくれると嬉しいです。ちなみにこの質問は質問コーナー6で質問しましたがこちらのフォーラムで質問した方がよいと助言され質問しに来ました。
〈プログラム〉
function 頑張って作ったから間違い教えてください(){
// ScratchのログインAPIのURL
var login_url = "https://scratch.mit.edu/login/“;
// ログイン情報(credentialsという名前にする)
var credentials = {
username: ”ito-noizi“,
password: ”ちょっといえません“
};
// POSTオプション
var post_option = {
method: ”post“,
payload: credentials,
followRedirects: true
};
// ログインリクエストを送信
var response = UrlFetchApp.fetch(login_url, post_option);
// レスポンスのヘッダーからセッションIDとCSRFトークンを取得
var cookies = response.getHeaders();
var sessionid = cookies.match(/scratchsessionsid.*?);/);
var csrftoken = cookies.match(/scratchcsrftoken.*?);/);
// 少し待つ
Utilities.sleep(10);
// ヘッダーにセッションIDとCSRFトークンを追加
var header = {
Cookie: cookies,
“X-CSRFToken”: csrftoken
};
var get_option = {
method: “get”,
headers: header,
followRedirects: true
};
// スプレッドシートを取得
var ss = SpreadsheetApp.getActiveSpreadsheet();
// シートを取得
var sheet = ss.getActiveSheet();
// クラウド変数のURLを指定(プロジェクトIDとセッションIDとCSRFトークンを付与)
var url =”https://scratch.mit.edu/cloudmonitor/832771060/“ +sessionid +”&csrftoken=“ +csrftoken;
// リクエストのオプションを指定
var options = {
muteHttpExceptions: true // エラーでもHttpResponseを返す
};
// 少し待つ
Utilities.sleep(10);
// URLからHttpResponseオブジェクトを取得;
var response = UrlFetchApp.fetch(url, options);
// ステータスコードとヘッダー情報を取得
var statusCode = response.getResponseCode();
var headers = response.getHeaders();
// ステータスコードとヘッダー情報をログに出力
Logger.log(”Status code: “ + statusCode);
Logger.log(”Headers: " + JSON.stringify(headers));
// ステータスコードが200でContent-Typeがapplication/jsonだった場合
if (statusCode == 200 && headers == “application/json”) {
// HttpResponseオブジェクトからJSONデータを取得
var json = JSON.parse(response.getContentText());
// シートの最終行を取得
var lastRow = sheet.getLastRow();
// JSONデータからクラウド変数の名前と値を取り出す
for (var i = 0; i < json.length; i++) {
var name = json.name;
var value = json.value;
// シートの最終行の次の行にクラウド変数の名前と値を書き込む
sheet.getRange(lastRow + i + 1, 1).setValue(name);
sheet.getRange(lastRow + i + 1, 2).setValue(value); // A,B列に値を書き込む
}
}
}
〈エラーコード〉
Exception: Request failed for https://scratch.mit.edu returned code 403. Truncated server response: (use muteHttpExceptions option to examine full response)
Teba_eleven
Scratcher
5 posts

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

>> #216
参考になります。ありがとうございます。api.scratchを使ったプロジェクトデータの取得方法ですが、もしかして外部サイトなどだと取得できない感じですかね?Scratchサイト以外で取得しようとすると以下のようなエラーが出ます。
```
Access to fetch at 'https://api.scratch.mit.edu/projects/xxxx' from origin 'http://127.0.0.1:5500' has been blocked by CORS policy: No ‘Access-Control-Allow-Origin’ header is present on the requested resource. If an opaque response serves your needs, set the request's mode to ‘no-cors’ to fetch the resource with CORS disabled.
```
magicAho
Scratcher
1000+ posts

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

Teba_eleven wrote:

>> #216
参考になります。ありがとうございます。api.scratchを使ったプロジェクトデータの取得方法ですが、もしかして外部サイトなどだと取得できない感じですかね?Scratchサイト以外で取得しようとすると以下のようなエラーが出ます。
```
Access to fetch at 'https://api.scratch.mit.edu/projects/xxxx' from origin 'http://127.0.0.1:5500' has been blocked by CORS policy: No ‘Access-Control-Allow-Origin’ header is present on the requested resource. If an opaque response serves your needs, set the request's mode to ‘no-cors’ to fetch the resource with CORS disabled.
```
CORSエラーですね。ちなみに、エラーの内容は以下の通りです:
オリジン「http://127.0.0.1:5500」から「https://api.scratch.mit.edu/projects/xxxx」でフェッチへのアクセスは、CORSポリシーによってブロックされています。要求されたリソースに「Access-Control-Allow-Origin」ヘッダーはありません。 不透明な応答がニーズにお応えする場合は、リクエストのモードを「no-cors」に設定して、CORSを無効にしたリソースを取得します。
yukku
Scratcher
1000+ posts

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

>> #217

GASをブロックしているAPIはいくつか存在しています。( 参照数を増やすもの、等 )
これもそれが原因だと思います。

Powered by DjangoBB