Discuss Scratch
- Discussion Forums
- » 日本語
- » Scratch APIに対して理解を深めるトピック
- Teba_eleven
-
5 posts
Scratch APIに対して理解を深めるトピック
API素人 ですが、質問があります。
APIを利用してScratchのWeb上に公開されているプロジェクトのプログラムデータ(jsonデータ?)を取得したいのですが、どのようにすれば良いのでしょうか。色々と調べてみたのですが、作品のプログラムを取得する方法についての回答を見つけることができなかったため、こちらで質問させていただきました。何卒よろしくお願いします。
APIを利用してScratchのWeb上に公開されているプロジェクトのプログラムデータ(jsonデータ?)を取得したいのですが、どのようにすれば良いのでしょうか。色々と調べてみたのですが、作品のプログラムを取得する方法についての回答を見つけることができなかったため、こちらで質問させていただきました。何卒よろしくお願いします。
- Catapult-
-
100+ posts
Scratch APIに対して理解を深めるトピック
#202
javascriptを使える方なら、このサイトのコードを読むことをお勧めします。おそらくやろうとしていることに近いことを行っています。
私もまだ深く読んでいませんが、
①turbowarpからプロジェクトのトークンを取得し、(公開されているプロジェクトじゃないと読み込めないため)
②読み込んだトークンを使ってScratchからJSONを読み込んでいる
ように見えます。
こんな感じで取得できました。①②が関数内の1行目2行目に対応しています。それぞれawaitで処理が終わるまで待って、最後にコンソールに吐き出すという関数です。(コンソールで実行できますが、他人の書いたコードなので信用しないでください。実行する前に意味を理解することを強くお勧めします。)
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); }
Last edited by Catapult- (March 17, 2023 02:06:24)
- ryufox
-
100+ posts
Scratch APIに対して理解を深めるトピック
外部からプロジェクトを上書きするにはどうすればいいのですか。
できればブラウザでできるものがいいです。
できればブラウザでできるものがいいです。
Last edited by ryufox (March 21, 2023 05:21:15)
- Catapult-
-
100+ posts
Scratch APIに対して理解を深めるトピック
既にあるプロジェクトを上書きするには、
にPUT通信を行うことでできます。
headersにcontent-type:application/json,
bodyにproject.json,
あとCookieも添付してあげると行けます。(cookieの中でもscratchsessionsidはHTTPOnlyなので注意!私の2時間を吸われました!)
→よってScratch以外のサイトから書き換えるのは難しそうです。
今すぐ書き換えしたいならブラウザのコンソールで
を実行することで書き換えられますが、このコードが悪意のあるコードである可能性をお忘れなく。
このコードの意味が全く分からない場合は、「HTTPプロトコル」「javascript」「JSON」などの用語で検索してみることをお勧めします。がんばれ!
https://projects.scratch.mit.edu/<projectid>
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
-
5 posts
Scratch APIに対して理解を深めるトピック
#203
ありがとうございます。turbowarpのapi以外で取得する方法はありませんか?
ありがとうございます。turbowarpのapi以外で取得する方法はありませんか?
- Catapult-
-
100+ posts
Scratch APIに対して理解を深めるトピック
#206今探してみたら、のproject_tokenに書いてありました。
(API探しはコンソールのネットワークタブ見ると便利ですよ)
みたいな感じで取得できます。
認証とかは特に必要なかったです。なんなら検索窓にURLを張り付けるだけでも閲覧できます。
https://api.scratch.mit.edu/projects/<projectid>
(API探しはコンソールのネットワークタブ見ると便利ですよ)
const token = (await (await fetch("https://api.scratch.mit.edu/projects/"+projectid)).json()).project_token;
認証とかは特に必要なかったです。なんなら検索窓にURLを張り付けるだけでも閲覧できます。
- magicAho
-
1000+ posts
Scratch APIに対して理解を深めるトピック
スタジオにプロジェクトを追加するAPI及び追加する方法と必要なtokenの名前等を教えてください。
- Catapult-
-
100+ posts
Scratch APIに対して理解を深めるトピック
#208
だいたい何をしたいのかは薄々わかりますが
にPOST通信すればいけます。bodyは何もなくてOK、ただheaderにx-tokenを要求してくるので事前に/sessionからGETしておく必要があります。
(さらにこのトークン取得にも“x-requested-with”: “XMLHttpRequest”を指定する必要があります)
jsなら自作関数どうぞ(自作の拡張機能に組み込んでるやつです)
だいたい何をしたいのかは薄々わかりますが
https://api.scratch.mit.edu/studios/<studioid>/project/<projectid>
(さらにこのトークン取得にも“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
-
500+ posts
Scratch APIに対して理解を深めるトピック
ちょっと説明力がなくて恐縮なのですが
今自分がなんのアカウントでログインしているか、を取得できるAPIはありますか?
今自分がなんのアカウントでログインしているか、を取得できるAPIはありますか?
- yukku
-
1000+ posts
Scratch APIに対して理解を深めるトピック
https://scratch.mit.edu/session/をcookieを含めてGETするとログインしているユーザーの情報が入手できます。
注意点としてヘッダーのx-requested-withの値をXMLHttpRequestにする必要があります。
注意点としてヘッダーのx-requested-withの値をXMLHttpRequestにする必要があります。
- Teba_eleven
-
5 posts
Scratch APIに対して理解を深めるトピック
>> #207
ありがとうございます!!scratchの公式APIのみを用いてJSONデータを取得することができました。ありがとうございます。JavaScriptについてはある程度理解しているのですが、API関連には疎いので、本当に勉強になりました。
もしよければ、APIの解析についての勉強法などについても教えていただきたいです。また、ScratchのAPIの情報はどこから閲覧することができますか?よろしくお願いいたします。
ありがとうございます!!scratchの公式APIのみを用いてJSONデータを取得することができました。ありがとうございます。JavaScriptについてはある程度理解しているのですが、API関連には疎いので、本当に勉強になりました。
もしよければ、APIの解析についての勉強法などについても教えていただきたいです。また、ScratchのAPIの情報はどこから閲覧することができますか?よろしくお願いいたします。
- ito-noizi
-
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)
〈プログラム〉
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
-
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.
```
参考になります。ありがとうございます。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
-
1000+ posts
Scratch APIに対して理解を深めるトピック
CORSエラーですね。ちなみに、エラーの内容は以下の通りです: >> #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.
```
オリジン「http://127.0.0.1:5500」から「https://api.scratch.mit.edu/projects/xxxx」でフェッチへのアクセスは、CORSポリシーによってブロックされています。要求されたリソースに「Access-Control-Allow-Origin」ヘッダーはありません。 不透明な応答がニーズにお応えする場合は、リクエストのモードを「no-cors」に設定して、CORSを無効にしたリソースを取得します。