资讯动态

TikTok-Api Python 封装库完全指南:安装配置、异步会话管理、msToken 签名与七大数据端点详解

发布时间:2026/10/15 16:07:17 来源:尧图企业网站定制
网页爬虫【免费下载链接】TikTok-ApiThe Unofficial TikTok API Wrapper In Python项目地址https://gitcode.com/gh_mirrors/ti/TikTok-Api点击查看免费下载TikTok-ApiPyPI 包名TikTokApi仓库版本 6.5.2是作者 David Teather 维护的非官方 TikTok 数据抓取封装库它不依赖官方开放平台而是通过 Playwright 驱动真实浏览器绕过抖音/TikTok 的风控为开发者提供热门视频、用户、视频、评论、话题、音乐与搜索等公开数据的异步迭代接口。本文以仓库 README.md 为主体脉络结合 tiktok.py 与TikTokApi/api/目录下的源码实现系统讲解从安装、会话创建、请求签名到各数据端点调用的完整链路读完即可写出可运行的数据抓取程序并理解其底层工作方式。项目定位与能力边界README 开篇即明确了本库的性质这是一个面向 TikTok.com 的非官方 API 封装用于「检索数据retrieve data」。它有两条硬性边界不能代表用户发布post或上传upload任何内容不支持任何用户登录态user-authenticated路由——凡是你在未登录 TikTok 网站时无法访问的数据本库也无法访问。也就是说本库只覆盖「登出状态下网页端可见」的公开数据这与源码中 tiktok.py 通过User、Video、Sound、Hashtag、Comment、Trending、Search七个类组织全部端点的设计是一致的。同时README 明确说明该包始终免费且开源其中陈列的第三方赞助商内容与库本身无技术关联使用时无需关注。环境要求与安装README 明确指出安装需要 Python 3.9这一点在 setup.py 中通过python_requires3.9得到印证支持 3.9/3.10/3.11。安装共两步pip install TikTokApi python -m playwright install第一步安装库本身第二步安装其依赖的 Playwright 浏览器运行时默认下载 Chromium 等浏览器内核。库的运行时依赖在 requirements.txt 中定义requests2.31.0,3.0用于视频信息页 HTML 抓取与视频字节流下载playwright1.36.0,2.0提供浏览器自动化能力是会话session与请求签名的基础httpx0.27.0,1.0用于流式下载视频字节。安装完成后建议先运行仓库中的示例脚本验证环境。仓库根目录下提供了 7 个可直接运行的示例examples/例如python -m examples.trending_example-m方式让 Python 以模块形式从仓库根目录启动脚本这是 README 推荐的运行方式。使用 Docker 安装与运行如果不想在宿主机安装浏览器运行时README 提供了完整的 Docker 方案克隆仓库仅 Dockerfile 也可因为它会从 pip 安装 TikTokApi后依次执行docker pull mcr.microsoft.com/playwright:focal docker build . -t tiktokapi:latest docker run -v TikTokApi --rm tiktokapi:latest python3 your_script.py镜像基座使用微软官方mcr.microsoft.com/playwright:focal其中已预装 Playwright 所需系统依赖docker build .读取仓库根目录的 Dockerfile其核心步骤为pip3 install TikTokApi与python3 -m playwright installdocker run假定你的脚本名为your_script.py且位于仓库根目录README 明确注明这一点-v TikTokApi挂载一个同名命名卷--rm表示容器退出后自动清理。若需要从零克隆本仓库再构建可使用git clone https://gitcode.com/gh_mirrors/ti/TikTok-Api拉取源码后进入目录执行上述命令。快速开始抓取 TikTok 热门视频README 的 Quick Start 给出了一段可直接运行的最小程序用于获取当前热门For You视频。原样照录如下from TikTokApi import TikTokApi import asyncio import os ms_token os.environ.get(ms_token, None) # get your own ms_token from your cookies on tiktok.com async def trending_videos(): async with TikTokApi() as api: await api.create_sessions(ms_tokens[ms_token], num_sessions1, sleep_after3) async for video in api.trending.videos(count30): print(video) print(video.as_dict) if __name__ __main__: asyncio.run(trending_videos())这段代码包含三个关键要点async with TikTokApi() as apiTikTokApi实现了异步上下文管理器协议进入时返回自身退出时自动调用close_sessions()与stop_playwright()释放浏览器资源见 tiktok.py因此无需手动清理。await api.create_sessions(...)必须先创建浏览器会话后续所有请求都在会话上执行。ms_tokens[ms_token]传入你的 msTokennum_sessions1只建一个会话sleep_after3表示建会话后等待 3 秒以等待 msToken 生成。async for消费异步迭代器trending.videos(count30)返回异步生成器逐条产出TikTokApi.video对象。每个返回对象都可通过.as_dict拿到构造该对象所用的完整原始字典——README 提醒TikTok 会不时调整数据结构因此实际开发中务必先探查字典结构再写解析逻辑。以视频对象为例.as_dict通常包含id、createTime、stats/statsV2、author、challenges、music等字段见 video.py 的字段提取逻辑。仓库中tests/test_integration.py也展示了类似用法async for video in api.trending.videos(count100)并断言数量。关于 msToken它是 TikTok 网页端用于校验请求的关键 Cookie 值需要从你浏览器访问 tiktok.com 后的 Cookie 中自行获取README 明确说明通常建议通过环境变量注入避免硬编码。会话管理create_sessions 全参数详解会话是 TikTok-Api 与 Playwright 之间的核心抽象。每次调用create_sessions都会启动一个 Playwright 浏览器实例并为每个会话打开一个页面、注入 stealth 脚本、收集请求头。下面是从 tiktok.py 源码 docstring 整理出的完整参数表参数默认值说明num_sessions5要创建的会话数量headlessTrue是否以无头模式运行浏览器ms_tokensNonemsToken 列表从 tiktok.com 的 Cookie 获取后传入不传时库会尝试自行获取但不保证成功proxiesNone代理列表每个会话随机取一个使用sleep_after1创建会话后的休眠秒数用于等待 msToken 生成starting_urlhttps://www.tiktok.com会话启动时打开的页面地址context_options{}透传给 Playwrightbrowser.new_context()的选项字典override_browser_argsNone传递给浏览器启动的参数列表dict 列表cookiesNone会话使用的 Cookie 列表同样支持从浏览器获取suppress_resource_load_typesNone阻止加载的资源类型阻断越多加载越快可选类型document、stylesheet、image、media、font、script、textrack、xhr、fetch、eventsource、websocket、manifest、otherbrowserchromium浏览器内核可选chromium、firefox、webkit默认 chromiumexecutable_pathNone浏览器可执行文件的路径几个值得注意的源码细节无头模式当browser chromium且headlessTrue、未指定override_browser_args时库会自动追加--headlessnew参数并把headless置为False由参数接管以使用新版无头模式规避部分检测firefox与webkit则直接透传见 tiktok.py。多会话随机轮换所有会话通过asyncio.gather并发创建见 tiktok.py发起请求时若未指定session_index_get_session会随机挑选一个会话见 tiktok.py这有助于降低请求特征被集中识别的风险。msToken 的自动回退若未显式传入ms_tokens__create_session会在页面加载后读取会话 Cookie 中的msToken拿不到时仅记录日志并建议显式指定见 tiktok.py。stealth 反检测每个页面创建后都会执行stealth_async(page)注入webdriver属性删除、WebGL 厂商伪装、navigator.plugins/languages/hardwareConcurrency等 18 类浏览器指纹脚本见 stealth.py。会话参数模拟__set_session_params会从真实页面读取 UA、语言、平台、时区并随机生成device_id10^18 ~ 10^19 之间、屏幕宽高等组合出 TikTok Web 端要求的一整套 query 参数aid1988、app_nametiktok_web、browser_nameMozilla等见 tiktok.py。msToken、X-Bogus 与请求重试请求链路底层原理在调用任何数据端点前先理解请求是如何被签名和发送的这对排查风控问题至关重要。核心链路位于 make_request流程如下合并参数将会话级session.params上面提到的整套模拟参数与本次调用传入的params合并注入 msToken若参数中缺少msToken优先使用会话中保存的session.ms_token否则从 Cookie 中读取两者都失败时记录警告并尝试裸请求大概率失败拼接与签名urlencode编码参数后调用sign_url——sign_url会在页面中等待window.byted_acrawler就绪再执行frontierSign(url)生成X-Bogus签名并追加到 URL 上见 tiktok.py。X-Bogus 是 TikTok 请求的关键风控签名这一步必须在真实浏览器环境里完成这也是本库依赖 Playwright 的根本原因页面内 fetch通过run_fetch_script在页面上下文内执行fetch()发起 GET 请求见 tiktok.py请求头复用会话首次访问 tiktok.com 时捕获的真实头信息解析与重试响应为空触发EmptyResponseExceptionJSON 解析失败时按retries3重试默认开启指数退避asyncio.sleep(2**retry_count)重试耗尽后抛出InvalidJSONException。仓库 exceptions.py 中定义了完整的异常族TikTokException为基类子类包括CaptchaException触发验证码、NotFoundException对象不存在、EmptyResponseException、InvalidJSONException、InvalidResponseException、SoundRemovedException每个异常都携带raw_response、message与error_code便于定位问题。七大数据端点实战TikTokApi通过user、video、sound、hashtag、comment、trending、search七个属性暴露端点见 tiktok.py各自实现在 TikTokApi/api/ 目录下。所有「列表类」方法都返回异步迭代器支持count与cursor分页参数。1. 热门视频trendingasync for video in api.trending.videos(count30): print(video) print(video.as_dict)实现位于 trending.py请求https://www.tiktok.com/api/recommend/item_list/携带from_pagefyp、count参数从响应的itemList中逐条构造Video对象响应中hasMore为False时停止。2. 用户信息与内容useruser api.user(therock) user_data await user.info() # 用户详情 async for video in user.videos(count30): # 用户发布的作品 async for playlist in user.playlists(): # 用户播放列表 async for like in user.liked(count30): # 用户点赞需公开对应实现user.pyinfo()请求https://www.tiktok.com/api/user/detail/参数secUid、uniqueId、msToken返回原始字典并解析出user_id、sec_uid、usernamevideos()请求https://www.tiktok.com/api/post/item_list/secUidcount35cursor若创建时未提供sec_uid会先自动调用info()补齐liked()请求https://www.tiktok.com/api/favorite/item_list仅当对方点赞列表公开时可用playlists()请求https://www.tiktok.com/api/user/playlist。创建User时可传username或user_idsec_uid组合tests/test_user.py 用真实账号如charlidamelio验证了info、videos、liked、playlists四条路径。3. 视频详情、下载与相关视频videovideo api.video(urlhttps://www.tiktok.com/davidteathercodes/video/7074717081563942186) video_info await video.info() # 详情HTML 请求较慢避免频繁调用 async for related in video.related_videos(count10): # 相关视频 video_bytes await video.bytes() # 下载视频字节对应实现video.py创建方式传id或传url通过extract_video_id_from_url从 URL 中解析出视频 ID见 helpers.py也可直接传data字典构造info()与其它端点不同这是直接对视频落地页发起requests.get的 HTML 请求README 及源码注释均提示它较慢。解析顺序为先尝试页面内script idSIGI_STATE中的 JSON取data[ItemModule][id]失败则回退到__UNIVERSAL_DATA_FOR_REHYDRATION__标签取__DEFAULT_SCOPE__.webapp.video-detail.itemInfo.itemStruct见 video.py成功后将本次响应 Cookie 写回会话bytes(streamFalse)从as_dict[video][downloadAddr]下载视频字节streamTrue时通过 httpx 返回异步字节块迭代器便于边下边存comments(count, cursor)请求https://www.tiktok.com/api/comment/list/参数aweme_id、count20、cursor产出Comment对象related_videos(count)请求https://www.tiktok.com/api/related/item_list/参数itemID、count16产出相关Video。4. 评论与回复commentasync for comment in video.comments(count30): print(comment) print(comment.as_dict)Comment对象comment.py从原始数据中提取cid评论 ID、text、digg_count点赞数与作者User信息并提供replies()请求https://www.tiktok.com/api/comment/list/reply/拉取该评论的回复楼层。5. 话题 / 标签hashtagtag api.hashtag(namefunny) hashtag_data await tag.info() # 话题详情与统计 async for video in tag.videos(count30): # 带该话题的视频实现位于 hashtag.pyinfo()请求https://www.tiktok.com/api/challenge/detail/参数challengeName解析出话题id、title与stats含视频数、浏览数等统计videos()请求https://www.tiktok.com/api/challenge/item_list/参数challengeID、count35、cursor。创建时可传name或id仅传name时videos()会先自动调用info()补齐 ID。tests/test_integration.py 验证了话题视频中video.hashtags确实包含所查询话题并顺带断言了视频的sound、author字段。6. 音乐 / 声音soundsound_id 7016547803243022337 async for sound in api.sound(idsound_id).videos(count30): print(sound) print(sound.as_dict)实现位于 sound.pyinfo()请求https://www.tiktok.com/api/music/detail/参数musicId解析出标题、作者、时长、是否原创original、播放地址与封面videos()请求https://www.tiktok.com/api/music/item_list/参数musicID、count30、cursor。注意创建时必须提供id否则直接抛TypeError。7. 搜索searchasync for user in api.search.users(david teather, count10): print(user)实现位于 search.pyusers()委托给通用方法search_type()请求https://www.tiktok.com/api/search/{obj_type}/full/obj_type为user从user_list中构造User对象。有两个重要前提源码 docstring 与 examples/search_example.py 注释均有说明你的 msToken 必须先在网页端执行过一次搜索该端点才会生效当前版本仅支持搜索用户其它对象类型的搜索端点需要登录态不在本库能力范围内。常见问题排查README 的 Common Issues 一节给出两个高频问题结合源码可进一步展开「Browser Has no Attribute」错误绝大多数情况是没有执行python3 -m playwright install。若已执行仍报错建议对照 Playwright 官方 Python 快速上手文档排查浏览器安装是否完整。API 方法返回 Coroutine库的方法大量使用async/await调用时务必await凡是async for遍历的列表类方法也不能省略async for。忘记await时对象不会执行只会得到协程对象。另外从源码还可推断出几个常见注意点msToken 缺失若日志出现Failed to get msToken ... you should consider specifying ms_tokens说明会话未自动获取到 msToken请求大概率失败应按 README 建议在环境变量中显式提供video.info()慢它是 HTML 页面请求源码注释明确提示「avoid using this if possible」高频场景应优先使用其它基于内部 API 的端点搜索端点无效参见上文搜索一节的前置条件EmptyResponseException/InvalidJSONException通常意味着请求被风控拦截或返回了空页可尝试增加num_sessions、轮换代理、降低请求频率或重新获取新鲜 msToken。从 V5 升级到 V6一次异步化重构README 的 Upgrade 章节记录了 V5 → V6 的重大变化与动机理解这些背景有助于把握当前版本的设计取向可维护性MaintainabilityV5 时代 TikTok 能直接检测到 HTTP 请求维护成本陡增V6 改为维护一个异步 Playwright 页面池使请求更接近真实浏览器行为也便于后续维护全面异步Async这是社区呼声最高的诉求而页面池方案本身也要求异步化因此 V6 起所有接口均为异步用户灵活性User Flexibility新增了大量显式的函数参数即上文create_sessions参数表中的选项希望某个功能失效时用户能通过参数绕过而不必改包源码文档Documentation转向 Sphinx 生成更详尽的文档与「用户灵活性」相辅相成。升级要点最大的变化是「一切皆异步」。README 明确提示升级后需要像 Quick Start 示例那样使用asyncio.run(...)包装入口并用async with管理TikTokApi生命周期同时用async for消费所有列表类结果。测试与验证仓库 tests/ 下提供了覆盖各端点的异步测试均使用pytest.mark.asyncio可用于验证环境与接口可用性test_trending.py验证热门视频数量达到counttest_user.py验证info、videos、liked、playlists及字段解析使用公开账号数据test_video.py验证从 URL 提取视频 ID、info()返回结构与相关视频test_search.py验证用户搜索单页返回数量多页分页已知问题被显式 skip仓库中留有 issue 编号test_integration.py验证话题视频及其 hashtag、sound、author 字段关联。所有测试都从环境变量读取ms_tokenos.environ.get(ms_token, None)因此运行前同样需要先准备好有效的 msToken。整体而言TikTok 网页端结构会持续变化README 亦建议遇到接口失效时优先检查.as_dict的实际结构并在仓库 issue 区反馈必要时通过create_sessions提供的参数选项进行调优。赞分享网页爬虫【免费下载链接】TikTok-ApiThe Unofficial TikTok API Wrapper In Python项目地址https://gitcode.com/gh_mirrors/ti/TikTok-Api点击查看免费下载相关推荐discord.py 入门指南Python 异步 Discord API 封装库的安装与快速上手discord.py 入门指南Python 异步 Discord API 封装库的安装与快速上手 导读 本指南以 discord.py 官方 README 为即时通讯后端《Windows API Go 语言封装库 w32 安装与配置指南》《Windows API Go 语言封装库 w32 安装与配置指南》 1. 项目基础介绍 w32 是一个开源项目它为 Go 语言提供对 Windows API开发工具【亲测免费】 签名画板HTML5签名绘制库安装与配置完全指南签名画板HTML5签名绘制库安装与配置完全指南 项目基础介绍与编程语言 签名画板Signature Pad 是一个基于HTML5 canvas的JavaS前端UI组件创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑