接口列表
注意
🟢代表已经实现,🟡代表正在实现或修改,🟤代表暂时不实现,🔵代表未来可能实现,🔴代表将会弃用。
handler接口列表
CLI接口 | 方法 |
---|---|
下载单个作品 | handle_one_video |
下载用户发布作品 | handle_user_post |
下载用户喜欢作品 | handle_user_like |
下载用户收藏作品 | handle_user_collection |
下载用户合辑作品 | handle_user_mix |
下载用户直播流 | handle_user_live |
下载用户首页推荐作品 | handle_user_feed |
数据与功能接口 | 方法 | 开发者接口 |
---|---|---|
单个作品数据 | fetch_one_video | 🟢 |
用户发布作品数据 | fetch_user_post_videos | 🟢 |
用户喜欢作品数据 | fetch_user_like_videos | 🟢 |
用户收藏作品数据 | fetch_user_collection_videos | 🟢 |
用户合辑作品数据 | fetch_user_mix_videos | 🟢 |
用户直播流数据 | fetch_user_live_videos | 🟢 |
用户直播流数据2 | fetch_user_live_videos_by_room_id | 🟢 |
用户首页推荐作品数据 | fetch_user_feed_videos | 🟢 |
...... | ...... | 🔵 |
用户信息 | handler_user_profile | 🟢 |
获取指定用户名 | get_user_nickname | 🔴 |
创建用户记录与目录 | get_or_add_user_data | 🟡 |
创建作品下载记录 | get_or_add_video_data | 🟢 |
SSO登录 | handle_sso_login | 🟢 |
utils接口列表
开发者接口 | 类名 | 方法 | 状态 |
---|---|---|---|
生成真实msToken | TokenManager | gen_real_msToken | 🟢 |
生成虚假msToken | TokenManager | gen_false_msToken | 🟢 |
生成ttwid | TokenManager | gen_ttwid | 🟢 |
生成verify_fp | VerifyFpManager | gen_verify_fp | 🟢 |
生成s_v_web_id | VerifyFpManager | gen_s_v_web_id | 🟢 |
使用接口地址生成Xb参数 | XBogusManager | str_2_endpoint | 🟢 |
使用接口模型生成Xb参数 | XBogusManager | 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 | - | 🟤 |
提取单个直播间号 | WebCastIdFetcher | get_webcast_id | 🟢 |
提取列表直播间号 | WebCastIdFetcher | get_all_webcast_id | 🟢 |
获取请求count数列表 | - | get_request_sizes | 🔴 |
全局格式化文件名 | - | format_file_name | 🟢 |
创建用户目录 | - | create_user_folder | 🟢 |
重命名用户目录 | - | rename_user_folder | 🟢 |
创建或重命名用户目录 | - | create_or_rename_user_folder | 🟢 |
提取低版本接口的desc | - | extract_desc_from_share_desc | 🔴 |
显示二维码 | - | show_qrcode | 🟢 |
注意
合辑id其实就是作品id,使用AwemeIdFetcher
即可。
cralwer接口列表
爬虫url接口 | 类名 | 方法 | 状态 |
---|---|---|---|
用户信息接口地址 | DouyinCrawler | fetch_user_profile | 🟢 |
主页作品接口地址 | DouyinCrawler | fetch_user_post | 🟢 |
喜欢作品接口地址 | DouyinCrawler | fetch_user_like | 🟢 |
收藏作品接口地址 | DouyinCrawler | fetch_user_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_follow_live | 🟡 |
定位上一次作品接口地址 | DouyinCrawler | fetch_locate_post | 🟡 |
SSO获取二维码接口地址 | DouyinCrawler | fetch_login_qrcode | 🟢 |
SSO检查扫码状态接口地址 | DouyinCrawler | fetch_check_qrcode | 🟢 |
SSO检查登录状态接口地址 | DouyinCrawler | fetch_check_login | 🟡 |
dl接口列表
下载器接口 | 类名 | 方法 | 状态 |
---|---|---|---|
保存最后一次请求的aweme_id | DouyinDownloader | save_last_aweme_id | 🟢 |
创建下载任务 | DouyinDownloader | create_download_task | 🟢 |
处理下载任务 | DouyinDownloader | handle_download | 🟢 |
创建流下载任务 | DouyinDownloader | create_stream_tasks | 🟢 |
处理流下载任务 | DouyinDownloader | handle_stream | 🟢 |
handler接口列表
单个作品数据 🟢
异步方法,用于获取单个视频。
参数 | 类型 | 说明 |
---|---|---|
aweme_id | str | 视频ID |
返回 | 类型 | 说明 |
---|---|---|
video_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/104.0.0.0 Safari/537.36",
"Referer": "https://www.douyin.com/",
},
"proxies": {"http": None, "https": None},
"cookie": "YOUR_COOKIE_HERE",
}
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 |
返回 | 类型 | 说明 |
---|---|---|
video_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/104.0.0.0 Safari/537.36",
"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 |
返回 | 类型 | 说明 |
---|---|---|
aweme_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/104.0.0.0 Safari/537.36",
"Referer": "https://www.douyin.com/",
},
"proxies": {"http": None, "https": None},
"cookie": "YOUR_COOKIE_HERE",
"timeout": 10,
}
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 |
返回 | 类型 | 说明 |
---|---|---|
aweme_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/104.0.0.0 Safari/537.36",
"Referer": "https://www.douyin.com/",
},
"proxies": {"http": None, "https": None},
"cookie": "YOUR_COOKIE_HERE",
"timeout": 10,
}
async def main():
async for aweme_data_list in DouyinHandler(kwargs).fetch_user_collection_videos():
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 |
返回 | 类型 | 说明 |
---|---|---|
aweme_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/104.0.0.0 Safari/537.36",
"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/104.0.0.0 Safari/537.36",
"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/104.0.0.0 Safari/537.36",
"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())
用户信息 🟢
异步方法,用于获取指定用户的信息,不可以直接解析Filter的数据,需要使用自定义的_to_dict()或_to_list()方法。
参数 | 类型 | 说明 |
---|---|---|
sec_user_id | str | 用户ID |
返回 | 类型 | 说明 |
---|---|---|
UserProfileFilter | _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/104.0.0.0 Safari/537.36",
"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).handler_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())
获取指定用户名 🔴
异步方法,用于获取指定用户的昵称,如果不存在,则从服务器获取并存储到数据库中。
参数 | 类型 | 说明 |
---|---|---|
sec_user_id | str | 用户ID |
db | AsyncUserDB | 用户数据库 |
返回 | 类型 | 说明 |
---|---|---|
user_nickname | str | 用户昵称 |
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/104.0.0.0 Safari/537.36",
"Referer": "https://www.douyin.com/",
},
"proxies": {"http": None, "https": None},
"cookie": "YOUR_COOKIE_HERE",
}
async def main():
async with AsyncUserDB("douyin_users.db") as audb:
sec_user_id = "MS4wLjABAAAANXSltcLCzDGmdNFI2Q_QixVTr67NiYzjKOIP5s03CAE"
print(
await DouyinHandler(kwargs).get_user_nickname(
sec_user_id=sec_user_id, db=audb
)
)
if __name__ == "__main__":
asyncio.run(main())
创建用户记录与目录 🟡
异步方法,用于获取或创建用户数据同时创建用户目录。
参数 | 类型 | 说明 |
---|---|---|
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/104.0.0.0 Safari/537.36",
"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 | 忽略的字段列表 |
返回 | 类型 | 说明 |
---|---|---|
None | None | 无 |
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/104.0.0.0 Safari/537.36",
"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())
SSO登录 🟢
异步方法,用于处理用户SSO登录,获取用户的cookie。
参数 | 类型 | 说明 |
---|---|---|
None | None | 无 |
返回 | 类型 | 说明 |
---|---|---|
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接口列表
生成真实msToken 🟢
静态方法,用于生成真实的msToken,当出现错误时返回虚假的值。
参数 | 类型 | 说明 |
---|---|---|
None | None | 无 |
返回 | 类型 | 说明 |
---|---|---|
msToken | str | 真实的msToken |
from f2.apps.douyin.utils import TokenManager
if __name__ == "__main__":
print("douyin real msToken:", TokenManager.gen_real_msToken())
生成虚假msToken 🟢
静态方法,用于生成随机虚假的msToken,不同端点的msToken长度不同。
参数 | 类型 | 说明 |
---|---|---|
None | None | 无 |
返回 | 类型 | 说明 |
---|---|---|
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,部分请求必带。
参数 | 类型 | 说明 |
---|---|---|
None | None | 无 |
返回 | 类型 | 说明 |
---|---|---|
ttwid | str | ttwid参数 |
from f2.apps.douyin.utils import TokenManager
if __name__ == "__main__":
print("douyin ttwid:", TokenManager.gen_ttwid())
生成verify_fp 🟢
静态方法,用于生成verify_fp,部分请求必带。
参数 | 类型 | 说明 |
---|---|---|
None | None | 无 |
返回 | 类型 | 说明 |
---|---|---|
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值。
参数 | 类型 | 说明 |
---|---|---|
None | None | 无 |
返回 | 类型 | 说明 |
---|---|---|
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())
使用接口地址生成Xb参数 🟢
静态方法,用于直接使用接口地址生成Xbogus参数,部分接口不校验。
参数 | 类型 | 说明 |
---|---|---|
endpoint | str | 接口端点 |
返回 | 类型 | 说明 |
---|---|---|
final_endpoint | str | 带Xbogus参数的完整地址 |
# 使用接口地址直接生成请求链接
import asyncio
from f2.apps.douyin.utils import XBogusManager
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(test_endpoint)
if __name__ == "__main__":
print(asyncio.run(main()))
使用接口模型生成Xb参数 🟢
静态方法,用于使用不同接口数据模型生成Xbogus参数,部分接口不校验。
参数 | 类型 | 说明 |
---|---|---|
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
async def gen_user_profile(params: UserProfile):
return XBogusManager.model_2_endpoint(
dyendpoint.USER_DETAIL, params.dict()
)
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
kwargs = {
"headers": {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/104.0.0.0 Safari/537.36",
"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接口的handler_user_profile
。
提示
本项目中的UA参数为固定值,Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/104.0.0.0 Safari/537.36
。
提取单个用户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,合辑id其实就是作品id,使用AwemeIdFetcher
即可。
提取单个直播间号 🟢
静态方法,用于提取单个直播间号。
参数 | 类型 | 说明 |
---|---|---|
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()))
如何分辨Rid与room_id
Rid是直播间的短链标识,room_id是直播间的唯一标识。 如https://live.douyin.com/775841227732
中的775841227732就是Rid,而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/104.0.0.0 Safari/537.36",
"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/104.0.0.0 Safari/537.36",
"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/104.0.0.0 Safari/537.36",
"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/104.0.0.0 Safari/537.36",
"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 | 用户目录路径对象 |
提示
该接口很好的解决了用户改名之后重复重新下载的问题。集合在hanlder接口的get_or_add_user_data
中,开发者无需关心直接调用hanlder的数据接口即可。
显示二维码 🟢
用于将url地址显示为二维码。
参数 | 类型 | 说明 |
---|---|---|
qrcode_url | str | 二维码地址 |
show_image | bool | 是否显示二维码图片 |
返回 | 类型 | 说明 |
---|---|---|
None | None | 无 |
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 表示在控制台显示