接口列表
注意
🟢代表已经实现,🟡代表正在实现或修改,🟤代表暂时不实现,🔵代表未来可能实现,🔴代表将会弃用。
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 | 🟢 |
用户直播流数据2 | fetch_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 | 🟢 | |
生成真实msToken | TokenManager | gen_real_msToken | 🟢 |
生成虚假msToken | TokenManager | gen_false_msToken | 🟢 |
生成ttwid | TokenManager | gen_ttwid | 🟢 |
生成webid | TokenManager | gen_webid | 🟢 |
生成verify_fp | VerifyFpManager | gen_verify_fp | 🟢 |
生成s_v_web_id | VerifyFpManager | gen_s_v_web_id | 🟢 |
生成直播signature | DouyinWebcastSignature | get_signature | 🟢 |
使用接口模型生成直播wss签名参数 | WebcastSignatureManager | model_2_endpoint | 🟢 |
使用接口地址生成Xb参数 | XBogusManager | str_2_endpoint | 🟢 |
使用接口模型生成Xb参数 | XBogusManager | model_2_endpoint | 🟢 |
使用接口地址生成Ab参数 | ABogusManager | str_2_endpoint | 🟢 |
使用接口模型生成Ab参数 | ABogusManager | model_2_endpoint | 🟢 |
提取单个用户id | SecUserIdFetcher | get_sec_user_id | 🟢 |
提取列表用户id | SecUserIdFetcher | get_all_sec_user_id | 🟢 |
提取单个作品id | AwemeIdFetcher | get_aweme_id | 🟢 |
提取列表作品id | AwemeIdFetcher | get_all_aweme_id | 🟢 |
提取单个合集id | MixIdFetcher | get_mix_id | 🟢 |
提取列表合集id | MixIdFetcher | get_all_mix_id | 🟢 |
提取单个直播间号 | WebCastIdFetcher | get_webcast_id | 🟢 |
提取列表直播间号 | WebCastIdFetcher | get_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接口 | 类名 | 方法 | 状态 |
---|---|---|---|
用户信息接口地址 | DouyinCrawler | fetch_user_profile | 🟢 |
主页作品接口地址 | DouyinCrawler | fetch_user_post | 🟢 |
喜欢作品接口地址 | DouyinCrawler | fetch_user_like | 🟢 |
收藏作品接口地址 | DouyinCrawler | fetch_user_collection | 🟢 |
收藏夹接口地址 | DouyinCrawler | fetch_user_collects | 🟢 |
收藏夹作品接口地址 | DouyinCrawler | fetch_user_collects_video | 🟢 |
音乐收藏接口地址 | DouyinCrawler | fetch_user_music_collection | 🟢 |
合集作品接口地址 | DouyinCrawler | fetch_user_mix | 🟢 |
作品详情接口地址 | DouyinCrawler | fetch_post_detail | 🟢 |
作品评论接口地址 | DouyinCrawler | fetch_post_comment | 🟢 |
推荐作品接口地址 | DouyinCrawler | fetch_post_feed | 🟢 |
关注作品接口地址 | DouyinCrawler | fetch_follow_feed | 🟢 |
朋友作品接口地址 | DouyinCrawler | fetch_friend_feed | 🟢 |
相关推荐作品接口地址 | DouyinCrawler | fetch_post_related | 🟢 |
直播接口地址 | DouyinCrawler | fetch_live | 🟢 |
直播接口地址(room_id) | DouyinCrawler | fetch_live_room_id | 🟢 |
关注用户直播接口地址 | DouyinCrawler | fetch_following_live | 🟢 |
定位上一次作品接口地址 | DouyinCrawler | fetch_locate_post | 🟢 |
SSO获取二维码接口地址 | DouyinCrawler | fetch_login_qrcode | 🔴 |
SSO检查扫码状态接口地址 | DouyinCrawler | fetch_check_qrcode | 🔴 |
SSO检查登录状态接口地址 | DouyinCrawler | fetch_check_login | 🔴 |
用户关注列表接口地址 | DouyinCrawler | fetch_user_following | 🟢 |
用户粉丝列表接口地址 | DouyinCrawler | fetch_user_follower | 🟢 |
直播弹幕初始化接口地址 | DouyinCrawler | fetch_live_im_fetch | 🟢 |
查询用户接口地址 | DouyinCrawler | fetch_query_user | 🟢 |
直播弹幕接口地址 | DouyinWebSocketCrawler | fetch_live_danmaku | 🟢 |
处理 WebSocket 消息 | DouyinWebSocketCrawler | handle_wss_message | 🟢 |
发送 ack 包 | DouyinWebSocketCrawler | send_ack | 🟢 |
发送 ping 包 | DouyinWebSocketCrawler | send_ping | 🟢 |
直播间房间消息 | DouyinWebSocketCrawler | WebcastRoomMessage | 🟢 |
直播间点赞消息 | DouyinWebSocketCrawler | WebcastLikeMessage | 🟢 |
直播间观众加入消息 | DouyinWebSocketCrawler | WebcastMemberMessage | 🟢 |
直播间聊天消息 | DouyinWebSocketCrawler | WebcastLeaveMessage | 🟢 |
直播间礼物消息 | DouyinWebSocketCrawler | WebcastGiftMessage | 🟢 |
直播间用户关注消息 | DouyinWebSocketCrawler | WebcastSocialMessage | 🟢 |
直播间用户关注消息 | DouyinWebSocketCrawler | WebcastFollowMessage | 🟢 |
直播间在线观众排行榜 | DouyinWebSocketCrawler | WebcastRoomUserSeqMessage | 🟢 |
直播间粉丝团更新消息 | DouyinWebSocketCrawler | WebcastUpdateFanTicketMessage | 🟢 |
直播间文本消息 | DouyinWebSocketCrawler | WebcastCommonTextMessage | 🟢 |
直播间对战积分消息 | DouyinWebSocketCrawler | WebcastMatchAgainstScoreMessage | 🟢 |
直播间粉丝团消息 | DouyinWebSocketCrawler | WebcastFansclubMessage | 🟢 |
dl接口列表
下载器接口 | 类名 | 方法 | 状态 |
---|---|---|---|
保存最后一次请求的aweme_id | DouyinDownloader | save_last_aweme_id | 🟢 |
筛选指定日期区间内的作品 | DouyinDownloader | filter_aweme_datas_by_interval | 🟢 |
创建下载任务 | DouyinDownloader | create_download_task | 🟢 |
处理下载任务 | DouyinDownloader | handler_download | 🟢 |
创建原声下载任务 | DouyinDownloader | create_music_download_tasks | 🟢 |
处理原声下载任务 | DouyinDownloader | handler_music_download | 🟢 |
创建流下载任务 | DouyinDownloader | create_stream_tasks | 🟢 |
处理流下载任务 | DouyinDownloader | handle_stream | 🟢 |
handler接口列表
创建用户记录与目录 🟢
异步方法,用于获取或创建用户数据同时创建用户目录。
参数 | 类型 | 说明 |
---|---|---|
kwargs | dict | cli字典数据,需获取path参数 |
sec_user_id | str | 用户ID |
db | AsyncUserDB | 用户数据库 |
返回 | 类型 | 说明 |
---|---|---|
user_path | Path | 用户目录路径对象 |
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_data | dict | 作品数据字典 |
db | AsyncVideoDB | 作品数据库 |
ignore_fields | list | 忽略的字段列表 |
返回 | 类型 | 说明 |
---|---|---|
无 | 无 | 无 |
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_id | str | 用户ID |
返回 | 类型 | 说明 |
---|---|---|
UserProfileFilter | model | 用户数据过滤器,包含用户数据的_to_raw、_to_dict方法 |
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_id | str | 视频ID |
返回 | 类型 | 说明 |
---|---|---|
PostDetailFilter | model | 单个作品数据过滤器,包含作品数据的_to_raw、_to_dict、_to_list方法 |
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_id | str | 用户ID |
max_cursor | int | 页码,初始为0 |
page_counts | int | 页数,初始为20 |
max_counts | int | 最大页数,初始为None |
返回 | 类型 | 说明 |
---|---|---|
UserPostFilter | AsyncGenerator | 发布作品数据过滤器,包含作品数据的_to_raw、_to_dict、_to_list方法 |
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_id | str | 用户ID |
max_cursor | int | 页码,初始为0 |
page_counts | int | 页数,初始为20 |
max_counts | int | 最大页数,初始为None |
返回 | 类型 | 说明 |
---|---|---|
UserPostFilter | AsyncGenerator | 喜欢作品数据过滤器,包含作品数据的_to_raw、_to_dict、_to_list方法 |
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_cursor | int | 页码,初始为0 |
page_counts | int | 页数,初始为20 |
max_counts | int | 最大页数,初始为None |
返回 | 类型 | 说明 |
---|---|---|
UserMusicCollectionFilter | AsyncGenerator | 收藏音乐数据过滤器,包含音乐数据的_to_raw、_to_dict、_to_list方法 |
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_cursor | int | 页码,初始为0 |
page_counts | int | 页数,初始为20 |
max_counts | int | 最大页数,初始为None |
返回 | 类型 | 说明 |
---|---|---|
UserCollectionFilter | AsyncGenerator | 收藏作品数据过滤器,包含作品数据的_to_raw、_to_dict、_to_list方法 |
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_cursor | int | 页码,初始为0 |
page_counts | int | 页数,初始为20 |
max_counts | int | 最大页数,初始为None |
返回 | 类型 | 说明 |
---|---|---|
UserCollectsFilter | AsyncGenerator | 收藏夹数据过滤器,包含收藏夹数据的_to_raw、_to_dict、_to_list方法 |
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_id | str | 收藏夹ID |
max_cursor | int | 页码,初始为0 |
page_counts | int | 页数,初始为20 |
max_counts | int | 最大页数,初始为None |
返回 | 类型 | 说明 |
---|---|---|
UserCollectsVideosFilter | AsyncGenerator | 收藏夹作品数据过滤器,包含收藏夹作品数据的_to_raw、_to_dict、_to_list方法 |
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_id | str | 合集ID |
max_cursor | int | 页码,初始为0 |
page_counts | int | 页数,初始为20 |
max_counts | int | 最大页数,初始为None |
返回 | 类型 | 说明 |
---|---|---|
UserMixFilter | AsyncGenerator | 合集作品数据过滤器,包含合集作品数据的_to_raw、_to_dict、_to_list方法 |
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_id | str | 直播间RID |
返回 | 类型 | 说明 |
---|---|---|
webcast_data | dict | 直播数据字典,包含直播ID、直播标题、直播状态、观看人数、子分区、主播昵称等 |
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_id | str | 直播间ID |
返回 | 类型 | 说明 |
---|---|---|
webcast_data | dict | 直播数据字典,包含直播ID、直播标题、直播状态、观看人数、子分区、主播昵称等 |
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_id | str | 用户ID |
max_cursor | int | 页码,初始为0 |
page_counts | int | 页数,初始为20 |
max_counts | int | 最大页数,初始为None |
返回 | 类型 | 说明 |
---|---|---|
UserPostFilter | AsyncGenerator | 首页推荐作品数据过滤器,包含推荐作品数据的_to_raw、_to_dict、_to_list方法 |
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_id | str | 作品ID |
filterGids | str | 过滤的Gids |
page_counts | int | 页数,初始为20 |
max_counts | int | 最大页数,初始为None |
返回 | 类型 | 说明 |
---|---|---|
PostRelatedFilter | dict | 相关推荐作品数据过滤器,包含相关作品数据的_to_raw、_to_dict、_to_list方法 |
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())
好友作品数据 🟢
异步方法,用于获取好友的作品。
参数 | 类型 | 说明 |
---|---|---|
cursor | str | 页码,初始为0 |
level | int | 作品级别,初始为1 |
pull_type | int | 拉取类型,初始为0 |
max_counts | int | 最大页数,初始为None |
返回 | 类型 | 说明 |
---|---|---|
FriendFeedFilter | AsyncGenerator | 好友作品数据过滤器,包含好友作品数据的_to_raw、_to_dict、_to_list方法 |
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_id | str | 用户ID |
sec_user_id | str | 用户ID |
offset | int | 页码,初始为0 |
count | int | 页数,初始为20 |
source_type | int | 源类型,初始为4 |
min_time | int | 最早关注时间戳,初始为0 |
max_time | int | 最晚关注时间戳,初始为0 |
max_counts | float | 最大页数,初始为None |
返回 | 类型 | 说明 |
---|---|---|
UserFollowingFilter | AsyncGenerator | 关注用户数据过滤器,包含关注用户数据的_to_raw、_to_dict、_to_list方法 |
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_id | str | 用户ID |
sec_user_id | str | 用户ID |
offset | int | 页码,初始为0 |
count | int | 页数,初始为20 |
source_type | int | 源类型,初始为1 |
min_time | int | 最早关注时间戳,初始为0 |
max_time | int | 最晚关注时间戳,初始为0 |
max_counts | float | 最大页数,初始为None |
返回 | 类型 | 说明 |
---|---|---|
UserFollowerFilter | AsyncGenerator | 粉丝用户数据过滤器,包含粉丝用户数据的_to_raw、_to_dict、_to_list方法 |
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
。
参数 | 类型 | 说明 |
---|---|---|
无 | 无 | 无 |
返回 | 类型 | 说明 |
---|---|---|
QueryUserFilter | model | 查询用户数据过滤器,包含用户数据的_to_raw、_to_dict方法 |
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_id | str | 直播间ID |
unique_id | str | 用户ID |
返回 | 类型 | 说明 |
---|---|---|
LiveImFetchFilter | model | 直播间wss负载数据过滤器,包含直播间wss负载数据的_to_raw、_to_dict方法 |
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_id | str | 直播间ID |
user_unique_id | str | 用户ID |
internal_ext | str | 内部扩展参数 |
cursor | str | 弹幕页码 |
callback | dict | 自定义弹幕回调函数(待加入) |
回调 | 说明 |
---|---|
WebcastRoomMessage | 直播间房间消息 |
WebcastLikeMessage | 直播间点赞消息 |
WebcastMemberMessage | 直播间观众加入消息 |
WebcastChatMessage | 直播间聊天消息 |
WebcastGiftMessage | 直播间礼物消息 |
WebcastSocialMessage | 直播间用户关注消息 |
WebcastRoomUserSeqMessage | 直播间在线观众排行榜 |
WebcastUpdateFanTicketMessage | 直播间粉丝团更新消息 |
WebcastCommonTextMessage | 直播间文本消息 |
WebcastMatchAgainstScoreMessage | 直播间对战积分消息 |
WebcastFansclubMessage | 直播间粉丝团消息 |
TODO: WebcastRanklistHourEntranceMessage | 直播间小时榜消息 |
TODO: WebcastRoomStatsMessage | 直播间统计消息 |
TODO: WebcastLiveShoppingMessage | 直播间购物车消息 |
TODO: WebcastLiveEcomGeneralMessage | 直播间电商消息 |
TODO: WebcastProductChangeMessage | 直播间商品变更消息 |
TODO: WebcastRoomStreamAdaptationMessage | 直播间流适配消息 |
返回 | 类型 | 说明 |
---|---|---|
self.websocket | WebSocket | 弹幕WebSocket对象 |
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())
关注用户的直播间信息 🟢
异步方法,用于获取关注用户的直播间信息列表,需要登录账号。
参数 | 类型 | 说明 |
---|---|---|
无 | 无 | 无 |
返回 | 类型 | 说明 |
---|---|---|
FollowingUserLiveFilter | model | 关注用户直播间数据过滤器,包含关注用户直播间数据的_to_raw、_to_dict方法 |
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_login | bool | 是否登录成功 |
login_cookie | str | 登录cookie |
# 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 | 配置文件值 |
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,当出现错误时返回虚假的值。
参数 | 类型 | 说明 |
---|---|---|
无 | 无 | 无 |
返回 | 类型 | 说明 |
---|---|---|
msToken | str | 真实的msToken |
from f2.apps.douyin.utils import TokenManager
if __name__ == "__main__":
print("douyin real msToken:", TokenManager.gen_real_msToken())
生成虚假msToken 🟢
类方法,用于生成随机虚假的msToken,不同端点的msToken长度不同。
参数 | 类型 | 说明 |
---|---|---|
无 | 无 | 无 |
返回 | 类型 | 说明 |
---|---|---|
msToken | str | 虚假的msToken |
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,部分请求必带,游客状态必须有。
参数 | 类型 | 说明 |
---|---|---|
无 | 无 | 无 |
返回 | 类型 | 说明 |
---|---|---|
ttwid | str | ttwid参数 |
from f2.apps.douyin.utils import TokenManager
if __name__ == "__main__":
print("douyin ttwid:", TokenManager.gen_ttwid())
生成webid 🟢
类方法,用于生成个性化追踪webid。
参数 | 类型 | 说明 |
---|---|---|
无 | 无 | 无 |
返回 | 类型 | 说明 |
---|---|---|
webid | str | webid参数 |
from f2.apps.douyin.utils import TokenManager
if __name__ == "__main__":
print("douyin webid:", TokenManager.gen_webid())
生成verify_fp 🟢
类方法,用于生成verify_fp,部分请求必带。
参数 | 类型 | 说明 |
---|---|---|
无 | 无 | 无 |
返回 | 类型 | 说明 |
---|---|---|
verify_fp | str | verify_Fp与fp参数 |
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_id | str | s_v_web_id参数 |
from f2.apps.douyin.utils import VerifyFpManager
if __name__ == "__main__":
print("verify_fp:", VerifyFpManager.gen_s_v_web_id())
生成直播signature 🟢
用于生成直播signature,请求弹幕wss必带。
参数 | 类型 | 说明 |
---|---|---|
room_id | str | 直播间ID |
user_unique_id | str | 用户ID |
返回 | 类型 | 说明 |
---|---|---|
signature | str | 直播signature |
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_agent | str | 用户代理 |
base_endpoint | str | 端点 |
params | dict | 请求参数 |
返回 | 类型 | 说明 |
---|---|---|
final_endpoint | str | 带wss签名参数的完整地址 |
# 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_agent | str | 用户代理 |
endpoint | str | 接口端点 |
返回 | 类型 | 说明 |
---|---|---|
final_endpoint | str | 带Xbogus参数的完整地址 |
# 使用接口地址直接生成请求链接
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_agent | str | 用户代理 |
endpoint | str | 端点 |
params | dict | 请求参数 |
返回 | 类型 | 说明 |
---|---|---|
final_endpoint | str | 带Xbogus参数的完整地址 |
使用模型生成接口地址,需要先创建一个模型对象,然后调用model_2_endpoint
方法。
# 使用用户信息模型生成请求链接
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()))
还可以使用爬虫引擎与过滤器采集数据。
# 使用用户信息模型生成请求链接,请求接口并使用自定义过滤器输出所需接口数据
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_agent | str | 用户代理 |
params | str | 请求参数 |
request_type | str | 请求类型 |
返回 | 类型 | 说明 |
---|---|---|
final_params | str | 带Ab参数的请求参数 |
# 使用接口地址直接生成请求链接
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_agent | str | 用户代理 |
base_endpoint | str | 端点 |
params | dict | 请求参数模型 |
request_type | str | 请求类型 |
返回 | 类型 | 说明 |
---|---|---|
final_params | str | 带Ab参数的请求参数 |
使用模型生成接口地址,需要先创建一个模型对象,然后调用model_2_endpoint
方法。
# 使用用户信息模型生成请求链接
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()))
还可以使用爬虫引擎与过滤器采集数据。
# 使用用户信息模型生成请求链接,请求接口并使用自定义过滤器输出所需接口数据
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。
参数 | 类型 | 说明 |
---|---|---|
url | str | 用户主页地址 |
返回 | 类型 | 说明 |
---|---|---|
sec_user_id | str | 用户ID |
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。
参数 | 类型 | 说明 |
---|---|---|
urls | list | 用户主页地址列表 |
返回 | 类型 | 说明 |
---|---|---|
sec_user_ids | list | 用户ID列表 |
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。
参数 | 类型 | 说明 |
---|---|---|
url | str | 作品地址 |
返回 | 类型 | 说明 |
---|---|---|
aweme_id | str | 作品ID |
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。
参数 | 类型 | 说明 |
---|---|---|
urls | list | 作品地址列表 |
返回 | 类型 | 说明 |
---|---|---|
aweme_ids | list | 作品ID列表 |
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。
参数 | 类型 | 说明 |
---|---|---|
url | str | 合集地址 |
返回 | 类型 | 说明 |
---|---|---|
mix_id | str | 合集ID |
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。
参数 | 类型 | 说明 |
---|---|---|
urls | list | 合集地址列表 |
返回 | 类型 | 说明 |
---|---|---|
mix_ids | list | 合集ID列表 |
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()))
提取单个直播间号 🟢
类方法,用于提取单个直播间号。
参数 | 类型 | 说明 |
---|---|---|
url | str | 直播间地址 |
返回 | 类型 | 说明 |
---|---|---|
webcast_id | str | 直播间RID |
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()))
提取列表直播间号 🟢
类方法,用于提取列表直播间号。
参数 | 类型 | 说明 |
---|---|---|
urls | list | 直播间地址列表 |
返回 | 类型 | 说明 |
---|---|---|
webcast_ids | list | 直播间RID列表 |
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_template | str | 文件的命名模板 |
aweme_data | dict | 作品数据的字典 |
custom_fields | dict | 用户自定义字段, 用于替代默认的字段值 |
返回 | 类型 | 说明 |
---|---|---|
file_name | str | 格式化后的文件名 |
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
。支持绝对与相对路径。
├── 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
│ │ ├── ...
参数 | 类型 | 说明 |
---|---|---|
kwargs | dict | cli配置文件 |
nickname | Union[str, int] | 用户昵称 |
返回 | 类型 | 说明 |
---|---|---|
user_path | Path | 用户目录路径对象 |
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_path | Path | 旧的用户目录路径对象 |
new_nickname | str | 新的用户昵称 |
返回 | 类型 | 说明 |
---|---|---|
new_path | Path | 新的用户目录路径对象 |
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个接口的组合。
参数 | 类型 | 说明 |
---|---|---|
kwargs | dict | cli配置文件 |
local_user_data | dict | 本地用户数据 |
current_nickname | str | 当前用户昵称 |
返回 | 类型 | 说明 |
---|---|---|
user_path | Path | 用户目录路径对象 |
提示
该接口很好的解决了用户改名之后重复重新下载的问题。集合在handler接口的get_or_add_user_data
中,开发者无需关心直接调用handler的数据接口即可。
显示二维码 🟢
用于将url地址显示为二维码。
参数 | 类型 | 说明 |
---|---|---|
qrcode_url | str | 二维码地址 |
show_image | bool | 是否显示二维码图片 |
返回 | 类型 | 说明 |
---|---|---|
无 | 无 | 无 |
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格式的歌词。
参数 | 类型 | 说明 |
---|---|---|
data | Union[str, list, dict] | json格式的歌词 |
返回 | 类型 | 说明 |
---|---|---|
lrc_lines | str | lrc格式的歌词 |
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接口
用户信息接口地址 🟢
异步方法,用于获取用户信息数据。
参数 | 类型 | 说明 |
---|---|---|
params | UserProfile | 请求参数 |
返回 | 类型 | 说明 |
---|---|---|
parse_json() | dict | 用户信息数据 |
主页作品接口地址 🟢
异步方法,用于获取主页作品数据。
参数 | 类型 | 说明 |
---|---|---|
params | UserPost | 请求参数 |
返回 | 类型 | 说明 |
---|---|---|
parse_json() | dict | 主页作品数据 |
喜欢作品接口地址 🟢
异步方法,用于获取喜欢作品数据。
参数 | 类型 | 说明 |
---|---|---|
params | UserLike | 请求参数 |
返回 | 类型 | 说明 |
---|---|---|
parse_json() | dict | 喜欢作品数据 |
收藏作品接口地址 🟢
异步方法,用于获取收藏作品数据。
参数 | 类型 | 说明 |
---|---|---|
params | UserCollection | 请求参数 |
返回 | 类型 | 说明 |
---|---|---|
parse_json() | dict | 收藏作品数据 |
收藏夹接口地址 🟢
异步方法,用于获取收藏夹数据。
参数 | 类型 | 说明 |
---|---|---|
params | UserCollects | 请求参数 |
返回 | 类型 | 说明 |
---|---|---|
parse_json() | dict | 收藏夹数据 |
收藏夹作品接口地址 🟢
异步方法,用于获取收藏夹作品数据。
参数 | 类型 | 说明 |
---|---|---|
params | UserCollectsVideo | 请求参数 |
返回 | 类型 | 说明 |
---|---|---|
parse_json() | dict | 收藏夹作品数据 |
音乐收藏接口地址 🟢
异步方法,用于获取音乐收藏数据。
参数 | 类型 | 说明 |
---|---|---|
params | UserMusicCollection | 请求参数 |
返回 | 类型 | 说明 |
---|---|---|
parse_json() | dict | 音乐收藏数据 |
dl接口
保存最后一次请求的aweme_id 🟢
用于保存最后一次请求的aweme_id,用于下一次请求主页作品的参数。
参数 | 类型 | 说明 |
---|---|---|
sec_user_id | str | 用户ID |
aweme_id | str | 作品ID |
返回 | 类型 | 说明 |
---|---|---|
无 | 无 | 无 |
筛选指定日期区间内的作品 🟢
用于筛选指定日期区间内的作品。
参数 | 类型 | 说明 |
---|---|---|
aweme_data | dict | 作品数据的字典 |
interval | str | 日期区间 |
返回 | 类型 | 说明 |
---|---|---|
filtered_aweme_datas | Union[list[dict], dict, None] | 筛选后的作品数据 |