Skip to content

接口列表

注意

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

handler接口列表
CLI接口方法
下载单个作品handle_one_video
下载用户发布作品handle_user_post
下载用户喜欢作品handle_user_like
下载用户收藏作品handle_user_collect
下载用户合集(播放列表)作品handle_user_mix
下载搜索作品handle_search_video
下载用户直播流handle_user_live
数据与功能接口方法开发者接口
用户信息fetch_user_profile🟢
创建用户记录与目录get_or_add_user_data🟢
创建作品下载记录get_or_add_video_data🟢
单个作品数据fetch_one_video🟢
用户发布作品数据fetch_user_post_videos🟢
用户喜欢作品数据fetch_user_like_videos🟢
用户收藏作品数据fetch_user_collect_videos🟢
用户播放列表数据fetch_play_list🟢
用户合集(播放列表)作品数据fetch_user_mix_videos🟢
搜索作品数据fetch_search_videos🟢
用户直播流数据fetch_user_live_videos🟢
检查直播流状态fetch_check_live_alive🟢
utils接口列表
开发者接口类名方法状态
管理客户端配置ClientConfManager🟢
生成真实msTokenTokenManagergen_real_msToken🟢
生成虚假msTokenTokenManagergen_false_msToken🟢
生成ttwidTokenManagergen_ttwid🟢
生成odin_ttTokenManagergen_odin_tt🟢
使用接口地址生成Xb参数XBogusManagerstr_2_endpoint🟢
使用接口模型生成Xb参数XBogusManagermodel_2_endpoint🟢
提取单个用户idSecUserIdFetcherget_secuid🟢
提取列表用户idSecUserIdFetcherget_all_secuid🟢
提取单个用户唯一idSecUserIdFetcherget_uniqueid🟢
提取列表用户唯一idSecUserIdFetcherget_all_uniqueid🟢
提取列表用户idSecUserIdFetcherget_all_secUid🟢
提取单个作品idAwemeIdFetcherget_aweme_id🟢
提取列表作品idAwemeIdFetcherget_all_aweme_id🟢
生成deviceIdDeviceIdManagergen_device_id🟢
生成devideId列表DeviceIdManagergen_device_ids🟢
全局格式化文件名-format_file_name🟢
创建用户目录-create_user_folder🟢
重命名用户目录-rename_user_folder🟢
创建或重命名用户目录-create_or_rename_user_folder🟢
crawler接口列表
爬虫url接口类名方法状态
用户信息接口地址TiktokCrawlerfetch_user_profile🟢
主页作品接口地址TiktokCrawlerfetch_user_post🟢
喜欢作品接口地址TiktokCrawlerfetch_user_like🟢
收藏作品接口地址TiktokCrawlerfetch_user_collect🟢
合集列表接口地址TiktokCrawlerfetch_user_play_list🟢
合集作品接口地址TiktokCrawlerfetch_user_mix🟢
作品详情接口地址TiktokCrawlerfetch_post_detail🟢
作品评论接口地址TiktokCrawlerfetch_post_comment🟢
首页推荐作品接口地址TiktokCrawlerfetch_post_feed🟢
搜索作品接口地址TiktokCrawlerfetch_post_search🟢
用户直播接口地址TiktokCrawlerfetch_user_live🟢
检测直播状态接口地址TiktokCrawlerfetch_check_live_alive🟢
dl接口列表
下载器接口类名方法状态
保存最后一次请求的aweme_idTiktokDownloadersave_last_aweme_id🟢
筛选指定时间区间的作品TiktokDownloaderfilter_aweme_datas_by_interval🟢
创建下载任务TiktokDownloadercreate_download_task🟢
处理下载任务TiktokDownloaderhandle_download🟢
创建流下载任务TiktokDownloadercreate_stream_tasks🟢
处理流下载任务TiktokDownloaderhandle_stream🟢

handler接口列表

单个作品数据 🟢

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

参数类型说明
aweme_idstr视频ID
返回类型说明
video_datadict视频数据字典,包含视频ID、视频文案、作者昵称等
py
import asyncio
from f2.apps.tiktok.handler import TiktokHandler

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.tiktok.com/",
    },
    "proxies": {"http://": None, "https://": None},
    "cookie": "YOUR_COOKIE_HERE",
}


async def main():
    video = await TiktokHandler(kwargs).fetch_one_video(itemId="7095819783324601605")
    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())

用户发布作品数据 🟢

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

参数类型说明
secUidstr用户ID
cursorint页码,初始为0
page_countsint页数,初始为20
max_countsint最大页数,初始为None
返回类型说明
aweme_datadict视频数据字典,包含视频ID、视频文案、作者昵称、页码等
py
import asyncio
from f2.apps.tiktok.handler import TiktokHandler
from f2.apps.tiktok.utils import SecUserIdFetcher


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.tiktok.com/",
    },
    "proxies": {"http://": None, "https://": None},
    "timeout": 10,
    "cookie": "YOUR_COOKIE_HERE",
}


async def main():
    secUid = await SecUserIdFetcher.get_secuid("https://www.tiktok.com/@vantoan___")

    async for aweme_data_list in TiktokHandler(kwargs).fetch_user_post_videos(
        secUid, 0, 30, None
    ):
        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())

用户喜欢作品数据 🟢

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

参数类型说明
secUidstr用户ID
cursorint页码,初始为0
page_countsint页数,初始为20
max_countsint最大页数,初始为None
返回类型说明
aweme_datadict视频数据字典,包含视频ID、视频文案、作者昵称、页码等
py
import asyncio
from f2.apps.tiktok.handler import TiktokHandler
from f2.apps.tiktok.utils import SecUserIdFetcher

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.tiktok.com/",
    },
    "proxies": {"http://": None, "https://": None},
    "timeout": 10,
    "cookie": "YOUR_COOKIE_HERE",
}


async def main():
    secUid = await SecUserIdFetcher.get_secuid(
        "YOUR_HOME_PAGE"
    )  # 替换开放喜欢列表的用户主页

    async for aweme_data_list in TiktokHandler(kwargs).fetch_user_like_videos(
        secUid, 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())

用户收藏作品数据 🟢

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

参数类型说明
secUidstr用户ID
cursorint页码,初始为0
page_countsint页数,初始为20
max_countsint最大页数,初始为None
返回类型说明
aweme_datadict视频数据字典,包含视频ID、视频文案、作者昵称、页码等
py
import asyncio
from f2.apps.tiktok.handler import TiktokHandler
from f2.apps.tiktok.utils import SecUserIdFetcher

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.tiktok.com/",
    },
    "proxies": {"http://": None, "https://": None},
    "timeout": 10,
    "cookie": "YOUR_COOKIE_HERE",
}


async def main():
    secUid = await SecUserIdFetcher.get_secuid(
        "YOUR_HOME_PAGE"
    )  # 替换开放收藏列表的用户主页

    async for aweme_data_list in TiktokHandler(kwargs).fetch_user_collect_videos(
        secUid, 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())

用户播放列表作品数据 🟢

异步方法,用于获取指定用户播放列表的作品列表。

参数类型说明
secUidstr合集ID
cursorint页码,初始为0
page_countsint页数,初始为20
返回类型说明
aweme_datadict视频数据字典,包含视频ID、视频文案、作者昵称、页码等
py
import asyncio
from f2.apps.tiktok.handler import TiktokHandler
from f2.apps.tiktok.utils import SecUserIdFetcher


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.tiktok.com/",
    },
    "proxies": {"http://": None, "https://": None},
    "cookie": "YOUR_COOKIE_HERE",
}


async def main():
    secUid = await SecUserIdFetcher.get_secuid("https://www.tiktok.com/@vantoan___")
    playlist = await TiktokHandler(kwargs).fetch_play_list(secUid, 0, 30)
    print("=================_to_raw================")
    print(playlist._to_raw())
    # print("=================_to_dict===============")
    # print(aweme_data_list._to_dict())


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

用户合集作品数据 🟢

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

参数类型说明
mixIdstr合集ID
cursorint页码,初始为0
page_countsint页数,初始为20
max_countsint最大页数,初始为None
返回类型说明
aweme_datadict视频数据字典,包含视频ID、视频文案、作者昵称、页码等
py
import asyncio
from f2.apps.tiktok.handler import TiktokHandler
from f2.apps.tiktok.utils import SecUserIdFetcher


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.tiktok.com/",
    },
    "proxies": {"http://": None, "https://": None},
    "timeout": 10,
    "cookie": "YOUR_COOKIE_HERE",
}


async def main():
    secUid = await SecUserIdFetcher.get_secuid("https://www.tiktok.com/@vantoan___")
    playlist = await TiktokHandler(kwargs).fetch_play_list(secUid)

    for mixId in playlist.get("mixId", []):
        async for aweme_data_list in TiktokHandler(kwargs).fetch_user_mix_videos(mixId):
            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,使用select_playlist方法来返回用户输入的合集下标。

py
import asyncio
from f2.apps.tiktok.handler import TiktokHandler


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.tiktok.com/",
    },
    "proxies": {"http://": None, "https://": None},
    "timeout": 10,
    "cookie": "YOUR_COOKIE_HERE",
}


async def main():
    secUid = await SecUserIdFetcher.get_secuid("https://www.tiktok.com/@vantoan___")
    playlist = await TiktokHandler(kwargs).fetch_play_list(secUid)

    selected_index = await TiktokHandler(kwargs).select_playlist(playlist)  
    if selected_index != 0: 
        mixId = playlist.get("mixId", [])[selected_index - 1] 

        async for aweme_data_list in TiktokHandler(kwargs).fetch_user_mix_videos(mixId):
            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())

用户信息 🟢

异步方法,用于获取指定用户的信息,不可以直接解析Filter的数据,需要使用自定义的_to_dict()或_to_list()方法。

参数类型说明
secUidstr用户ID
uniqueIdstr用户ID
返回类型说明
UserProfileFilter_to_dict()自定义的接口数据过滤器
py
import asyncio
from f2.apps.tiktok.handler import TiktokHandler


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.tiktok.com/",
    },
    "cookie": "YOUR_COOKIE_HERE",
    "proxies": {"http://": None, "https://": None},
}


async def main():
    secUid = (
        "MS4wLjABAAAAQhcYf_TjRKUku-aF8oqngAfzrYksgGLRz8CKMciBFdfR54HQu3qGs-WoJ-KO7hO8"
    )
    uniqueId = "vantoan___"
    user = await TiktokHandler(kwargs).fetch_user_profile(secUid=secUid)
    print("=================_to_raw================")
    print(user._to_raw())
    # print("=================_to_dict===============")
    # print(user._to_dict())

    user = await TiktokHandler(kwargs).fetch_user_profile(uniqueId=uniqueId)
    print("=================_to_raw================")
    print(user._to_raw())
    # print("=================_to_dict===============")
    # print(user._to_dict())


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

提示

TikTok的用户接口支持secUiduniqueId两种用户ID。

创建用户记录与目录 🟢

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

参数类型说明
kwargsdictcli字典数据,需获取path参数
secUidstr用户ID
dbAsyncUserDB用户数据库
返回类型说明
user_pathPath用户目录路径对象
py
import asyncio
from f2.apps.tiktok.handler import TiktokHandler
from f2.apps.tiktok.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.tiktok.com/",
    },
    "proxies": {"http://": None, "https://": None},
    "cookie": "YOUR_COOKIE_HERE",
    "path": "Download",
}


async def main():
    async with AsyncUserDB("tiktok_users.db") as audb:
        secUid = "MS4wLjABAAAAQhcYf_TjRKUku-aF8oqngAfzrYksgGLRz8CKMciBFdfR54HQu3qGs-WoJ-KO7hO8"
        print(
            await TiktokHandler(kwargs).get_or_add_user_data(
                kwargs=kwargs, secUid=secUid, db=audb
            )
        )


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

提示

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

创建作品下载记录 🟢

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

参数类型说明
aweme_datadict作品数据字典
dbAsyncVideoDB作品数据库
ignore_fieldslist忽略的字段列表
返回类型说明
py
import asyncio
from f2.apps.tiktok.handler import TiktokHandler
from f2.apps.tiktok.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.tiktok.com/",
    },
    "proxies": {"http://": None, "https://": None},
    "cookie": "YOUR_COOKIE_HERE",
}


async def main():
    aweme_data = await TiktokHandler(kwargs).fetch_one_video(
        itemId="7095819783324601605"
    )
    async with AsyncVideoDB("tiktok_videos.db") as avdb:
        await TiktokHandler(kwargs).get_or_add_video_data(
            aweme_data._to_dict(), avdb, ignore_fields
        )


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

utils接口列表

管理客户端配置 🟢

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

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

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

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

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

生成真实msToken 🟢

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

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

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

生成虚假msToken 🟢

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

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

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

提示

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

生成ttwid 🟢

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

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

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

注意

配置文件中ttwidcookie参数是一个新的ttwid值。失效后更换新的ttwid值即可。

生成odin_tt 🟢

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

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

if __name__ == "__main__":
    print("tiktok odin_tt:", TokenManager.gen_odin_tt())

注意

配置文件中的odin_tt参数是固定的,不可更改。

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

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

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


async def main():
    test_endpoint = "aid=1988&app_language=zh-Hans&app_name=tiktok_web&browser_platform=Win32&browser_version=5.0%20%28Windows%20NT%2010.0%3B%20Win64%3B%20x64%29%20AppleWebKit%2F537.36%20%28KHTML%2C%20like%20Gecko%29%20Chrome%2F120.0.0.0%20Safari%2F537.36&channel=tiktok_web&cookie_enabled=true&count=16&coverFormat=2&device_id=7306060721837852167&device_platform=web_pc&itemID=7294298719665622305"
    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.tiktok.api import TiktokAPIEndpoints as tkendpoint
from f2.apps.tiktok.model import UserProfile
from f2.apps.tiktok.utils import XBogusManager

async def gen_user_profile(params: UserProfile):
    return XBogusManager.model_2_endpoint(
        tkendpoint.USER_DETAIL, params.model_dump()
    )

async def main():
    secUid="MS4wLjABAAAAQhcYf_TjRKUku-aF8oqngAfzrYksgGLRz8CKMciBFdfR54HQu3qGs-WoJ-KO7hO8"
    params = UserProfile(secUid=secUid)
    return await gen_user_profile(params)

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

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

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

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.tiktok.com/",
    },
    "proxies": {"http://": None, "https://": None},
    "cookie": "YOUR_COOKIE_HERE",
}


async def main():
    async with TiktokCrawler(kwargs) as crawler:
        secUid="MS4wLjABAAAAQhcYf_TjRKUku-aF8oqngAfzrYksgGLRz8CKMciBFdfR54HQu3qGs-WoJ-KO7hO8"
        params = UserProfile(secUid=secUid)
        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

提取单个用户id 🟢

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

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


async def main():
    raw_url = "https://www.tiktok.com/@vantoan___"
    # 对于单个URL
    return await SecUserIdFetcher.get_secuid(raw_url)


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

提取列表用户id 🟢

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

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


async def main():
    raw_urls = [
        "https://www.tiktok.com/@vantoan___/",
        "https://www.tiktok.com/@vantoan___?is_from_webapp=1&sender_device=pc",
        # "https://vt.tiktok.com/xxxxxxxxxx/"
    ]

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

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


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

提取单个用户唯一id 🟢

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

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


async def main():
    raw_url = "https://www.tiktok.com/@vantoan___"
    # 对于单个URL
    return await SecUserIdFetcher.get_uniqueid(raw_url)


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

提取列表用户唯一id 🟢

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

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


async def main():
    raw_urls = [
        "https://www.tiktok.com/@vantoan___/",
        "https://www.tiktok.com/@vantoan___?is_from_webapp=1&sender_device=pc",
        # "https://vt.tiktok.com/xxxxxxxxxx/"
    ]

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

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


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

提取单个作品id 🟢

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

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


async def main():
    raw_url = "https://www.tiktok.com/@vantoan___/video/7283528426256911649"
    # 支持短链解析但其具有时效性,故不举例
    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.tiktok.utils import AwemeIdFetcher
from f2.utils.utils import extract_valid_urls


async def main():
    raw_urls = [
        "https://www.tiktok.com/@vantoan___/video/7316948869764484384",
        "https://www.tiktok.com/@vantoan___/video/7316948869764484384?is_from_webapp=1&sender_device=pc&web_id=7306060721837852167",
        # 支持短链解析但其具有时效性,故不举例
    ]

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

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


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

提示

从网页复制的链接和app分享的链接都是有效的。

生成deviceId 🟢

类方法,用于生成deviceIdtt_chain_token

参数类型说明
full_cookiebool是否返回完整的cookie
返回类型说明
device_iddict设备ID和cookie的字典
py
import asyncio
from f2.apps.tiktok.utils import DeviceIdManager


async def main():
    device_id = await DeviceIdManager.gen_device_id()
    print(device_id)
    device_id = await DeviceIdManager.gen_device_id(full_cookie=True)
    print(device_id)


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

生成devideId列表 🟢

类方法,用于生成多个deviceIdtt_chain_token

参数类型说明
countint设备ID数量
full_cookiebool是否返回完整的cookie
返回类型说明
device_idsdict设备ID和cookie的列表字典
py
import asyncio
from f2.apps.tiktok.utils import DeviceIdManager


async def main():
    device_ids = await DeviceIdManager.gen_device_ids(3)
    print(device_ids)
    device_ids = await DeviceIdManager.gen_device_ids(3, full_cookie=True)
    print(device_ids)


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

提示

deviceIdtt_chain_token影响视频地址的访问,403的情况就是这个问题。

全局格式化文件名 🟢

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

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

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.tiktok.com/",
    },
    "proxies": {"http://": None, "https://": None},
    "cookie": "YOUR_COOKIE_HERE",
    "naming": "{create}_{desc}_{aweme_id}",
}


async def main():
    # 单作品的数据
    aweme_data = await TiktokHandler(kwargs).fetch_one_video("7316948869764484384")
    # 格式化后的文件名
    print(format_file_name(kwargs.get("naming"), aweme_data._to_dict()) + "_video")

    # 用户自定义字段
    custom_fields = {"location": "New York"}
    # 格式化后的自定义文件名
    print((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
   ├── tiktok
   ├── 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.tiktok.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.tiktok.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\tiktok\post\New Nickname

重命名用户目录 🟢

用于重命名用户目录。

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


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.tiktok.com/",
    },
    "proxies": {"http://": None, "https://": None},
    "cookie": "YOUR_COOKIE_HERE",
    "path": "Download",
    "mode": "post",
}


async def main():
    sec_user_id = "MS4wLjABAAAAQhcYf_TjRKUku-aF8oqngAfzrYksgGLRz8CKMciBFdfR54HQu3qGs-WoJ-KO7hO8"
    async with AsyncUserDB("tiktok_users.db") as audb:
        local_user_path = await TiktokHandler(kwargs).get_or_add_user_data(sec_user_id, audb)
    print(local_user_path)
    # X:\......\Download\tiktok\post\vantoan___

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

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

提示

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

创建或重命名用户目录 🟢

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

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

提示

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

crawler接口

dl接口

Released under the Apache-2.0 license.