接口列表
注意
🟢代表已经实现,🟡代表正在实现或修改,🟤代表暂时不实现,🔵代表未来可能实现,🔴代表将会弃用。
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 | 🟢 | |
生成真实msToken | TokenManager | gen_real_msToken | 🟢 |
生成虚假msToken | TokenManager | gen_false_msToken | 🟢 |
生成ttwid | TokenManager | gen_ttwid | 🟢 |
生成odin_tt | TokenManager | gen_odin_tt | 🟢 |
使用接口地址生成Xb参数 | XBogusManager | str_2_endpoint | 🟢 |
使用接口模型生成Xb参数 | XBogusManager | model_2_endpoint | 🟢 |
提取单个用户id | SecUserIdFetcher | get_secuid | 🟢 |
提取列表用户id | SecUserIdFetcher | get_all_secuid | 🟢 |
提取单个用户唯一id | SecUserIdFetcher | get_uniqueid | 🟢 |
提取列表用户唯一id | SecUserIdFetcher | get_all_uniqueid | 🟢 |
提取列表用户id | SecUserIdFetcher | get_all_secUid | 🟢 |
提取单个作品id | AwemeIdFetcher | get_aweme_id | 🟢 |
提取列表作品id | AwemeIdFetcher | get_all_aweme_id | 🟢 |
生成deviceId | DeviceIdManager | gen_device_id | 🟢 |
生成devideId列表 | DeviceIdManager | gen_device_ids | 🟢 |
全局格式化文件名 | - | format_file_name | 🟢 |
创建用户目录 | - | create_user_folder | 🟢 |
重命名用户目录 | - | rename_user_folder | 🟢 |
创建或重命名用户目录 | - | create_or_rename_user_folder | 🟢 |
crawler接口列表
爬虫url接口 | 类名 | 方法 | 状态 |
---|---|---|---|
用户信息接口地址 | TiktokCrawler | fetch_user_profile | 🟢 |
主页作品接口地址 | TiktokCrawler | fetch_user_post | 🟢 |
喜欢作品接口地址 | TiktokCrawler | fetch_user_like | 🟢 |
收藏作品接口地址 | TiktokCrawler | fetch_user_collect | 🟢 |
合集列表接口地址 | TiktokCrawler | fetch_user_play_list | 🟢 |
合集作品接口地址 | TiktokCrawler | fetch_user_mix | 🟢 |
作品详情接口地址 | TiktokCrawler | fetch_post_detail | 🟢 |
作品评论接口地址 | TiktokCrawler | fetch_post_comment | 🟢 |
首页推荐作品接口地址 | TiktokCrawler | fetch_post_feed | 🟢 |
搜索作品接口地址 | TiktokCrawler | fetch_post_search | 🟢 |
用户直播接口地址 | TiktokCrawler | fetch_user_live | 🟢 |
检测直播状态接口地址 | TiktokCrawler | fetch_check_live_alive | 🟢 |
dl接口列表
下载器接口 | 类名 | 方法 | 状态 |
---|---|---|---|
保存最后一次请求的aweme_id | TiktokDownloader | save_last_aweme_id | 🟢 |
筛选指定时间区间的作品 | TiktokDownloader | filter_aweme_datas_by_interval | 🟢 |
创建下载任务 | TiktokDownloader | create_download_task | 🟢 |
处理下载任务 | TiktokDownloader | handle_download | 🟢 |
创建流下载任务 | TiktokDownloader | create_stream_tasks | 🟢 |
处理流下载任务 | TiktokDownloader | handle_stream | 🟢 |
handler接口列表
单个作品数据 🟢
异步方法,用于获取单个视频。
参数 | 类型 | 说明 |
---|---|---|
aweme_id | str | 视频ID |
返回 | 类型 | 说明 |
---|---|---|
video_data | dict | 视频数据字典,包含视频ID、视频文案、作者昵称等 |
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())
用户发布作品数据 🟢
异步方法,用于获取用户发布的视频列表。
参数 | 类型 | 说明 |
---|---|---|
secUid | str | 用户ID |
cursor | int | 页码,初始为0 |
page_counts | int | 页数,初始为20 |
max_counts | int | 最大页数,初始为None |
返回 | 类型 | 说明 |
---|---|---|
aweme_data | dict | 视频数据字典,包含视频ID、视频文案、作者昵称、页码等 |
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())
用户喜欢作品数据 🟢
异步方法,用于获取指定用户点赞的视频列表,需开放喜欢列表。
参数 | 类型 | 说明 |
---|---|---|
secUid | str | 用户ID |
cursor | int | 页码,初始为0 |
page_counts | int | 页数,初始为20 |
max_counts | int | 最大页数,初始为None |
返回 | 类型 | 说明 |
---|---|---|
aweme_data | dict | 视频数据字典,包含视频ID、视频文案、作者昵称、页码等 |
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())
用户收藏作品数据 🟢
异步方法,用于获取指定用户收藏的视频列表。
参数 | 类型 | 说明 |
---|---|---|
secUid | str | 用户ID |
cursor | int | 页码,初始为0 |
page_counts | int | 页数,初始为20 |
max_counts | int | 最大页数,初始为None |
返回 | 类型 | 说明 |
---|---|---|
aweme_data | dict | 视频数据字典,包含视频ID、视频文案、作者昵称、页码等 |
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())
用户播放列表作品数据 🟢
异步方法,用于获取指定用户播放列表的作品列表。
参数 | 类型 | 说明 |
---|---|---|
secUid | str | 合集ID |
cursor | int | 页码,初始为0 |
page_counts | int | 页数,初始为20 |
返回 | 类型 | 说明 |
---|---|---|
aweme_data | dict | 视频数据字典,包含视频ID、视频文案、作者昵称、页码等 |
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是一致的,从单个作品数据接口中获取即可。
参数 | 类型 | 说明 |
---|---|---|
mixId | str | 合集ID |
cursor | int | 页码,初始为0 |
page_counts | int | 页数,初始为20 |
max_counts | int | 最大页数,初始为None |
返回 | 类型 | 说明 |
---|---|---|
aweme_data | dict | 视频数据字典,包含视频ID、视频文案、作者昵称、页码等 |
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
方法来返回用户输入的合集下标。
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()方法。
参数 | 类型 | 说明 |
---|---|---|
secUid | str | 用户ID |
uniqueId | str | 用户ID |
返回 | 类型 | 说明 |
---|---|---|
UserProfileFilter | _to_dict() | 自定义的接口数据过滤器 |
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的用户接口支持secUid
和uniqueId
两种用户ID。
创建用户记录与目录 🟢
异步方法,用于获取或创建用户数据同时创建用户目录。
参数 | 类型 | 说明 |
---|---|---|
kwargs | dict | cli字典数据,需获取path参数 |
secUid | str | 用户ID |
db | AsyncUserDB | 用户数据库 |
返回 | 类型 | 说明 |
---|---|---|
user_path | Path | 用户目录路径对象 |
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_data | dict | 作品数据字典 |
db | AsyncVideoDB | 作品数据库 |
ignore_fields | list | 忽略的字段列表 |
返回 | 类型 | 说明 |
---|---|---|
无 | 无 | 无 |
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 | 配置文件值 |
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,当出现错误时返回虚假的值。
参数 | 类型 | 说明 |
---|---|---|
无 | 无 | 无 |
返回 | 类型 | 说明 |
---|---|---|
msToken | str | 真实的msToken |
from f2.apps.tiktok.utils import TokenManager
if __name__ == "__main__":
print("tiktok real msToken:", TokenManager.gen_real_msToken())
生成虚假msToken 🟢
类方法,用于生成随机虚假的msToken,不同端点的msToken长度不同。
参数 | 类型 | 说明 |
---|---|---|
无 | 无 | 无 |
返回 | 类型 | 说明 |
---|---|---|
msToken | str | 虚假的msToken |
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,部分请求必带。
参数 | 类型 | 说明 |
---|---|---|
无 | 无 | 无 |
返回 | 类型 | 说明 |
---|---|---|
ttwid | str | ttwid参数 |
from f2.apps.tiktok.utils import TokenManager
if __name__ == "__main__":
print("tiktok ttwid:", TokenManager.gen_ttwid())
注意
配置文件中ttwid
的cookie
参数是一个新的ttwid
值。失效后更换新的ttwid
值即可。
生成odin_tt 🟢
类方法,用于生成odin_tt,部分请求必带。
参数 | 类型 | 说明 |
---|---|---|
无 | 无 | 无 |
返回 | 类型 | 说明 |
---|---|---|
odin_tt | str | odin_tt参数 |
from f2.apps.tiktok.utils import TokenManager
if __name__ == "__main__":
print("tiktok odin_tt:", TokenManager.gen_odin_tt())
注意
配置文件中的odin_tt
参数是固定的,不可更改。
使用接口地址生成Xb参数 🟢
类方法,用于直接使用接口地址生成Xbogus
参数,部分接口不校验。
参数 | 类型 | 说明 |
---|---|---|
endpoint | str | 接口端点 |
返回 | 类型 | 说明 |
---|---|---|
final_endpoint | str | 带Xbogus参数的完整地址 |
# 使用接口地址直接生成请求链接
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
参数,部分接口不校验。
参数 | 类型 | 说明 |
---|---|---|
endpoint | str | 端点 |
params | dict | 请求参数 |
返回 | 类型 | 说明 |
---|---|---|
final_endpoint | str | 带Xbogus参数的完整地址 |
使用模型生成接口地址,需要先创建一个模型对象,然后调用model_2_endpoint
方法。
# 使用用户信息模型生成请求链接
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()))
还可以使用爬虫引擎与过滤器采集数据。
# 使用用户信息模型生成请求链接,请求接口并使用自定义过滤器输出所需接口数据
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。
参数 | 类型 | 说明 |
---|---|---|
url | str | 用户主页地址 |
返回 | 类型 | 说明 |
---|---|---|
sec_uid | str | 用户ID |
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。
参数 | 类型 | 说明 |
---|---|---|
urls | list | 用户主页地址列表 |
返回 | 类型 | 说明 |
---|---|---|
secuids | list | 用户ID列表 |
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。
参数 | 类型 | 说明 |
---|---|---|
url | str | 用户主页地址 |
返回 | 类型 | 说明 |
---|---|---|
unique_id | str | 用户唯一ID |
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。
参数 | 类型 | 说明 |
---|---|---|
urls | list | 用户主页地址列表 |
返回 | 类型 | 说明 |
---|---|---|
unique_ids | list | 用户唯一ID列表 |
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。
参数 | 类型 | 说明 |
---|---|---|
url | str | 作品地址 |
返回 | 类型 | 说明 |
---|---|---|
aweme_id | str | 作品ID |
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。
参数 | 类型 | 说明 |
---|---|---|
urls | list | 作品地址列表 |
返回 | 类型 | 说明 |
---|---|---|
aweme_ids | list | 作品ID列表 |
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 🟢
类方法,用于生成deviceId
和tt_chain_token
。
参数 | 类型 | 说明 |
---|---|---|
full_cookie | bool | 是否返回完整的cookie |
返回 | 类型 | 说明 |
---|---|---|
device_id | dict | 设备ID和cookie的字典 |
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列表 🟢
类方法,用于生成多个deviceId
和tt_chain_token
。
参数 | 类型 | 说明 |
---|---|---|
count | int | 设备ID数量 |
full_cookie | bool | 是否返回完整的cookie |
返回 | 类型 | 说明 |
---|---|---|
device_ids | dict | 设备ID和cookie的列表字典 |
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())
提示
deviceId
和tt_chain_token
影响视频地址的访问,403的情况就是这个问题。
全局格式化文件名 🟢
根据配置文件的全局格式化文件名。
格式化文件名规则
- 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.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
。支持绝对与相对路径。
├── 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
│ │ ├── ...
参数 | 类型 | 说明 |
---|---|---|
kwargs | dict | cli配置文件 |
nickname | Union[str, int] | 用户昵称 |
返回 | 类型 | 说明 |
---|---|---|
user_path | Path | 用户目录路径对象 |
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_path | Path | 旧的用户目录路径对象 |
new_nickname | str | 新的用户昵称 |
返回 | 类型 | 说明 |
---|---|---|
new_path | Path | 新的用户目录路径对象 |
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个接口的组合。
参数 | 类型 | 说明 |
---|---|---|
kwargs | dict | cli配置文件 |
local_user_data | dict | 本地用户数据 |
current_nickname | str | 当前用户昵称 |
返回 | 类型 | 说明 |
---|---|---|
user_path | Path | 用户目录路径对象 |
提示
该接口很好的解决了用户改名之后重复重新下载的问题。集合在handler接口的get_or_add_user_data
中,开发者无需关心直接调用handler的数据接口即可。