Scratch3技术分析之项目主页API(第3篇)
文章目录
本文将关心项目主页涉及的API。
相关的API包括:
- 拉取项目数据
- 更新项目信息
- 更新项目名
- 更新操作说明
- 更新备注与谢志
- 点赞(❤️/⭐️)
- 被改编/浏览的次数
- 评论
我们以测试项目https://scratch.mit.edu/projects/277117877
为例, 打开页面,加载的数据还真不少。
其中https://scratch.mit.edu/js/projects.bundle.js
足有4.7M,下载时间就用了9.3s。
拉取项目数据
我们回到正题,开始关心各个API。既然是项目主页,首先得把整个项目的数据拉进页面,供用户浏览。我们便从这个说起。
项目数据包括项目的内部数据
和项目的外部数据
(在Scratch3技术分析之创作平台API(第1篇)定义了这两个概念)
1 2 |
GET https://projects.scratch.mit.edu/277117877 # 项目的内部数据 GET https://api.scratch.mit.edu/projects/277117877 # 项目的外部数据 |
项目的内部数据
GET https://projects.scratch.mit.edu/277117877
1
|
{"targets":[{"isStage":true,"name":"Stage","variables":{"`jEk@4|i[#Fk?(8x)AV.-my variable":["æçåé",0]},"lists":{},"broadcasts":{},"blocks":{},"comments":{},"currentCostume":0,"costumes":[{"assetId":"cd21514d0531fdffb22204e0ec5ed84a","name":"èæ¯1","md5ext":"cd21514d0531fdffb22204e0ec5ed84a.svg","dataFormat":"svg","rotationCenterX":240,"rotationCenterY":180}],"sounds":[{"assetId":"83a9787d4cb6f3b7632b4ddfebf74367","name":"åµ","dataFormat":"wav","format":"","rate":44100,"sampleCount":1032,"md5ext":"83a9787d4cb6f3b7632b4ddfebf74367.wav"}],"volume":100,"layerOrder":0,"tempo":60,"videoTransparency":50,"videoState":"on","textToSpeechLanguage":null},{"isStage":false,"name":"è§è²1","variables":{},"lists":{},"broadcasts":{},"blocks":{"#ez$qP+47m]1?FAkK7EQ":{"opcode":"event_whenflagclicked","next":"4(Rs_W.WmWf$u^fquvr=","parent":null,"inputs":{},"fields":{},"shadow":false,"topLevel":true,"x":249,"y":-313},"4(Rs_W.WmWf$u^fquvr=":{"opcode":"motion_movesteps","next":"l]Zt{~YW17*uEI[V*-ru","parent":"#ez$qP+47m]1?FAkK7EQ","inputs":{"STEPS":[1,[4,"10"]]},"fields":{},"shadow":false,"topLevel":false},"l]Zt{~YW17*uEI[V*-ru":{"opcode":"microbit_displaySymbol","next":null,"parent":"4(Rs_W.WmWf$u^fquvr=","inputs":{"MATRIX":[1,"t2p#3HOI[w=AQ2`(S:@O"]},"fields":{},"shadow":false,"topLevel":false},"t2p#3HOI[w=AQ2`(S:@O":{"opcode":"matrix","next":null,"parent":"l]Zt{~YW17*uEI[V*-ru","inputs":{},"fields":{"MATRIX":["0101010101100010101000100"]},"shadow":true,"topLevel":false}},"comments":{},"currentCostume":0,"costumes":[{"assetId":"b7853f557e4426412e64bb3da6531a99","name":"é å1","bitmapResolution":1,"md5ext":"b7853f557e4426412e64bb3da6531a99.svg","dataFormat":"svg","rotationCenterX":48,"rotationCenterY":50},{"assetId":"e6ddc55a6ddd9cc9d84fe0b4c21e016f","name":"é å2","bitmapResolution":1,"md5ext":"e6ddc55a6ddd9cc9d84fe0b4c21e016f.svg","dataFormat":"svg","rotationCenterX":46,"rotationCenterY":53}],"sounds":[{"assetId":"83c36d806dc92327b9e7049a565c6bff","name":"åµ","dataFormat":"wav","format":"","rate":44100,"sampleCount":37376,"md5ext":"83c36d806dc92327b9e7049a565c6bff.wav"}],"volume":100,"layerOrder":1,"visible":true,"x":0,"y":0,"size":100,"direction":90,"draggable":false,"rotationStyle":"all around"}],"monitors":[],"extensions":["microbit"],"meta":{"semver":"3.0.0","vm":"0.2.0-prerelease.20190102175344","agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36"}} |
为了获得好的阅读效果,你可以将它们复制到https://jsoneditoronline.org/
项目的外部数据
GET https://api.scratch.mit.edu/projects/277117877
|
|
每个字段的含义参考:Project Object
更新项目信息
更新项目名
PUT https://api.scratch.mit.edu/projects/277117877
以json形式提交了: {"title":"test-api2"}
服务器返回和GET https://api.scratch.mit.edu/projects/277117877
一样的信息。
可以看出它们的url也是一样的
更新操作说明
PUT https://api.scratch.mit.edu/projects/277117877
以json形式提交了: {"instructions":"操作说明test"}
服务器返回同上。
更新备注与谢志
PUT https://api.scratch.mit.edu/projects/277117877
以json形式提交了: {"description":"test"}
服务器返回同上。
一致性非常好。
点赞(❤️/⭐️)
❤️代表loves
, ⭐️代表favorites
这两个的接口十分相似:
1 2 |
POST https://api.scratch.mit.edu/proxy/projects/277117877/loves/user/api_test POST https://api.scratch.mit.edu/proxy/projects/277117877/favorites/user/api_test |
后端返回分别为
1 2 |
{"projectId":"277117877","userLove":true,"statusChanged":true} # ❤️ {"projectId":"277117877","userFavorite":true,"statusChanged":true} # ⭐️ |
如果你要取消它们,API分别为
1 2 |
DELETE https://api.scratch.mit.edu/proxy/projects/277117877/loves/user/api_test # ❤️ DELETE https://api.scratch.mit.edu/proxy/projects/277117877/favorites/user/api_test # ⭐️ |
被改编/浏览的次数
被浏览的次数,一个用户最多贡献一次。可以使用redis的set来做(记录用户id)。
评论
最后我们来关心评论。这部分稍微复杂些。
顶层评论
POST https://api.scratch.mit.edu/proxy/comments/project/277117877
提交的json数据为: {"content":"test","parent_id":"","commentee_id":""}
注意到顶层评论的parent_id为空。
后端返回:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
{ "id": 106196727, "parent_id": null, "commentee_id": null, "content": "test", "datetime_created": "2019-01-15T04:38:43.000Z", "datetime_modified": "2019-01-15T04:38:43.000Z", "visibility": "visible", "author": { "id": 40103875, "username": "api_test", "scratchteam": false, "image": "https://cdn2.scratch.mit.edu/get_image/user/40103875_60x60.png" }, "reply_count": 0 } |
子评论
POST https://api.scratch.mit.edu/proxy/comments/project/277117877
提交的json数据为: {"content":"子评论","parent_id":106196727,"commentee_id":40103875}
后端返回:
|
|
对子评论的回复
POST https://api.scratch.mit.edu/proxy/comments/project/277117877
提交的json数据为: {"content":"对子评论 的回复","parent_id":106196727,"commentee_id":40103875}
后端返回:
|
|
可以看出parent_id
始终指向顶级评论
。
关闭评论功能
PUT https://api.scratch.mit.edu/projects/277117877
提交的json数据为: {"comments_allowed":false}
删除评论
删除权利在项目拥有者手中,而不在评论发出者手中。
DELETE https://api.scratch.mit.edu/proxy/comments/project/277117877/comment/106196842
返回:{}
举报评论
POST https://api.scratch.mit.edu/proxy/project/277117877/comment/106196741/report
返回值: {"reportId":null}
文章作者 种瓜
上次更新 2019-01-15