Skip to content

接口列表

注意

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

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🟢
用户直播流数据2fetch_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接口列表
开发者接口类名方法状态
生成真实msTokenTokenManagergen_real_msToken🟢
生成虚假msTokenTokenManagergen_false_msToken🟢
生成ttwidTokenManagergen_ttwid🟢
生成verify_fpVerifyFpManagergen_verify_fp🟢
生成s_v_web_idVerifyFpManagergen_s_v_web_id🟢
使用接口地址生成Xb参数XBogusManagerstr_2_endpoint🟢
使用接口模型生成Xb参数XBogusManagermodel_2_endpoint🟢
提取单个用户idSecUserIdFetcherget_sec_user_id🟢
提取列表用户idSecUserIdFetcherget_all_sec_user_id🟢
提取单个作品idAwemeIdFetcherget_aweme_id🟢
提取列表作品idAwemeIdFetcherget_all_aweme_id🟢
提取合辑idMixIdFetcher-🟤
提取单个直播间号WebCastIdFetcherget_webcast_id🟢
提取列表直播间号WebCastIdFetcherget_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接口类名方法状态
用户信息接口地址DouyinCrawlerfetch_user_profile🟢
主页作品接口地址DouyinCrawlerfetch_user_post🟢
喜欢作品接口地址DouyinCrawlerfetch_user_like🟢
收藏作品接口地址DouyinCrawlerfetch_user_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_follow_live🟡
定位上一次作品接口地址DouyinCrawlerfetch_locate_post🟡
SSO获取二维码接口地址DouyinCrawlerfetch_login_qrcode🟢
SSO检查扫码状态接口地址DouyinCrawlerfetch_check_qrcode🟢
SSO检查登录状态接口地址DouyinCrawlerfetch_check_login🟡
dl接口列表
下载器接口类名方法状态
保存最后一次请求的aweme_idDouyinDownloadersave_last_aweme_id🟢
创建下载任务DouyinDownloadercreate_download_task🟢
处理下载任务DouyinDownloaderhandle_download🟢
创建流下载任务DouyinDownloadercreate_stream_tasks🟢
处理流下载任务DouyinDownloaderhandle_stream🟢

handler接口列表

单个作品数据 🟢

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

参数类型说明
aweme_idstr视频ID
返回类型说明
video_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/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_idstr用户ID
max_cursorint页码,初始为0
page_countsint页数,初始为20
max_countsint最大页数,初始为None
返回类型说明
video_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/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_idstr用户ID
max_cursorint页码,初始为0
page_countsint页数,初始为20
max_countsint最大页数,初始为None
返回类型说明
aweme_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/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_cursorint页码,初始为0
page_countsint页数,初始为20
max_countsint最大页数,初始为None
返回类型说明
aweme_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/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_idstr合集ID
max_cursorint页码,初始为0
page_countsint页数,初始为20
max_countsint最大页数,初始为None
返回类型说明
aweme_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/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_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/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_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/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_idstr用户ID
返回类型说明
UserProfileFilter_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/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_idstr用户ID
dbAsyncUserDB用户数据库
返回类型说明
user_nicknamestr用户昵称
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/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())

创建用户记录与目录 🟡

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

参数类型说明
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/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_datadict作品数据字典
dbAsyncVideoDB作品数据库
ignore_fieldslist忽略的字段列表
返回类型说明
NoneNone
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/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。

参数类型说明
NoneNone
返回类型说明
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接口列表

生成真实msToken 🟢

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

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

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

生成虚假msToken 🟢

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

参数类型说明
NoneNone
返回类型说明
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,部分请求必带。

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

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

生成verify_fp 🟢

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

参数类型说明
NoneNone
返回类型说明
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值。

参数类型说明
NoneNone
返回类型说明
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())

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

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

参数类型说明
endpointstr接口端点
返回类型说明
final_endpointstr带Xbogus参数的完整地址
py
# 使用接口地址直接生成请求链接
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参数,部分接口不校验。

参数类型说明
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

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()))

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

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


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。

参数类型说明
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,合辑id其实就是作品id,使用AwemeIdFetcher即可。

提取单个直播间号 🟢

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

参数类型说明
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()))

如何分辨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_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/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。支持绝对与相对路径。

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/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_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/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个接口的组合。

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

提示

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

显示二维码 🟢

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

参数类型说明
qrcode_urlstr二维码地址
show_imagebool是否显示二维码图片
返回类型说明
NoneNone
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 表示在控制台显示

crawler接口

dl接口

Released under the Apache-2.0 license.