Skip to content

接口列表

注意

🟢代表已经实现,🟡代表正在实现或修改,🟤代表暂时不实现,🔵代表未来可能实现,🔴代表将会弃用。

handler接口列表
CLI接口方法
下载单个作品handle_one_video
下载用户发布作品handle_user_post
下载用户喜欢作品handle_user_like
下载用户收藏原声handle_user_music_collection
下载用户收藏作品handle_user_collection
下载用户合集作品handle_user_mix
下载用户直播流handle_user_live
下载用户首页推荐作品handle_user_feed
下载相似作品handle_related
下载好友作品handle_friend_feed
数据方法接口方法开发者接口
创建用户记录与目录get_or_add_user_data🟢
创建作品下载记录get_or_add_video_data🟢
获取用户信息fetch_user_profile🟢
单个作品数据fetch_one_video🟢
用户发布作品数据fetch_user_post_videos🟢
用户喜欢作品数据fetch_user_like_videos🟢
用户收藏原声数据fetch_user_music_collection🟢
用户收藏作品数据fetch_user_collection_videos🟢
用户收藏夹数据fetch_user_collects🟢
用户收藏夹作品数据fetch_user_collects_videos🟢
用户合集作品数据fetch_user_mix_videos🟢
用户直播流数据fetch_user_live_videos🟢
用户直播流数据2fetch_user_live_videos_by_room_id🟢
用户首页推荐作品数据fetch_user_feed_videos🟢
相似作品数据fetch_related_videos🟢
好友作品数据fetch_friend_feed_videos🟢
关注用户数据fetch_user_following🟢
粉丝用户数据fetch_user_follower🟢
查询用户数据fetch_query_user🟢
直播间wss负载数据fetch_live_im🟢
直播间wss弹幕fetch_live_danmaku🟢
关注用户的直播间信息fetch_user_following_lives🟢
utils接口列表
工具类接口类名方法状态
管理客户端配置ClientConfManager🟢
生成真实msTokenTokenManagergen_real_msToken🟢
生成虚假msTokenTokenManagergen_false_msToken🟢
生成ttwidTokenManagergen_ttwid🟢
生成webidTokenManagergen_webid🟢
生成verify_fpVerifyFpManagergen_verify_fp🟢
生成s_v_web_idVerifyFpManagergen_s_v_web_id🟢
生成直播signatureDouyinWebcastSignatureget_signature🟢
使用接口模型生成直播wss签名参数WebcastSignatureManagermodel_2_endpoint🟢
使用接口地址生成Xb参数XBogusManagerstr_2_endpoint🟢
使用接口模型生成Xb参数XBogusManagermodel_2_endpoint🟢
使用接口地址生成Ab参数ABogusManagerstr_2_endpoint🟢
使用接口模型生成Ab参数ABogusManagermodel_2_endpoint🟢
提取单个用户idSecUserIdFetcherget_sec_user_id🟢
提取列表用户idSecUserIdFetcherget_all_sec_user_id🟢
提取单个作品idAwemeIdFetcherget_aweme_id🟢
提取列表作品idAwemeIdFetcherget_all_aweme_id🟢
提取单个合集idMixIdFetcherget_mix_id🟢
提取列表合集idMixIdFetcherget_all_mix_id🟢
提取单个直播间号WebCastIdFetcherget_webcast_id🟢
提取列表直播间号WebCastIdFetcherget_all_webcast_id🟢
全局格式化文件名-format_file_name🟢
创建用户目录-create_user_folder🟢
重命名用户目录-rename_user_folder🟢
创建或重命名用户目录-create_or_rename_user_folder🟢
显示二维码-show_qrcode🟢
json歌词转lrc歌词-json_2_lrc🟢
cralwer接口列表
爬虫url接口类名方法状态
用户信息接口地址DouyinCrawlerfetch_user_profile🟢
主页作品接口地址DouyinCrawlerfetch_user_post🟢
喜欢作品接口地址DouyinCrawlerfetch_user_like🟢
收藏作品接口地址DouyinCrawlerfetch_user_collection🟢
收藏夹接口地址DouyinCrawlerfetch_user_collects🟢
收藏夹作品接口地址DouyinCrawlerfetch_user_collects_video🟢
音乐收藏接口地址DouyinCrawlerfetch_user_music_collection🟢
合集作品接口地址DouyinCrawlerfetch_user_mix🟢
作品详情接口地址DouyinCrawlerfetch_post_detail🟢
作品评论接口地址DouyinCrawlerfetch_post_comment🟢
推荐作品接口地址DouyinCrawlerfetch_post_feed🟢
关注作品接口地址DouyinCrawlerfetch_follow_feed🟢
朋友作品接口地址DouyinCrawlerfetch_friend_feed🟢
相关推荐作品接口地址DouyinCrawlerfetch_post_related🟢
直播接口地址DouyinCrawlerfetch_live🟢
直播接口地址(room_id)DouyinCrawlerfetch_live_room_id🟢
关注用户直播接口地址DouyinCrawlerfetch_following_live🟢
定位上一次作品接口地址DouyinCrawlerfetch_locate_post🟢
SSO获取二维码接口地址DouyinCrawlerfetch_login_qrcode🔴
SSO检查扫码状态接口地址DouyinCrawlerfetch_check_qrcode🔴
SSO检查登录状态接口地址DouyinCrawlerfetch_check_login🔴
用户关注列表接口地址DouyinCrawlerfetch_user_following🟢
用户粉丝列表接口地址DouyinCrawlerfetch_user_follower🟢
直播弹幕初始化接口地址DouyinCrawlerfetch_live_im_fetch🟢
查询用户接口地址DouyinCrawlerfetch_query_user🟢
直播弹幕接口地址DouyinWebSocketCrawlerfetch_live_danmaku🟢
处理 WebSocket 消息DouyinWebSocketCrawlerhandle_wss_message🟢
发送 ack 包DouyinWebSocketCrawlersend_ack🟢
发送 ping 包DouyinWebSocketCrawlersend_ping🟢
直播间房间消息DouyinWebSocketCrawlerWebcastRoomMessage🟢
直播间点赞消息DouyinWebSocketCrawlerWebcastLikeMessage🟢
直播间观众加入消息DouyinWebSocketCrawlerWebcastMemberMessage🟢
直播间聊天消息DouyinWebSocketCrawlerWebcastLeaveMessage🟢
直播间礼物消息DouyinWebSocketCrawlerWebcastGiftMessage🟢
直播间用户关注消息DouyinWebSocketCrawlerWebcastSocialMessage🟢
直播间用户关注消息DouyinWebSocketCrawlerWebcastFollowMessage🟢
直播间在线观众排行榜DouyinWebSocketCrawlerWebcastRoomUserSeqMessage🟢
直播间粉丝团更新消息DouyinWebSocketCrawlerWebcastUpdateFanTicketMessage🟢
直播间文本消息DouyinWebSocketCrawlerWebcastCommonTextMessage🟢
直播间对战积分消息DouyinWebSocketCrawlerWebcastMatchAgainstScoreMessage🟢
直播间粉丝团消息DouyinWebSocketCrawlerWebcastFansclubMessage🟢
dl接口列表
下载器接口类名方法状态
保存最后一次请求的aweme_idDouyinDownloadersave_last_aweme_id🟢
筛选指定日期区间内的作品DouyinDownloaderfilter_aweme_datas_by_interval🟢
创建下载任务DouyinDownloadercreate_download_task🟢
处理下载任务DouyinDownloaderhandler_download🟢
创建原声下载任务DouyinDownloadercreate_music_download_tasks🟢
处理原声下载任务DouyinDownloaderhandler_music_download🟢
创建流下载任务DouyinDownloadercreate_stream_tasks🟢
处理流下载任务DouyinDownloaderhandle_stream🟢

handler接口列表

创建用户记录与目录 🟢

异步方法,用于获取或创建用户数据同时创建用户目录。

参数类型说明
kwargsdictcli字典数据,需获取path参数
sec_user_idstr用户ID
dbAsyncUserDB用户数据库
返回类型说明
user_pathPath用户目录路径对象
py
import asyncio
from f2.apps.douyin.handler import DouyinHandler
from f2.apps.douyin.db import AsyncUserDB

kwargs = {
    "headers": {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36 Edg/126.0.0.0",
        "Referer": "https://www.douyin.com/",
    },
    "proxies": {"http://": None, "https://": None},
    "cookie": "YOUR_COOKIE_HERE",
    "path": "Download",
}


async def main():
    async with AsyncUserDB("douyin_users.db") as audb:
        sec_user_id = "MS4wLjABAAAANXSltcLCzDGmdNFI2Q_QixVTr67NiYzjKOIP5s03CAE"
        print(
            await DouyinHandler(kwargs).get_or_add_user_data(
                kwargs=kwargs, sec_user_id=sec_user_id, db=audb
            )
        )


if __name__ == "__main__":
    asyncio.run(main())

提示

此为cli模式的接口,开发者可自行定义创建用户目录的功能。

创建作品下载记录 🟢

异步方法,用于获取或创建作品数据同时创建作品目录。

参数类型说明
aweme_datadict作品数据字典
dbAsyncVideoDB作品数据库
ignore_fieldslist忽略的字段列表
返回类型说明
py
import asyncio
from f2.apps.douyin.handler import DouyinHandler
from f2.apps.douyin.db import AsyncVideoDB

# 需要忽略的字段(需过滤掉有时效性的字段)
ignore_fields = ["video_play_addr", "images", "video_bit_rate", "cover"]

kwargs = {
    "headers": {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36 Edg/126.0.0.0",
        "Referer": "https://www.douyin.com/",
    },
    "proxies": {"http://": None, "https://": None},
    "cookie": "YOUR_COOKIE_HERE",
}


async def main():
    aweme_data = await DouyinHandler(kwargs).fetch_one_video(
        aweme_id="7294994585925848359"
    )
    async with AsyncVideoDB("douyin_videos.db") as avdb:
        await DouyinHandler(kwargs).get_or_add_video_data(
            aweme_data._to_dict(), avdb, ignore_fields
        )


if __name__ == "__main__":
    asyncio.run(main())

获取用户信息 🟢

异步方法,用于获取指定用户的信息。

参数类型说明
sec_user_idstr用户ID
返回类型说明
UserProfileFiltermodel用户数据过滤器,包含用户数据的_to_raw、_to_dict方法
py
import asyncio
from f2.apps.douyin.handler import DouyinHandler

kwargs = {
    "headers": {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36 Edg/126.0.0.0",
        "Referer": "https://www.douyin.com/",
    },
    "proxies": {"http://": None, "https://": None},
    "cookie": "YOUR_COOKIE_HERE",
}


async def main():
    sec_user_id = "MS4wLjABAAAANXSltcLCzDGmdNFI2Q_QixVTr67NiYzjKOIP5s03CAE"
    user = await DouyinHandler(kwargs).fetch_user_profile(sec_user_id=sec_user_id)
    print("=================_to_raw================")
    print(user._to_raw())
    # print("=================_to_dict===============")
    # print(user._to_dict())


if __name__ == "__main__":
    asyncio.run(main())

单个作品数据 🟢

异步方法,用于获取单个视频。

参数类型说明
aweme_idstr视频ID
返回类型说明
PostDetailFiltermodel单个作品数据过滤器,包含作品数据的_to_raw、_to_dict、_to_list方法
py
import asyncio
from f2.apps.douyin.handler import DouyinHandler

kwargs = {
    "headers": {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36 Edg/126.0.0.0",
        "Referer": "https://www.douyin.com/",
    },
    "cookie": "YOUR_COOKIE_HERE",
    "proxies": {"http://": None, "https://": None},
}


async def main():
    video = await DouyinHandler(kwargs).fetch_one_video(aweme_id="7294994585925848359")
    print("=================_to_raw================")
    print(video._to_raw())
    # print("=================_to_dict================")
    # print(video._to_dict())


if __name__ == "__main__":
    asyncio.run(main())

用户发布作品数据 🟢

异步方法,用于获取用户发布的视频列表。

参数类型说明
sec_user_idstr用户ID
max_cursorint页码,初始为0
page_countsint页数,初始为20
max_countsint最大页数,初始为None
返回类型说明
UserPostFilterAsyncGenerator发布作品数据过滤器,包含作品数据的_to_raw、_to_dict、_to_list方法
py
import asyncio
from f2.apps.douyin.handler import DouyinHandler

kwargs = {
    "headers": {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36 Edg/126.0.0.0",
        "Referer": "https://www.douyin.com/",
    },
    "proxies": {"http://": None, "https://": None},
    "timeout": 10,
    "cookie": "YOUR_COOKIE_HERE",
}


async def main():
    sec_user_id = "MS4wLjABAAAANXSltcLCzDGmdNFI2Q_QixVTr67NiYzjKOIP5s03CAE"

    async for aweme_data_list in DouyinHandler(kwargs).fetch_user_post_videos(
        sec_user_id, 0, 10, 20
    ):
        print("=================_to_raw================")
        print(aweme_data_list._to_raw())
        # print("=================_to_dict===============")
        # print(aweme_data_list._to_dict())
        # print("=================_to_list===============")
        # print(aweme_data_list._to_list())


if __name__ == "__main__":
    asyncio.run(main())

用户喜欢作品数据 🟢

异步方法,用于获取指定用户喜欢的视频列表,需开放喜欢列表。

参数类型说明
sec_user_idstr用户ID
max_cursorint页码,初始为0
page_countsint页数,初始为20
max_countsint最大页数,初始为None
返回类型说明
UserPostFilterAsyncGenerator喜欢作品数据过滤器,包含作品数据的_to_raw、_to_dict、_to_list方法
py
import asyncio
from f2.apps.douyin.handler import DouyinHandler

kwargs = {
    "headers": {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36 Edg/126.0.0.0",
        "Referer": "https://www.douyin.com/",
    },
    "cookie": "YOUR_COOKIE_HERE",
    "timeout": 10,
    "proxies": {"http://": None, "https://": None},
}


async def main():
    sec_user_id = "MS4wLjABAAAAW9FWcqS7RdQAWPd2AA5fL_ilmqsIFUCQ_Iym6Yh9_cUa6ZRqVLjVQSUjlHrfXY1Y"  # 开放喜欢列表的sec_user_id
    # sec_user_id = "MS4wLjABAAAAkA9Zsx7wNHUWse8xwUt9zzlAUfZ-7ZOBMbPzKhkDYEjUd-f4qS_DM6fNyxP_-9l2"  # 未开放喜欢列表的sec_user_id
    async for aweme_data_list in DouyinHandler(kwargs).fetch_user_like_videos(
        sec_user_id, 0, 10, 20
    ):
        print("=================_to_raw================")
        print(aweme_data_list._to_raw())
        # print("=================_to_dict===============")
        # print(aweme_data_list._to_dict())
        # print("=================_to_list===============")
        # print(aweme_data_list._to_list())


if __name__ == "__main__":
    asyncio.run(main())

用户收藏原声数据 🟢

异步方法,用于获取指定用户收藏的音乐列表,只能获取登录了账号的收藏音乐。

参数类型说明
max_cursorint页码,初始为0
page_countsint页数,初始为20
max_countsint最大页数,初始为None
返回类型说明
UserMusicCollectionFilterAsyncGenerator收藏音乐数据过滤器,包含音乐数据的_to_raw、_to_dict、_to_list方法
py
import asyncio
from f2.apps.douyin.handler import DouyinHandler


kwargs = {
    "headers": {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36 Edg/126.0.0.0",
        "Referer": "https://www.douyin.com/",
    },
    "cookie": "YOUR_COOKIE_HERE",
    "proxies": {"http://": None, "https://": None},
    "timeout": 10,
}


async def main():
    async for music_data_list in DouyinHandler(kwargs).fetch_user_music_collection():
        print("=================_to_raw================")
        print(music_data_list._to_raw())
        # print("=================_to_dict===============")
        # print(music_data_list._to_dict())
        # print("=================_to_list===============")
        # print(music_data_list._to_list())


if __name__ == "__main__":
    asyncio.run(main())

用户收藏作品数据 🟢

异步方法,用于获取指定用户收藏的视频列表,只能爬登录了账号的收藏作品。

参数类型说明
max_cursorint页码,初始为0
page_countsint页数,初始为20
max_countsint最大页数,初始为None
返回类型说明
UserCollectionFilterAsyncGenerator收藏作品数据过滤器,包含作品数据的_to_raw、_to_dict、_to_list方法
py
import asyncio
from f2.apps.douyin.handler import DouyinHandler


kwargs = {
    "headers": {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36 Edg/126.0.0.0",
        "Referer": "https://www.douyin.com/",
    },
    "cookie": "YOUR_COOKIE_HERE",
    "proxies": {"http://": None, "https://": None},
    "timeout": 10,
}


async def main():
    async for music_data_list in DouyinHandler(kwargs).fetch_user_music_collection():
        print("=================_to_raw================")
        print(music_data_list._to_raw())
        # print("=================_to_dict===============")
        # print(music_data_list._to_dict())
        # print("=================_to_list===============")
        # print(music_data_list._to_list())


if __name__ == "__main__":
    asyncio.run(main())

用户收藏夹数据 🟢

异步方法,用于获取指定用户的收藏夹列表,不是收藏夹作品数据。

参数类型说明
max_cursorint页码,初始为0
page_countsint页数,初始为20
max_countsint最大页数,初始为None
返回类型说明
UserCollectsFilterAsyncGenerator收藏夹数据过滤器,包含收藏夹数据的_to_raw、_to_dict、_to_list方法
py
import asyncio
from f2.apps.douyin.handler import DouyinHandler


kwargs = {
    "headers": {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36 Edg/126.0.0.0",
        "Referer": "https://www.douyin.com/",
    },
    "proxies": {"http://": None, "https://": None},
    "timeout": 10,
    "cookie": "YOUR_COOKIE_HERE",
}


async def main():
    async for collects in DouyinHandler(kwargs).fetch_user_collects(0, 10, 20):
        print("=================_to_raw================")
        print(collects._to_raw())
        # print("=================_to_dict===============")
        # print(collects._to_dict())


if __name__ == "__main__":
    asyncio.run(main())

用户收藏夹作品数据 🟢

异步方法,用于获取指定用户收藏夹的视频列表,收藏夹作品数据。

参数类型说明
collect_idstr收藏夹ID
max_cursorint页码,初始为0
page_countsint页数,初始为20
max_countsint最大页数,初始为None
返回类型说明
UserCollectsVideosFilterAsyncGenerator收藏夹作品数据过滤器,包含收藏夹作品数据的_to_raw、_to_dict、_to_list方法
py
import asyncio
from f2.apps.douyin.handler import DouyinHandler


kwargs = {
    "headers": {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36 Edg/126.0.0.0",
        "Referer": "https://www.douyin.com/",
    },
    "proxies": {"http://": None, "https://": None},
    "timeout": 10,
    "cookie": "YOUR_COOKIE_HERE",
}


async def main():
    collects_id = ""  # 收藏夹ID
    async for aweme_data_list in DouyinHandler(kwargs).fetch_user_collects_videos(
        collects_id, 0, 10, 20
    ):
        print("=================_to_raw================")
        print(aweme_data_list._to_raw())
        # print("=================_to_dict===============")
        # print(aweme_data_list._to_dict())
        # print("=================_to_list===============")
        # print(aweme_data_list._to_list())


if __name__ == "__main__":
    asyncio.run(main())

用户合集作品数据 🟢

异步方法,用于获取指定用户合集的视频列表,合集视频的mix_id是一致的,从单个作品数据接口中获取即可。

参数类型说明
mix_idstr合集ID
max_cursorint页码,初始为0
page_countsint页数,初始为20
max_countsint最大页数,初始为None
返回类型说明
UserMixFilterAsyncGenerator合集作品数据过滤器,包含合集作品数据的_to_raw、_to_dict、_to_list方法
py
import asyncio
from f2.apps.douyin.handler import DouyinHandler

kwargs = {
    "headers": {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36 Edg/126.0.0.0",
        "Referer": "https://www.douyin.com/",
    },
    "proxies": {"http://": None, "https://": None},
    "timeout": 10,
    "cookie": "YOUR_COOKIE_HERE",
}


async def main():
    mix_id = await DouyinHandler(kwargs).fetch_one_video(aweme_id="7294914031133969705")
    # mix_id 为PostDetailFilter对象

    async for aweme_data_list in DouyinHandler(kwargs).fetch_user_mix_videos(
        mix_id.mix_id, 0, 10, 20
    ):
        print("=================_to_raw================")
        print(aweme_data_list._to_raw())
        # print("=================_to_dict===============")
        # print(aweme_data_list._to_dict())
        # print("=================_to_list===============")
        # print(aweme_data_list._to_list())


if __name__ == "__main__":
    asyncio.run(main())

用户直播流数据 🟢

异步方法,用于获取指定用户的直播。

参数类型说明
webcast_idstr直播间RID
返回类型说明
webcast_datadict直播数据字典,包含直播ID、直播标题、直播状态、观看人数、子分区、主播昵称等
py
import asyncio
from f2.apps.douyin.handler import DouyinHandler

kwargs = {
    "headers": {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36 Edg/126.0.0.0",
        "Referer": "https://www.douyin.com/",
    },
    "proxies": {"http://": None, "https://": None},
    "cookie": "YOUR_COOKIE_HERE",
}


async def main():
    live = await DouyinHandler(kwargs).fetch_user_live_videos(webcast_id="775841227732")
    print("=================_to_raw================")
    print(live._to_raw())
    # print("=================_to_dict===============")
    # print(live._to_dict())


if __name__ == "__main__":
    asyncio.run(main())

用户直播流数据2 🟢

异步方法,用于获取指定用户的直播,webcast_id与room_id为2个独立参数,由不同接口解析。

参数类型说明
room_idstr直播间ID
返回类型说明
webcast_datadict直播数据字典,包含直播ID、直播标题、直播状态、观看人数、子分区、主播昵称等
py
import asyncio
from f2.apps.douyin.handler import DouyinHandler

kwargs = {
    "headers": {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36 Edg/126.0.0.0",
        "Referer": "https://www.douyin.com/",
    },
    "proxies": {"http://": None, "https://": None},
    "cookie": "YOUR_COOKIE_HERE",
}


async def main():
    live = await DouyinHandler(kwargs).fetch_user_live_videos_by_room_id(
        room_id="7318296342189919011"
    )
    print("=================_to_raw================")
    print(live._to_raw())
    # print("=================_to_dict===============")
    # print(live._to_dict())


if __name__ == "__main__":
    asyncio.run(main())

用户首页推荐作品数据 🟢

异步方法,用于获取指定用户的首页推荐作品。

参数类型说明
sec_user_idstr用户ID
max_cursorint页码,初始为0
page_countsint页数,初始为20
max_countsint最大页数,初始为None
返回类型说明
UserPostFilterAsyncGenerator首页推荐作品数据过滤器,包含推荐作品数据的_to_raw、_to_dict、_to_list方法
py
import asyncio
from f2.apps.douyin.handler import DouyinHandler


kwargs = {
    "headers": {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36 Edg/126.0.0.0",
        "Referer": "https://www.douyin.com/",
    },
    "proxies": {"http://": None, "https://": None},
    "timeout": 10,
    "cookie": "YOUR_COOKIE_HERE",
}


async def main():
    sec_user_id = ""  # 用户ID
    async for feeds in DouyinHandler(kwargs).fetch_user_feed_videos(
        sec_user_id, 0, 10, 20
    ):
        print("=================_to_raw================")
        print(feeds._to_raw())
        # print("=================_to_dict===============")
        # print(feeds._to_dict())
        # print("=================_to_list===============")
        # print(feeds._to_list())


if __name__ == "__main__":
    asyncio.run(main())

相似作品数据 🟢

异步方法,用于获取指定作品的相似作品。

参数类型说明
aweme_idstr作品ID
filterGidsstr过滤的Gids
page_countsint页数,初始为20
max_countsint最大页数,初始为None
返回类型说明
PostRelatedFilterdict相关推荐作品数据过滤器,包含相关作品数据的_to_raw、_to_dict、_to_list方法
py
import asyncio
from f2.apps.douyin.handler import DouyinHandler


kwargs = {
    "headers": {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36 Edg/126.0.0.0",
        "Referer": "https://www.douyin.com/",
    },
    "cookie": "YOUR_COOKIE_HERE",
    "proxies": {"http://": None, "https://": None},
}


async def main():
    video = await DouyinHandler(kwargs).fetch_related_videos(
        aweme_id="7294994585925848359"
    )
    print("=================_to_raw================")
    print(video._to_raw())
    # print("=================_to_dict================")
    # print(video._to_dict())
    # print("=================_to_list================")
    # print(video._to_list())


if __name__ == "__main__":
    asyncio.run(main())

好友作品数据 🟢

异步方法,用于获取好友的作品。

参数类型说明
cursorstr页码,初始为0
levelint作品级别,初始为1
pull_typeint拉取类型,初始为0
max_countsint最大页数,初始为None
返回类型说明
FriendFeedFilterAsyncGenerator好友作品数据过滤器,包含好友作品数据的_to_raw、_to_dict、_to_list方法
py
import asyncio
from f2.apps.douyin.handler import DouyinHandler


kwargs = {
    "headers": {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36 Edg/126.0.0.0",
        "Referer": "https://www.douyin.com/",
    },
    "proxies": {"http://": None, "https://": None},
    "cookie": "YOUR_COOKIE_HERE",
}


async def main():
    friend_video_list = await DouyinHandler(kwargs).fetch_friend_feed_videos()
    print("=================_to_raw================")
    print(friend_video_list._to_raw())
    # print("=================_to_dict===============")
    # print(friend_video_list._to_dict())
    # print("=================_to_list===============")
    # print(friend_video_list._to_list())


if __name__ == "__main__":
    asyncio.run(main())

关注用户数据 🟢

异步方法,用于获取指定用户关注的用户列表。

参数类型说明
user_idstr用户ID
sec_user_idstr用户ID
offsetint页码,初始为0
countint页数,初始为20
source_typeint源类型,初始为4
min_timeint最早关注时间戳,初始为0
max_timeint最晚关注时间戳,初始为0
max_countsfloat最大页数,初始为None
返回类型说明
UserFollowingFilterAsyncGenerator关注用户数据过滤器,包含关注用户数据的_to_raw、_to_dict、_to_list方法
py
import asyncio
from f2.log.logger import logger
from f2.apps.douyin.handler import DouyinHandler


kwargs = {
    "headers": {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36 Edg/126.0.0.0",
        "Referer": "https://www.douyin.com/",
    },
    "proxies": {"http://": None, "https://": None},
    "timeout": 10,
    "cookie": "YOUR_COOKIE_HERE",
}


async def main():
    user_id = ""  # 公开关注的账号
    sec_user_id = ""  # 公开关注的账号
    # sec_user_id = "MS4wLjABAAAAGPm-wPeGQuziCu5z6KerQA7WmSTnS99c8lU8WLToB0BsN02mqbPxPuxwDjKf7udZ"  # 隐私设置的账号

    # 至少提供 user_id 或 sec_user_id 中的一个参数
    # 根据 max_time 和 min_time 区间获取关注用户列表
    async for following in DouyinHandler(kwargs).fetch_user_following(
        user_id=user_id,
        sec_user_id=sec_user_id,
        # max_time=1668606509,
        # min_time=0,
    ):
        if following.status_code != 0:
            logger.error_("错误代码:{0} 错误消息:{1}").format(
                following.status_code, following.status_msg
            )
        else:
            logger.info(
                "用户ID:{0} 用户昵称:{1} 用户作品数:{2} 额外内容:{3}".format(
                    following.sec_uid,
                    following.nickname,
                    following.aweme_count,
                    following.secondary_text,
                )
            )

        # print("=================_to_raw================")
        # print(following._to_raw())
        # print("=================_to_dict===============")
        # print(following._to_dict())
        # print("=================_to_list===============")
        # 数据量多的情况下_to_list这种数据结构比较慢
        # print(following._to_list())


if __name__ == "__main__":
    asyncio.run(main())

粉丝用户数据 🟢

异步方法,用于获取指定用户的粉丝列表。

参数类型说明
user_idstr用户ID
sec_user_idstr用户ID
offsetint页码,初始为0
countint页数,初始为20
source_typeint源类型,初始为1
min_timeint最早关注时间戳,初始为0
max_timeint最晚关注时间戳,初始为0
max_countsfloat最大页数,初始为None
返回类型说明
UserFollowerFilterAsyncGenerator粉丝用户数据过滤器,包含粉丝用户数据的_to_raw、_to_dict、_to_list方法
py
import asyncio
from f2.log.logger import logger
from f2.apps.douyin.handler import DouyinHandler


kwargs = {
    "headers": {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36 Edg/126.0.0.0",
        "Referer": "https://www.douyin.com/",
    },
    "proxies": {"http://": None, "https://": None},
    "timeout": 10,
    "cookie": "YOUR_COOKIE_HERE",
}


async def main():
    user_id = ""  # 公开粉丝的账号
    sec_user_id = ""  # 公开粉丝的账号
    # sec_user_id = "MS4wLjABAAAAGPm-wPeGQuziCu5z6KerQA7WmSTnS99c8lU8WLToB0BsN02mqbPxPuxwDjKf7udZ"  # 隐私设置的账号

    # 至少提供 user_id 或 sec_user_id 中的一个参数
    # 根据max_time 和 min_time 区间获取用户粉丝列表
    async for follower in DouyinHandler(kwargs).fetch_user_follower(
        user_id=user_id,
        sec_user_id=sec_user_id,
        # max_time=1668606509,
        # min_time=0,
    ):
        if follower.status_code != 0:
            logger.erro("错误代码:{0} 错误消息:{1}").format(
                follower.status_code, follower.status_msg
            )
        else:
            logger.info(
                "用户ID:{0} 用户昵称:{1} 用户作品数:{2}".format(
                    follower.sec_uid, follower.nickname, follower.aweme_count
                )
            )

        # print("=================_to_raw================")
        # print(follower._to_raw())
        # print("=================_to_dict===============")
        # print(follower._to_dict())
        # print("=================_to_list===============")
        # 数据量多的情况下_to_list这种数据结构比较慢
        # print(follower._to_list())


if __name__ == "__main__":
    asyncio.run(main())

查询用户信息 🟢

通过ttwid的参数用于查询用户基本信息,若需要获取更多信息请使用fetch_user_profile

参数类型说明
返回类型说明
QueryUserFiltermodel查询用户数据过滤器,包含用户数据的_to_raw、_to_dict方法
py
import asyncio
from f2.apps.douyin.handler import DouyinHandler
from f2.apps.douyin.utils import TokenManager


kwargs = {
    "headers": {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36 Edg/122.0.0.0",
        "Referer": "https://www.douyin.com/",
    },
    "proxies": {"http://": None, "https://": None},
    "timeout": 10,
    "cookie": f"ttwid={TokenManager.gen_ttwid()}",
}


async def main():
    user = await DouyinHandler(kwargs).fetch_query_user()
    print("=================_to_raw================")
    print(user._to_raw())
    # print("=================_to_dict===============")
    # print(user._to_dict())


if __name__ == "__main__":
    asyncio.run(main())

直播间wss负载数据 🟢

异步方法,用于获取直播间wss负载数据,是弹幕wss的必要参数。

参数类型说明
room_idstr直播间ID
unique_idstr用户ID
返回类型说明
LiveImFetchFiltermodel直播间wss负载数据过滤器,包含直播间wss负载数据的_to_raw、_to_dict方法
py
import asyncio
from f2.apps.douyin.handler import DouyinHandler


kwargs = {
    "headers": {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36 Edg/126.0.0.0",
        "Referer": "https://www.douyin.com/",
        "Content-Type": "application/protobuffer;",
    },
    "proxies": {"http://": None, "https://": None},
    "timeout": 10,
    "cookie": "YOUR_COOKIE_HERE",
}


kwargs2 = {
    "headers": {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36 Edg/126.0.0.0",
        "Upgrade": "websocket",
        "Connection": "Upgrade",
    },
    "proxies": {"http://": None, "https://": None},
    "timeout": 10,
    "cookie": "DO_NOT_USE_COOKIE_HERE",
}


async def main():
    # 获取游客ttwid的user_unique_id,你可以通过TokenManager.gen_ttwid()生成新的游客ttwid
    user = await DouyinHandler(kwargs).fetch_query_user()
    # print("游客user_unique_id:", user.user_unique_id)

    # 通过此接口获取room_id,参数为live_id
    room = await DouyinHandler(kwargs).fetch_user_live_videos("662122193366")
    # print("直播间ID:", room.room_id)

    # 通过该接口获取wss所需的cursor和internal_ext
    live_im = await DouyinHandler(kwargs).fetch_live_im(
        room_id=room.room_id, unique_id=user.user_unique_id
    )
    # print("直播间IM页码:", live_im.cursor, "直播间IM扩展:", live_im.internal_ext)

    # 获取直播弹幕
    await DouyinHandler(kwargs2).fetch_live_danmaku(
        room_id=room.room_id,
        user_unique_id=user.user_unique_id,
        internal_ext=live_im.internal_ext,
        cursor=live_im.cursor,
    )


if __name__ == "__main__":
    asyncio.run(main())

直播间wss弹幕 🟢

异步方法,用于获取直播间wss弹幕数据,使用内置多个回调处理不同类型的消息。

参数类型说明
room_idstr直播间ID
user_unique_idstr用户ID
internal_extstr内部扩展参数
cursorstr弹幕页码
callbackdict自定义弹幕回调函数(待加入)
回调说明
WebcastRoomMessage直播间房间消息
WebcastLikeMessage直播间点赞消息
WebcastMemberMessage直播间观众加入消息
WebcastChatMessage直播间聊天消息
WebcastGiftMessage直播间礼物消息
WebcastSocialMessage直播间用户关注消息
WebcastRoomUserSeqMessage直播间在线观众排行榜
WebcastUpdateFanTicketMessage直播间粉丝团更新消息
WebcastCommonTextMessage直播间文本消息
WebcastMatchAgainstScoreMessage直播间对战积分消息
WebcastFansclubMessage直播间粉丝团消息
TODO: WebcastRanklistHourEntranceMessage直播间小时榜消息
TODO: WebcastRoomStatsMessage直播间统计消息
TODO: WebcastLiveShoppingMessage直播间购物车消息
TODO: WebcastLiveEcomGeneralMessage直播间电商消息
TODO: WebcastProductChangeMessage直播间商品变更消息
TODO: WebcastRoomStreamAdaptationMessage直播间流适配消息
返回类型说明
self.websocketWebSocket弹幕WebSocket对象
py
import asyncio
from f2.apps.douyin.handler import DouyinHandler


kwargs = {
    "headers": {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36 Edg/126.0.0.0",
        "Referer": "https://www.douyin.com/",
        "Content-Type": "application/protobuffer;",
    },
    "proxies": {"http://": None, "https://": None},
    "timeout": 10,
    "cookie": "YOUR_COOKIE_HERE",
}


kwargs2 = {
    "headers": {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36 Edg/126.0.0.0",
        "Upgrade": "websocket",
        "Connection": "Upgrade",
    },
    "proxies": {"http://": None, "https://": None},
    "timeout": 10,
    "cookie": "DO_NOT_USE_COOKIE_HERE",
}


async def main():
    # 获取游客ttwid的user_unique_id,你可以通过TokenManager.gen_ttwid()生成新的游客ttwid
    user = await DouyinHandler(kwargs).fetch_query_user()
    # print("游客user_unique_id:", user.user_unique_id)

    # 通过此接口获取room_id,参数为live_id
    room = await DouyinHandler(kwargs).fetch_user_live_videos("662122193366")
    # print("直播间ID:", room.room_id)

    # 通过该接口获取wss所需的cursor和internal_ext
    live_im = await DouyinHandler(kwargs).fetch_live_im(
        room_id=room.room_id, unique_id=user.user_unique_id
    )
    # print("直播间IM页码:", live_im.cursor, "直播间IM扩展:", live_im.internal_ext)

    # 获取直播弹幕
    await DouyinHandler(kwargs2).fetch_live_danmaku(
        room_id=room.room_id,
        user_unique_id=user.user_unique_id,
        internal_ext=live_im.internal_ext,
        cursor=live_im.cursor,
    )


if __name__ == "__main__":
    asyncio.run(main())

关注用户的直播间信息 🟢

异步方法,用于获取关注用户的直播间信息列表,需要登录账号。

参数类型说明
返回类型说明
FollowingUserLiveFiltermodel关注用户直播间数据过滤器,包含关注用户直播间数据的_to_raw、_to_dict方法
py
import asyncio
from f2.apps.douyin.handler import DouyinHandler


kwargs = {
    "headers": {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36 Edg/126.0.0.0",
        "Referer": "https://www.douyin.com/",
    },
    "proxies": {"http://": None, "https://": None},
    "cookie": "YOUR_COOKIE_HERE",
}


async def main():
    follow_live = await DouyinHandler(kwargs).fetch_following_live()
    print("=================_to_raw================")
    print(follow_live._to_raw())
    # print("=================_to_dict===============")
    # print(follow_live._to_dict())
    # print("=================_to_list===============")
    # print(follow_live._to_list())


if __name__ == "__main__":
    asyncio.run(main())

SSO登录 🔴

异步方法,用于处理用户SSO登录,获取用户的cookie。

参数类型说明
返回类型说明
is_loginbool是否登录成功
login_cookiestr登录cookie
py
# import asyncio
# from f2.apps.douyin.handler import handle_sso_login

# if __name__ == "__main__":
#     asyncio.run(handle_sso_login())

警告

由于扫码登录受风控影响较大,多数cookie都无法使用。为了保障体验,建议使用--auto-cookie命令自动从浏览器获取cookie,更多使用帮助参考cli命令。

utils接口列表

管理客户端配置 🟢

类方法,用于管理客户端配置

参数类型说明
返回类型说明
配置文件值Any配置文件值
py
from f2.apps.douyin.utils import ClientConfManager

if __name__ == "__main__":
    print("Client Configuration:")
    print(ClientConfManager.client())

    print("Client Configuration version:")
    print(ClientConfManager.conf_version())

    print("Client Configuration user-agent:")
    print(ClientConfManager.user_agent())

生成真实msToken 🟢

类方法,用于生成真实的msToken,当出现错误时返回虚假的值。

参数类型说明
返回类型说明
msTokenstr真实的msToken
py
from f2.apps.douyin.utils import TokenManager

if __name__ == "__main__":
    print("douyin real msToken:", TokenManager.gen_real_msToken())

生成虚假msToken 🟢

类方法,用于生成随机虚假的msToken,不同端点的msToken长度不同。

参数类型说明
返回类型说明
msTokenstr虚假的msToken
py
from f2.apps.douyin.utils import TokenManager

if __name__ == "__main__":
    print("douyin fake msToken:", TokenManager.gen_false_msToken())

提示

默认为126位,也可调用from f2.utils.utils import gen_random_str,生成不同长度的虚假msToken。

生成ttwid 🟢

类方法,用于生成ttwid,部分请求必带,游客状态必须有。

参数类型说明
返回类型说明
ttwidstrttwid参数
py
from f2.apps.douyin.utils import TokenManager

if __name__ == "__main__":
    print("douyin ttwid:", TokenManager.gen_ttwid())

生成webid 🟢

类方法,用于生成个性化追踪webid。

参数类型说明
返回类型说明
webidstrwebid参数
py
from f2.apps.douyin.utils import TokenManager

if __name__ == "__main__":
    print("douyin webid:", TokenManager.gen_webid())

生成verify_fp 🟢

类方法,用于生成verify_fp,部分请求必带。

参数类型说明
返回类型说明
verify_fpstrverify_Fp与fp参数
py
from f2.apps.douyin.utils import VerifyFpManager

if __name__ == "__main__":
    print("verify_fp:", VerifyFpManager.gen_verify_fp())

生成s_v_web_id 🟢

类方法,用于生成s_v_web_id,部分请求必带,即verify_fp值。

参数类型说明
返回类型说明
s_v_web_idstrs_v_web_id参数
py
from f2.apps.douyin.utils import VerifyFpManager

if __name__ == "__main__":
    print("verify_fp:", VerifyFpManager.gen_s_v_web_id())

生成直播signature 🟢

用于生成直播signature,请求弹幕wss必带。

参数类型说明
room_idstr直播间ID
user_unique_idstr用户ID
返回类型说明
signaturestr直播signature
py
from f2.apps.douyin.algorithm.webcast_signature import DouyinWebcastSignature

if __name__ == "__main__":
    room_id = "7383573503129258802"
    user_unique_id = "7383588170770138661"
    signature = DouyinWebcastSignature(
        "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36 Edg/126.0.0.0"
    ).get_signature(room_id, user_unique_id)
    print(signature)

使用接口模型生成直播wss签名参数 🟢

类方法,用于使用不同接口数据模型生成直播wss签名参数。

参数类型说明
user_agentstr用户代理
base_endpointstr端点
paramsdict请求参数
返回类型说明
final_endpointstr带wss签名参数的完整地址
py
# fetch_live_danmaku

import asyncio
from f2.apps.douyin.api import DouyinAPIEndpoints as dyendpoint
from f2.apps.douyin.model import LiveWebcast
from f2.apps.douyin.utils import WebcastSignatureManager, ClientConfManager


async def main(params: LiveWebcast):
    final_endpoint = WebcastSignatureManager.model_2_endpoint(
        user_agent=ClientConfManager.user_agent(),
        base_endpoint=dyendpoint.LIVE_IM_WSS,
        params=params.model_dump(),
    )
    return final_endpoint


if __name__ == "__main__":
    print(asyncio.run(main()))

使用接口地址生成Xb参数 🟢

类方法,用于直接使用接口地址生成Xbogus参数,部分接口不校验。

参数类型说明
user_agentstr用户代理
endpointstr接口端点
返回类型说明
final_endpointstr带Xbogus参数的完整地址
py
# 使用接口地址直接生成请求链接
import asyncio
from f2.apps.douyin.utils import XBogusManager, ClientConfManager


async def main():
    test_endpoint = "aweme_id=7196239141472980280&aid=1128&version_name=23.5.0&device_platform=android&os_version=2333"
    return XBogusManager.str_2_endpoint(
        ClientConfManager.user_agent(),
        endpoint=test_endpoint,
    )


if __name__ == "__main__":
    print(asyncio.run(main()))

使用接口模型生成Xb参数 🟢

类方法,用于使用不同接口数据模型生成Xbogus参数,部分接口不校验。

参数类型说明
user_agentstr用户代理
endpointstr端点
paramsdict请求参数
返回类型说明
final_endpointstr带Xbogus参数的完整地址

使用模型生成接口地址,需要先创建一个模型对象,然后调用model_2_endpoint方法。

py
# 使用用户信息模型生成请求链接
import asyncio
from f2.apps.douyin.api import DouyinAPIEndpoints as dyendpoint
from f2.apps.douyin.model import UserProfile
from f2.apps.douyin.utils import XBogusManager, ClientConfManager


async def gen_user_profile(params: UserProfile):
    return XBogusManager.model_2_endpoint(
        ClientConfManager.user_agent(),
        base_endpoint=dyendpoint.USER_DETAIL,
        params=params.model_dump(),
    )


async def main():
    sec_user_id="MS4wLjABAAAANXSltcLCzDGmdNFI2Q_QixVTr67NiYzjKOIP5s03CAE"
    params = UserProfile(sec_user_id=sec_user_id)
    return await gen_user_profile(params)


if __name__ == "__main__":
    print(asyncio.run(main()))

还可以使用爬虫引擎与过滤器采集数据。

py
# 使用用户信息模型生成请求链接,请求接口并使用自定义过滤器输出所需接口数据
import asyncio
from f2.apps.douyin.api import DouyinAPIEndpoints as dyendpoint
from f2.apps.douyin.crawler import DouyinCrawler
from f2.apps.douyin.model import UserProfile
from f2.apps.douyin.filter import UserProfileFilter
from f2.apps.douyin.utils import XBogusManager, ClientConfManager


kwargs = {
    "headers": {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36 Edg/126.0.0.0",
        "Referer": "https://www.douyin.com/",
    },
    "proxies": {"http://": None, "https://": None},
    "cookie": "YOUR_COOKIE_HERE",
}


async def main():
    async with DouyinCrawler(kwargs) as crawler:
        sec_user_id="MS4wLjABAAAANXSltcLCzDGmdNFI2Q_QixVTr67NiYzjKOIP5s03CAE"
        params = UserProfile(sec_user_id=sec_user_id)
        response = await crawler.fetch_user_profile(params)
        user = UserProfileFilter(response)
        # return user # user为UserProfileFilter对象,需要调用_to_dict()方法转为字典格式
        return user._to_dict()

if __name__ == "__main__":
    print(asyncio.run(main()))

更加抽象的高级方法可以直接调用handler接口的fetch_user_profile

使用接口地址生成Ab参数 🟢

类方法,用于直接使用接口地址生成Ab参数,新接口都需要校验。

参数类型说明
user_agentstr用户代理
paramsstr请求参数
request_typestr请求类型
返回类型说明
final_paramsstr带Ab参数的请求参数
py
# 使用接口地址直接生成请求链接
import asyncio
from f2.apps.douyin.utils import ABogusManager, ClientConfManager


async def main():
    request = "GET"
    test_endpoint = "device_platform=webapp&aid=6383&channel=channel_pc_web&aweme_id=7380308675841297704&update_version_code=170400&pc_client_type=1&version_code=190500&version_name=19.5.0&cookie_enabled=true&screen_width=1920&screen_height=1080&browser_language=zh-CN&browser_platform=Win32&browser_name=Edge&browser_version=125.0.0.0&browser_online=true&engine_name=Blink&engine_version=125.0.0.0&os_name=Windows&os_version=10&cpu_core_num=12&device_memory=8&platform=PC&downlink=10&effective_type=4g&round_trip_time=50&webid=7376294349792396827"
    return ABogusManager.str_2_endpoint(
        ClientConfManager.user_agent(),
        endpoint=test_endpoint,
        request=request,
    )


if __name__ == "__main__":
    print(asyncio.run(main()))

使用接口模型生成Ab参数 🟢

类方法,用于使用不同接口数据模型生成Ab参数,新接口都需要校验。

参数类型说明
user_agentstr用户代理
base_endpointstr端点
paramsdict请求参数模型
request_typestr请求类型
返回类型说明
final_paramsstr带Ab参数的请求参数

使用模型生成接口地址,需要先创建一个模型对象,然后调用model_2_endpoint方法。

py
# 使用用户信息模型生成请求链接
import asyncio
from f2.apps.douyin.api import DouyinAPIEndpoints as dyendpoint
from f2.apps.douyin.model import UserProfile
from f2.apps.douyin.utils import ABogusManager, ClientConfManager


async def gen_user_profile(params: UserProfile):
    return ABogusManager.model_2_endpoint(
        ClientConfManager.user_agent(),
        base_endpoint=dyendpoint.USER_DETAIL,
        params=params.model_dump(),
        request = "GET",
    )


async def main():
    sec_user_id="MS4wLjABAAAANXSltcLCzDGmdNFI2Q_QixVTr67NiYzjKOIP5s03CAE"
    params = UserProfile(sec_user_id=sec_user_id)
    return await gen_user_profile(params)


if __name__ == "__main__":
    print(asyncio.run(main()))

还可以使用爬虫引擎与过滤器采集数据。

py
# 使用用户信息模型生成请求链接,请求接口并使用自定义过滤器输出所需接口数据
import asyncio
from f2.apps.douyin.api import DouyinAPIEndpoints as dyendpoint
from f2.apps.douyin.crawler import DouyinCrawler
from f2.apps.douyin.model import UserProfile
from f2.apps.douyin.filter import UserProfileFilter


kwargs = {
    "headers": {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36 Edg/126.0.0.0",
        "Referer": "https://www.douyin.com/",
    },
    "proxies": {"http://": None, "https://": None},
    "cookie": "YOUR_COOKIE_HERE",
}


async def main():
    async with DouyinCrawler(kwargs) as crawler:
        sec_user_id="MS4wLjABAAAANXSltcLCzDGmdNFI2Q_QixVTr67NiYzjKOIP5s03CAE"
        params = UserProfile(sec_user_id=sec_user_id)
        response = await crawler.fetch_user_profile(params)
        user = UserProfileFilter(response)
        # return user # user为UserProfileFilter对象,需要调用_to_dict()方法转为字典格式
        return user._to_dict()

if __name__ == "__main__":
    print(asyncio.run(main()))

更加抽象的高级方法可以直接调用handler接口的fetch_user_profile

提示

本项目的残血版Ab算法的UA参数为固定值,Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36 Edg/126.0.0.0

提取单个用户id 🟢

类方法,用于提取单个用户id。

参数类型说明
urlstr用户主页地址
返回类型说明
sec_user_idstr用户ID
py
import asyncio
from f2.apps.douyin.utils import SecUserIdFetcher

async def main():
    raw_url = "https://www.douyin.com/user/MS4wLjABAAAANXSltcLCzDGmdNFI2Q_QixVTr67NiYzjKOIP5s03CAE?vid=7285950278132616463"
    # 对于单个URL
    return await SecUserIdFetcher.get_sec_user_id(raw_url)

if __name__ == "__main__":
    print(asyncio.run(main()))

提取列表用户id 🟢

类方法,用于提取列表用户id。

参数类型说明
urlslist用户主页地址列表
返回类型说明
sec_user_idslist用户ID列表
py
import asyncio
from f2.apps.douyin.utils import SecUserIdFetcher
from f2.utils.utils import extract_valid_urls

async def main():
    raw_urls = [
        "https://www.douyin.com/user/MS4wLjABAAAANXSltcLCzDGmdNFI2Q_QixVTr67NiYzjKOIP5s03CAE?vid=7285950278132616463",
        "https://www.douyin.com/user/MS4wLjABAAAAVsneOf144eGDFf8Xp9QNb1VW6ovXnNT5SqJBhJfe8KQBKWKDTWK5Hh-_i9mJzb8C",
        "长按复制此条消息,打开抖音搜索,查看TA的更多作品。 https://v.douyin.com/idFqvUms/",
        "https://v.douyin.com/idFqvUms/",
    ]

    # 提取有效URL
    urls = extract_valid_urls(raw_urls)

    # 对于URL列表
    return await SecUserIdFetcher.get_all_sec_user_id(urls)

if __name__ == "__main__":
    print(asyncio.run(main()))

提取单个作品id 🟢

类方法,用于提取单个作品id。

参数类型说明
urlstr作品地址
返回类型说明
aweme_idstr作品ID
py
import asyncio
from f2.apps.douyin.utils import AwemeIdFetcher


async def main():
    raw_url = (
        "https://www.douyin.com/video/7298145681699622182?previous_page=web_code_link"
    )
    return await AwemeIdFetcher.get_aweme_id(raw_url)


if __name__ == "__main__":
    print(asyncio.run(main()))

提取列表作品id 🟢

类方法,用于提取列表作品id。

参数类型说明
urlslist作品地址列表
返回类型说明
aweme_idslist作品ID列表
py
import asyncio
from f2.apps.douyin.utils import AwemeIdFetcher
from f2.utils.utils import extract_valid_urls


async def main():
    raw_urls = [
        "0.53 02/26 I@v.sE Fus:/ 你别太帅了郑润泽# 现场版live # 音乐节 # 郑润泽  https://v.douyin.com/iRNBho6u/ 复制此链接,打开Dou音搜索,直接观看视频!",
        "https://v.douyin.com/iRNBho6u/",
        "https://www.iesdouyin.com/share/video/7298145681699622182/?region=CN&mid=7298145762238565171&u_code=l1j9bkbd&did=MS4wLjABAAAAtqpCx0hpOERbdSzQdjRZw-wFPxaqdbAzsKDmbJMUI3KWlMGQHC-n6dXAqa-dM2EP&iid=MS4wLjABAAAANwkJuWIRFOzg5uCpDRpMj4OX-QryoDgn-yYlXQnRwQQ&with_sec_did=1&titleType=title&share_sign=05kGlqGmR4_IwCX.ZGk6xuL0osNA..5ur7b0jbOx6cc-&share_version=170400&ts=1699262937&from_aid=6383&from_ssr=1&from=web_code_link",
        "https://www.douyin.com/video/7298145681699622182?previous_page=web_code_link",
        "https://www.douyin.com/video/7298145681699622182",
    ]

    # 提取有效URL
    urls = extract_valid_urls(raw_urls)

    # 对于URL列表
    return await AwemeIdFetcher.get_all_aweme_id(urls)


if __name__ == "__main__":
    print(asyncio.run(main()))

提取合集id 🟢

类方法,用于从合集链接中提取合集id。

参数类型说明
urlstr合集地址
返回类型说明
mix_idstr合集ID
py
import asyncio
from f2.apps.douyin.utils import MixIdFetcher


async def main():
    raw_url = "https://www.douyin.com/collection/7360898383181809676"
    return await MixIdFetcher.get_mix_id(raw_url)


if __name__ == "__main__":
    print(asyncio.run(main()))

提取列表合集id 🟢

类方法,用于从合集链接列表中提取合集id。

参数类型说明
urlslist合集地址列表
返回类型说明
mix_idslist合集ID列表
py
import asyncio
from f2.apps.douyin.utils import MixIdFetcher
from f2.utils.utils import extract_valid_urls


async def main():
    raw_urls = [
        "https://www.douyin.com/collection/7360898383181809676",
        "https://www.douyin.com/collection/7270895771149404160",
    ]

    # 提取有效URL
    urls = extract_valid_urls(raw_urls)

    # 对于URL列表
    return await MixIdFetcher.get_all_mix_id(urls)


if __name__ == "__main__":
    print(asyncio.run(main()))

提取单个直播间号 🟢

类方法,用于提取单个直播间号。

参数类型说明
urlstr直播间地址
返回类型说明
webcast_idstr直播间RID
py
import asyncio
from f2.apps.douyin.utils import WebCastIdFetcher


async def main():
    raw_url = "https://live.douyin.com/775841227732"
    return await WebCastIdFetcher.get_webcast_id(raw_url)


if __name__ == "__main__":
    print(asyncio.run(main()))

提取列表直播间号 🟢

类方法,用于提取列表直播间号。

参数类型说明
urlslist直播间地址列表
返回类型说明
webcast_idslist直播间RID列表
py
import asyncio
from f2.apps.douyin.utils import WebCastIdFetcher
from f2.utils.utils import extract_valid_urls


async def main():
    raw_urls = [
        "https://live.douyin.com/775841227732",
        "https://live.douyin.com/775841227732?room_id=7318296342189919011&enter_from_merge=web_share_link&enter_method=web_share_link&previous_page=app_code_link",
        'https://webcast.amemv.com/douyin/webcast/reflow/7318296342189919011?u_code=l1j9bkbd&did=MS4wLjABAAAAEs86TBQPNwAo-RGrcxWyCdwKhI66AK3Pqf3ieo6HaxI&iid=MS4wLjABAAAA0ptpM-zzoliLEeyvWOCUt-_dQza4uSjlIvbtIazXnCY&with_sec_did=1&use_link_command=1&ecom_share_track_params=&extra_params={"from_request_id":"20231230162057EC005772A8EAA0199906","im_channel_invite_id":"0"}&user_id=3644207898042206&liveId=7318296342189919011&from=share&style=share&enter_method=click_share&roomId=7318296342189919011&activity_info={}',
        "6i- Q@x.Sl 03/23 【醒子8ke的直播间】  点击打开👉https://v.douyin.com/i8tBR7hX/  或长按复制此条消息,打开抖音,看TA直播",
        "https://v.douyin.com/i8tBR7hX/",
    ]

    # 提取有效URL
    urls = extract_valid_urls(raw_urls)

    # 对于URL列表
    return await WebCastIdFetcher.get_all_webcast_id(urls)


if __name__ == "__main__":
    print(asyncio.run(main()))

如何分辨r_id与room_id

r_id是直播间的短链标识,room_id是直播间的唯一标识。 如https://live.douyin.com/775841227732中的775841227732就是r_id,而https://webcast.amemv.com/douyin/webcast/reflow/7318296342189919011中的7318296342189919011就是room_id。 这2个链接都指向同一个直播间。

注意

短链无法使用该接口返回Rid,如raw_urls中的第3和第4条链接只会返回room_id。需要搭配使用fetch_user_live_videos_by_room_id接口获取数据。

全局格式化文件名 🟢

根据配置文件的全局格式化文件名。

格式化文件名规则
  • windows 文件名长度限制为 255 个字符, 开启了长文件名支持后为 32,767 个字符。
  • Unix 文件名长度限制为 255 个字符。
  • 取去除后的20个字符, 加上后缀, 一般不会超过255个字符。
参数类型说明
naming_templatestr文件的命名模板
aweme_datadict作品数据的字典
custom_fieldsdict用户自定义字段, 用于替代默认的字段值
返回类型说明
file_namestr格式化后的文件名
py
import asyncio
from f2.apps.douyin.handler import DouyinHandler
from f2.apps.douyin.utils import format_file_name


async def main():
    # 文件名模板
    kwargs = {
        "headers": {
            "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36 Edg/126.0.0.0",
            "Referer": "https://www.douyin.com/",
        },
        "naming": "{create}_{desc}_{aweme_id}",
        "cookie": "YOUR_COOKIE_HERE",
    }
    # 单作品的数据
    aweme_data = await DouyinHandler(kwargs).fetch_one_video("7218193198328433954")
    # 格式化后的文件名
    print(format_file_name(kwargs.get("naming"), aweme_data._to_dict()) + "_video")

    # 文件名模板
    kwargs = {
        "headers": {
            "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36 Edg/126.0.0.0",
            "Referer": "https://www.douyin.com/",
        },
        "proxies": {"http://": None, "https://": None},
        "naming": "{create}_{desc}_{aweme_id}_{location}",
        "cookie": "",
    }
    # 用户自定义字段
    custom_fields = {"location": "New York"}
    # 格式化后的自定义文件名
    print(
        format_file_name(kwargs.get("naming"), aweme_data._to_dict(), custom_fields)
        + "_video"
    )
    # 格式化后的自定义文件名,长度限制在100
    print(
        format_file_name(
            kwargs.get("naming"), aweme_data._to_dict(), custom_fields, 100
        )
        + "_video"
    )


if __name__ == "__main__":
    asyncio.run(main())

创建用户目录 🟢

用于创建用户目录,如果目录已存在则不创建。

用户目录结构

如果未在配置文件中指定路径,则默认为 Download。支持绝对与相对路径。

bash
├── Download
   ├── douyin
   ├── post
   ├── user_nickname
   ├── 2023-12-31_23-59-59_desc
   ├── 2023-12-31_23-59-59_desc-video.mp4
   ├── 2023-12-31_23-59-59_desc-desc.txt
   └── 2023-12-31_23-59-59_desc-coder.jpg
   └── ......
   ├── like
   ├── ...
参数类型说明
kwargsdictcli配置文件
nicknameUnion[str, int]用户昵称
返回类型说明
user_pathPath用户目录路径对象
py
from f2.apps.douyin.utils import create_user_folder


kwargs = {
    "headers": {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36 Edg/126.0.0.0",
        "Referer": "https://www.douyin.com/",
    },
    "proxies": {"http": None, "https": None},
    "cookie": "YOUR_COOKIE_HERE",
    "path": "Download",
    "mode": "post",
}


if __name__ == "__main__":
    current_nickname = "New Nickname"
    print(create_user_folder(kwargs, current_nickname))
    # X:\......\Download\douyin\post\New Nickname

重命名用户目录 🟢

用于重命名用户目录。

参数类型说明
old_pathPath旧的用户目录路径对象
new_nicknamestr新的用户昵称
返回类型说明
new_pathPath新的用户目录路径对象
py
import asyncio
from f2.apps.douyin.db import AsyncUserDB
from f2.apps.douyin.utils import rename_user_folder
from f2.apps.douyin.handler import DouyinHandler


kwargs = {
    "headers": {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36 Edg/126.0.0.0",
        "Referer": "https://www.douyin.com/",
    },
    "proxies": {"http://": None, "https://": None},
    "cookie": "YOUR_COOKIE_HERE",
    "path": "Download",
    "mode": "post",
}


async def main():
    sec_user_id = "MS4wLjABAAAANXSltcLCzDGmdNFI2Q_QixVTr67NiYzjKOIP5s03CAE"

    async with AsyncUserDB("douyin_users.db") as audb:
        local_user_path = await DouyinHandler(kwargs).get_or_add_user_data(
            kwargs, sec_user_id, audb
        )
    print(local_user_path)
    # X:\......\Download\douyin\post\songzhen

    current_nickname = "New Nickname"
    new_user_path = rename_user_folder(local_user_path, current_nickname)
    print(new_user_path)
    # X:\......\Download\douyin\post\New Nickname

if __name__ == "__main__":
    asyncio.run(main())

提示

如果目录不存在会先创建该用户目录再重命名。

创建或重命名用户目录 🟢

用于创建或重命名用户目录。为上面2个接口的组合。

参数类型说明
kwargsdictcli配置文件
local_user_datadict本地用户数据
current_nicknamestr当前用户昵称
返回类型说明
user_pathPath用户目录路径对象

提示

该接口很好的解决了用户改名之后重复重新下载的问题。集合在handler接口的get_or_add_user_data中,开发者无需关心直接调用handler的数据接口即可。

显示二维码 🟢

用于将url地址显示为二维码。

参数类型说明
qrcode_urlstr二维码地址
show_imagebool是否显示二维码图片
返回类型说明
py
from f2.apps.douyin.utils import show_qrcode

if __name__ == "__main__":
    show_qrcode("https://baidu.com/")
    show_qrcode("https://baidu.com/", True)

提示

show_image (bool): 是否显示图像,True 表示显示,False 表示在控制台显示

json歌词转lrc歌词 🟢

用于将抖音原声的json格式的歌词转换为lrc格式的歌词。

参数类型说明
dataUnion[str, list, dict]json格式的歌词
返回类型说明
lrc_linesstrlrc格式的歌词
py
from f2.apps.douyin.utils import json_2_lrc


data = [
    {"text": "CB on the beat,ho", "timeId": "5.700"},
    {"text": "Wasted CTA lovees wasted", "timeId": "10.210"},
    {"text": "Wasted I'm on these drugsI feel wasted", "timeId": "12.760"},
    {"text": "Wasted get her off my mind when I'm wasted", "timeId": "15.350"},
    {"text": "Wasted I'm waste all my time when I'm wasted", "timeId": "17.740"},
    {"text": "Wasted CTA lovees wasted", "timeId": "20.790"},
    {"text": "Wasted I'm on these drugsI feel wasted", "timeId": "22.900"},
    {"text": "Wasted get her off my mind when I'm wasted", "timeId": "25.850"},
    {"text": "Wasted I'm waste all my time when I'm wasted", "timeId": "28.210"},
    {"text": "Wasted", "timeId": "30.830"},
    {"text": "Damn why is she so demonic", "timeId": "31.320"},
    {"text": "She medusa with a little pocahontas", "timeId": "33.510"},
    {"text": "She been lacin all my drugs or sosomethin", "timeId": "36.150"},
    {
        "text": "Cause every time that we're together I'm unconscious",
        "timeId": "38.560",
    },
    {"text": "Hold upuhlet me be honest", "timeId": "41.100"},
    {"text": "I know l saw her put the percs in my chronic", "timeId": "43.760"},
    {"text": "Smokintil my eyes roll back like the omen", "timeId": "46.370"},
    {"text": "Just another funeral for hergod damn", "timeId": "48.370"},
    {"text": "Wasted CTA lovees wasted", "timeId": "61.320"},
    {"text": "Wasted I'm on these drugsI feel wasted", "timeId": "63.890"},
    {"text": "Wasted get her off my mind when I'm wasted", "timeId": "66.400"},
    {"text": "Wasted I'm waste all my time when I'm wasted", "timeId": "68.970"},
    {"text": "Wasted", "timeId": "71.160"},
    {"text": "She do cocaine in my basement", "timeId": "72.170"},
    {"text": "I'm a doctorsbut I'm runninout of patience", "timeId": "74.270"},
    {"text": "She told me that she tryna get closer to satan", "timeId": "76.760"},
    {"text": "She be talkin to him when she in the matrix", "timeId": "79.450"},
    {
        "text": "Rockstarthat's our stylethere boys can't take it",
        "timeId": "81.770",
    },
    {"text": "Hatin but they're still tryna take our cadence", "timeId": "83.930"},
    {"text": "No basicbrand new rari when I'm racin", "timeId": "86.870"},
    {
        "text": "Take itlet you roll my weedplease don't lace ityeah",
        "timeId": "89.340",
    },
    {"text": "That's a bum that you chasinayy", "timeId": "92.330"},
    {"text": "Foreign with meshe a dominatrix", "timeId": "95.220"},
    {"text": "I love that girls and I do like her body", "timeId": "97.270"},
    {"text": "I don't what the moneyI just want the molly", "timeId": "98.820"},
    {
        "text": "That's what she say when she livesd in the valley",
        "timeId": "100.160",
    },
    {"text": "Lil boyI'm your fatherhakuna matata", "timeId": "101.380"},
    {"text": "I made that girl girls all of that top up", "timeId": "102.220"},
    {
        "text": "Got dreadrs in my headused to pray for the lock up",
        "timeId": "103.360",
    },
    {
        "text": "I htit from the back and my legs start to lock up",
        "timeId": "104.850",
    },
    {"text": "Jacuzzi thar bootyI gave that girl flakka", "timeId": "106.540"},
    {"text": "I'm talkinblue caps that keep tweakinmy chakra", "timeId": "107.520"},
    {"text": "Rose on my chainthere's no hint like no copper", "timeId": "108.860"},
    {"text": "Take in the middle my head like I'm avatar", "timeId": "110.190"},
    {"text": "That's the reason that I ride on my appas", "timeId": "111.510"},
    {"text": "Wasted", "timeId": "112.710"},
    {"text": "WastedGTA lovees wasted", "timeId": "122.290"},
    {"text": "WastedI'm on these drugsI feel wasted", "timeId": "124.800"},
    {"text": "Wastedget her off my mind when I'm wasted", "timeId": "127.380"},
    {"text": "WastedI waste all my time when I'm wasted", "timeId": "130.120"},
    {"text": "My eyes closedhopinthis ain't makebelieve", "timeId": "132.850"},
    {
        "text": "And she don't know hate all her demons like in me",
        "timeId": "135.150",
    },
    {"text": "L don't know l don't know", "timeId": "137.730"},
    {"text": "Don't know what she been onI don't know", "timeId": "143.870"},
    {"text": "All that lean l ain't have to let her in", "timeId": "146.470"},
    {
        "text": "She ain't take my heart,but she took my medicine",
        "timeId": "148.580",
    },
    {"text": "Least somebody gon'take lthate to waste it", "timeId": "151.330"},
    {"text": "WastedGTA lovees wasted", "timeId": "152.980"},
    {"text": "WastedI'm on these drugsI feel wasted", "timeId": "155.610"},
    {"text": "Wastedget her off my mind when I'm wasted", "timeId": "158.070"},
    {"text": "WastedI waste all my time when I'm wasted", "timeId": "160.820"},
]


if __name__ == "__main__":
    print(json_2_lrc(data))

crawler接口

用户信息接口地址 🟢

异步方法,用于获取用户信息数据。

参数类型说明
paramsUserProfile请求参数
返回类型说明
parse_json()dict用户信息数据

主页作品接口地址 🟢

异步方法,用于获取主页作品数据。

参数类型说明
paramsUserPost请求参数
返回类型说明
parse_json()dict主页作品数据

喜欢作品接口地址 🟢

异步方法,用于获取喜欢作品数据。

参数类型说明
paramsUserLike请求参数
返回类型说明
parse_json()dict喜欢作品数据

收藏作品接口地址 🟢

异步方法,用于获取收藏作品数据。

参数类型说明
paramsUserCollection请求参数
返回类型说明
parse_json()dict收藏作品数据

收藏夹接口地址 🟢

异步方法,用于获取收藏夹数据。

参数类型说明
paramsUserCollects请求参数
返回类型说明
parse_json()dict收藏夹数据

收藏夹作品接口地址 🟢

异步方法,用于获取收藏夹作品数据。

参数类型说明
paramsUserCollectsVideo请求参数
返回类型说明
parse_json()dict收藏夹作品数据

音乐收藏接口地址 🟢

异步方法,用于获取音乐收藏数据。

参数类型说明
paramsUserMusicCollection请求参数
返回类型说明
parse_json()dict音乐收藏数据

dl接口

保存最后一次请求的aweme_id 🟢

用于保存最后一次请求的aweme_id,用于下一次请求主页作品的参数。

参数类型说明
sec_user_idstr用户ID
aweme_idstr作品ID
返回类型说明

筛选指定日期区间内的作品 🟢

用于筛选指定日期区间内的作品。

参数类型说明
aweme_datadict作品数据的字典
intervalstr日期区间
返回类型说明
filtered_aweme_datasUnion[list[dict], dict, None]筛选后的作品数据

创建下载任务 🟢

处理下载任务 🟢

创建原声下载任务 🟢

处理原声下载任务 🟢

创建流下载任务 🟢

处理流下载任务 🟢

Released under the Apache-2.0 license.