跳转至

获取作品

获取作品信息

解析作品ID

使用getWorkIdFromUrl方法从作品url中提取作品的id。

def getWorkIdFromUrl(url : str) -> str
示例:
from icodeapi import getWorkIdFromUrl
print(getWorkIdFromUrl('https://icodeshequ.youdao.com/work/a1f09b5eb34a48dfbdc8dee59d130ec6'))
输出:
a1f09b5eb34a48dfbdc8dee59d130ec6

作品信息元组生成器

使用WorkInfoTupleGenerator函数生成一个作品信息元组,该元组可用于IcodeAPI.submitWork的参数传递。

def WorkInfoTupleGenerator(api : IcodeAPI, workId : str) -> tuple

api : 发送请求使用的IcodeAPI对象
workId : 作品id

也有异步版本AsyncWorkInfoTupleGenerator,功能和参数设置完全相同,但是api参数需填入AsyncIcodeAPI对象。

获取作品信息

使用IcodeAPI.getWorkDetail方法获取一个作品的基本信息。

def getWorkDetail(self, 
    workId : str, 
    addBrowseNum : bool = True
) -> dict

workId : 作品id
addBrowseNum : 是否增加浏览量

返回的字典格式通常如下:

{
    'id': str,  # 作品id
    'title': str,  # 作品标题
    'imgUrl': str,  # 作品封面url
    'description': str, # 作品简介
    'type': int, # 作品类型
    'userId': str, # 发布者用户id
    'status': int, # 发布状态(1为未发布,2为已发布)
    'likeNum': int, # 点赞数
    'browseNum': int, # 浏览量
    'enshrineNum': int, # 收藏量
    'code': str,  # 作品源码
    'userName': str,  # 发布者用户名
    'userImage': str,  # 发布者用户头像url
    'haveLiked': bool ,  # 是否已点赞
    'haveEnshrined': bool,  # 是否收藏
    'createTimeStr': str,   # 创建时间
    'updateTimeStr': str,  # 更新时间
    'codeLanguage': str,  # 代码语言(blocky, scratch或python)
    'shortLink': str,  # 分享链接
    'theme': str,  # 作品主题
    'subTheme': str,  # 作品发布主题
    'iframeUrl': str,  # 作品iframe地址
    'scratchFile': str,  # scratch作品文件url
    'codeType': str,  # 代码类型
    'firstPopups': bool , # 是否在作品发布者点进该作品后显示弹窗
    'forkAuthorizationStatus': bool,  # 是否允许他人fork
    'isFirstPublish': bool, # 是否为首次发布
    'haveReported': bool # 是否已举报
}

获取作品发布信息

使用IcodeAPI.getWorkSubmitInfo方法获取一个作品在发布时向后台提交的数据。(与IcodeAPI.submitWork方法发送的数据几乎相同)。

def getWorkSubmitInfo(self, workId : str) -> dict
返回的字典格式通常如下:
{
    'avatar': str,  # 作者头像url
    'category': str,  # 不明意义
    'codeType': str,  # 代码类型
    'commit': str,  # 提交时间
    'createtime': str,  # 创建时间
    'description': str,  # 作品简介
    'fork': int,  # 是否允许fork
    'forkcommit': str,  # 不明意义
    'forkfrom': str,  # 从哪里fork(一个workId)
    'likes': int,  # 点赞数
    'owner': str,  # 不明意义
    'publish': int,  # 是否公开(1为不公开,2为公开)
    'qrCodeImage': str,  # 作品二维码图片url
    'shareMessage': str,  # 分享信息
    'shareText': str,  # 分享文本
    'shareTitle': str,  # 分享标题
    'subtheme': str,  # 发布主题
    'theme': str,  # 主题
    'thumbnail': str,  # 封面url
    'thumbnailList': list,  # 封面列表
    'title': str,  # 标题
    'username': str,  # 作者名
    'visits': int,  # 浏览量
    'workid': str  # 作品id
}

获取更多作品

使用IcodeAPI.getMoreWorks方法获取更多作品。

def getMoreWorks(self, userId : str = None, workId : str = None) -> list

参数userIdworkId都是可选的,如果同时提供,则以userId为准。
参数userId为用户id。
参数workId为作品id。 如果只填入了workId,那么将会自动使用self.getWorkDetail方法获取作品发布者id。

返回的字典格式通常如下:

[
    {
        'id': str,  # 作品id
        'title': str,  # 作品标题
        'imgUrl': str,  # 作品封面url
        'likeNum': int,  # 作品点赞数
        'browseNum': int,  # 作品浏览数
        'userName': str,  # 发布者用户名
        'userImage': str # 发布者头像url
    }
    # 列表中可以同时存在多个元素,表示有多个作品。
]

获取社区中的所有作品

使用IcodeAPI.getWorks方法获取社区中的所有作品。
IcodeAPI.getWorks提供了检索方式。

def getWorks(self, 
    page : int = 1, 
    getNum : int = 20, 
    sortType : int = 2, 
    theme : str = 'all', 
    codeLanguage : str = 'all', 
    keyword : Union[str, any] = '') -> list

参数page为页码,默认为1
参数getNum为每页的作品数量,默认为20
参数sortType为排序方式,默认为2。1为按点赞量从大到小排序,2则为按发布时间从现在往以前排序。
参数theme为作品类型,默认为all,即所有类型。可以为all , play , story , art , minecraft , scratch , turtle。
参数codeLanguage为代码语言,默认为all,即所有语言。可以为all , blockly , scratch , python。
参数keyword为获取到作品的检索关键词,默认为空。

返回的字典格式通常如下:

[
    {
        'id': str,  # 作品id
        'title': str,  # 作品标题
        'imgUrl': str,  # 作品封面url
        'userId': str,  # 作品发布者id
        'browseNum': int,  # 作品浏览量
        'userName': str,  # 作品发布者用户名
        'userImage': str,  # 作品发布者头像url
        'codeLanguage': str # 作品语言类型
    }
]

获取当前账号下的作品

使用IcodeAPI.getMyWorks方法获取当前登录账号的所有作品。
它和IcodeAPI.getWorks一样提供检索方式,并且可以获取未发布的作品。

def getMyWorks(
    self, 
    page : int = 1, 
    getNum : int = 20, 
    theme : str = 'all', 
    codeLanguage : str = 'all', 
    status : int = 2, 
    keyword : Union[str, any] = '') -> list

参数page为页码,默认为1
参数getNum为每页的作品数量,默认为20
参数theme为作品类型,默认为all,即所有类型。可以为all , play , story , art , minecraft , scratch , turtle。
参数codeLanguage为代码语言,默认为all,即所有语言。可以为all , blockly , scratch , python。
参数status为作品状态,默认为2,即所有状态。可以为1或2。1为未发布,2为已发布。
参数keyword为获取到作品的检索关键词,默认为空。

返回的字典格式通常如下:

[
    {
        'id': str,  # 作品id
        'title': str,  # 作品标题
        'imgUrl': str,  # 作品封面url
        'status': int, # 作品发布状态
        'userId': str,  # 作品发布者id
        'likeNum': int,  # 作品点赞量
        'browseNum': int,  # 作品浏览量
        'enshrineNum': int,  # 作品收藏量
        'forkNum': int,  # 作品被改编量
        'userName': str,  # 作品发布者用户名
        'userImage': str,  # 作品发布者头像url
        'codeLanguage': str,  # 作品语言类型
        'theme': str,  # 作品类型
        'subTheme': str # 作品发布类型
    }
]

获取作品评论

使用IcodeAPI.getWorkComments方法获取作品的所有评论。

def getWorkComments(self, workId : str, page : int = 1, getNum : int = 20) -> list

参数workId为作品id。
参数page为页码,默认为1。 参数getNum为每页的评论数量,默认为20

返回的字典格式通常如下:

[
    {
        'id': int,  # 作品评论id
        'content': str,  # 作品评论内容
        'userId': str,  # 作品评论发布者id
        'name': str,  # 作品评论发布者用户名
        'image': str,  # 作品评论发布者头像url
        'isAuthor': bool,  # 是否为作者
        'praiseNum': int,  # 作品评论点赞量
        'replyNum': int,  # 作品评论回复量
        'time': int,  # 作品评论发布时间
        'hasPraised': bool # 是否被当前登录的账户点赞
    }
]

获取Scratch作品内部资源

我们都知道,Scratch作品内部可以包含很多资源,例如图片、音乐等。它们在Scratch中被称为“asset”。
每个asset有一个自己的md5ext属性,是由文件内容由MD5哈希加密和文件后缀组合而来的。md5ext属性可以在project.json等Scratch源代码文件中找到。
使用IcodeAPI.getScratchAsset方法可以获取一个在小图灵服务器中指定md5ext属性的asset文件。

def getScratchAsset(self, md5ext : str) -> bytes

参数md5ext为asset文件的md5ext属性。

该方法以二进制(bytes)形式返回asset文件的内容。可以直接使用返回值进行文件读写等操作。
需要注意的是,如果获取的asset文件类型为svg文件,那么需要将返回值解码。例如:

from icodeapi import IcodeAPI
cookie = input('请输入cookie: ')
api = IcodeAPI(cookie = cookie) # 构建用户对象
# 获取mp3类型 asset文件
with open("Everyday World.mp3", 'wb') as fb:
    content = api.getScratchAsset('119eab65876ab93a229d1a339238db39.mp3') # 获取文件内容
    fb.write(content) # 写入
# 获取svg类型 asset文件
with open('testsvg.svg', 'w', encoding = 'utf-8') as f:
    content = api.getScratchAsset('71b09db63e151c30d92b16181520bb29.svg') # 获取文件内容
    f.write(content.decode('utf-8')) # 解码内容并写入
代码运行完毕后,svg文件可以被正确地查看,mp3文件可以被正常播放。
如果想了解更多关于Scratch Json的内容,另行参阅:

Json - Scratch Wiki
Scratch File Format - Scratch Wiki
Scratch3 Static Assets API