# TikHub_PyPi([API.TikHub.io](https://api.tikhub.io/docs))
[API.TikHub.io](https://api.tikhub.io/docs),是一个异步高性能的Douyin,TikTok数据爬取工具,此Repo为基于该API的PyPi包,方便各位开发者调用。
## 注释
> 本项目使用以下Emoji在开发图表中表明开发状态!
| Emoji | 代表的含义 |
| :---: | :---: |
| 🚀 | 火箭 - 功能已编写完成并测试通过,并且已部署至生产环境。|
| ✅ | 勾选符 - 功能已编写完成,但还有待测试,测试通过后将部署至生产环境。|
| ❌ | 叉号符 - 功能尚未开始编写或还未编写完成。|
| 🔜 | SOON符 - 功能已提出但尚未分配指定开发人员。|
| ⚠️ | 警告符 - 功能出现问题待修复。|
## 项目进度
| 状态 | API端点路径 | 功能 |
| :---: | :---: | :---: |
| 🚀 | `/token` | 生成`Bearer Token` |
| 🚀 | `/users/me/` | 获取用户信息 |
> 各接口端点需求
| 状态 | 支持平台 | 需求 | 开始日期 | ETA日期 | 开发者 |
| :---: | :--- | :---: | :---: | :---: |:---: |
| 🚀 | 抖音, TikTok | 爬取单个视频数据 | 2022/10/08 | 已完成 | @Evil0ctal |
| 🚀 | 抖音, TikTok | 爬取单个视频评论数据 | 2022/10/08 | 已完成 | @Evil0ctal |
| 🚀 | 抖音, TikTok | 爬取配乐作品数据 | 2022/10/08 | 已完成 | @Evil0ctal |
| 🚀 | 抖音, TikTok | 爬取用户主页视频数据 | 2022/10/08 | 已完成 | @Evil0ctal |
| 🚀 | 抖音, TikTok | 爬取用户主页已点赞视频数据 | 2022/10/08 | 已完成 | @Evil0ctal |
> 抖音相关接口生产部署 - API tags: Douyin
| 状态 | API端点路径 | 功能 | issue |
| :---: | :---: | :---: | :---: |
| 🚀 | `/douyin_video_data/` | 爬取单个视频数据 | 无已知问题 |
| ⚠️ | `/douyin_video_comments/` | 爬取单个视频评论数据 | 失效待更新 |
| ⚠️ | `/douyin_music_videos/` | 爬取配乐作品数据 | 失效待更新 |
| 🚀 | `/douyin_profile_videos/` | 爬取用户主页视频数据 | 无已知问题 |
| 🚀 | `/douyin_profile_liked_videos/` | 爬取用户主页已点赞视频数据 | 无已知问题 |
> TikTok相关接口生产部署 - API tags: TikTok
| 状态 | API端点路径 | 功能 | issue |
| :---: | :---: | :---: | :---: |
| 🚀 | `/tiktok_video_data/` | 爬取单个视频数据 | 无已知问题 |
| 🚀 | `/tiktok_video_comments/` | 爬取单个视频评论数据 | 无已知问题 |
| 🚀 | `/tiktok_music_videos/` | 爬取配乐作品数据 | 无已知问题 |
| 🚀 | `/tiktok_profile_videos/` | 爬取用户主页视频数据 | 无已知问题 |
| 🚀 | `/tiktok_profile_liked_videos/` | 爬取用户主页已点赞视频数据 | 无已知问题 |
## 待办事宜 `Todo` 列表
- [ ] ⚠️ 修复`/douyin_video_comments/`端点
- [ ] ⚠️ 修复`/douyin_music_videos/`端点
## 使用示例
```python
async def async_test() -> None:
# 异步测试/Async test
tiktok_url = 'https://www.tiktok.com/@evil0ctal/video/7156033831819037994'
tiktok_music_url = 'https://www.tiktok.com/music/original-sound-7128362040359488261'
douyin_url = 'https://www.douyin.com/video/7153585499477757192'
douyin_user_url = 'https://www.douyin.com/user/MS4wLjABAAAA-Hu1YKTuhE3QkCHD5yU26k--RUZiaoMRtpfmeid-Z_o'
print("Test start...\n")
start_time = time.time()
# 获取TikHub请求头/Get TikHub request header
print("Running test : API.authenticate()")
await api.authenticate()
# 获取TikHub用户信息/Get TikHub user information
print("Running test : API.get_user_info()")
await api.get_user_info()
print("\nRunning ALL TikTok methods test...\n")
# 获取单个视频数据/Get single video data
print("Running test : API.get_tiktok_video_data()")
await api.get_tiktok_video_data(tiktok_url)
# 获取获取用户主页的所有视频数据/Get all video data on the user's homepage
print("Running test : API.get_tiktok_profile_videos()")
aweme_list = await api.get_tiktok_profile_videos(tiktok_url, 20)
print(f'Get {len(aweme_list)} videos from profile')
# 获取用户主页的所有点赞视频数据/Get all liked video data on the user's homepage
print("Running test : API.get_tiktok_profile_liked_videos()")
aweme_list = await api.get_tiktok_profile_liked_videos(tiktok_url, 20)
print(f'Get {len(aweme_list)} liked videos from profile')
# 获取TikTok视频的所有评论数据/Get all comment data of TikTok video
print("Running test : API.get_tiktok_video_comments()")
comments_list = await api.get_tiktok_video_comments(tiktok_url, 20)
print(f'Get {len(comments_list)} comments from video')
# 获取音乐页面上的所有(理论上能抓取到的)视频数据/Get all (theoretically) video data on the music page
print("Running test : API.get_tiktok_music_videos()")
aweme_list = await api.get_tiktok_music_videos(tiktok_music_url, 20)
print(f'Get {len(aweme_list)} videos from music')
print("\nRunning ALL Douyin methods test...\n")
# 获取单个视频数据/Get single video data
print("Running test : API.get_douyin_video_data()")
await api.get_douyin_video_data(douyin_url)
# 获取获取用户主页的所有视频数据/Get all video data on the user's homepage
print("Running test : API.get_douyin_profile_videos()")
aweme_list = await api.get_douyin_profile_videos(douyin_user_url, 20)
print(f'Get {len(aweme_list)} videos from profile')
# 获取用户主页的所有点赞视频数据/Get all liked video data on the user's homepage
print("Running test : API.get_douyin_profile_liked_videos()")
aweme_list = await api.get_douyin_profile_liked_videos(douyin_user_url, 20)
# 总耗时/Total time
total_time = round(time.time() - start_time, 2)
print("\nTest completed, total time: {}s".format(total_time))
if __name__ == '__main__':
api = API(
username='test',
password='test',
proxy=None,
)
asyncio.run(async_test())
```
Raw data
{
"_id": null,
"home_page": "https://github.com/orgs/TikHubIO",
"name": "tikhub",
"maintainer": "",
"docs_url": null,
"requires_python": ">=3.6",
"maintainer_email": "",
"keywords": "TikTok,Douyin,\u6296\u97f3,Scraper,Crawler,API,Download,Video,No Watermark,Async",
"author": "TikHub.io",
"author_email": "tikhub.io@proton.me",
"download_url": "https://files.pythonhosted.org/packages/89/86/26006eefee8f64332efc8c77d9190c6f892090bffb123a17b7af3045fa34/tikhub-1.0.1.tar.gz",
"platform": null,
"description": "# TikHub_PyPi([API.TikHub.io](https://api.tikhub.io/docs))\n\n[API.TikHub.io](https://api.tikhub.io/docs)\uff0c\u662f\u4e00\u4e2a\u5f02\u6b65\u9ad8\u6027\u80fd\u7684Douyin\uff0cTikTok\u6570\u636e\u722c\u53d6\u5de5\u5177\uff0c\u6b64Repo\u4e3a\u57fa\u4e8e\u8be5API\u7684PyPi\u5305\uff0c\u65b9\u4fbf\u5404\u4f4d\u5f00\u53d1\u8005\u8c03\u7528\u3002\n\n\n## \u6ce8\u91ca\n\n> \u672c\u9879\u76ee\u4f7f\u7528\u4ee5\u4e0bEmoji\u5728\u5f00\u53d1\u56fe\u8868\u4e2d\u8868\u660e\u5f00\u53d1\u72b6\u6001!\n\n| Emoji | \u4ee3\u8868\u7684\u542b\u4e49 |\n| :---: | :---: |\n| \ud83d\ude80 | \u706b\u7bad - \u529f\u80fd\u5df2\u7f16\u5199\u5b8c\u6210\u5e76\u6d4b\u8bd5\u901a\u8fc7\uff0c\u5e76\u4e14\u5df2\u90e8\u7f72\u81f3\u751f\u4ea7\u73af\u5883\u3002|\n| \u2705 | \u52fe\u9009\u7b26 - \u529f\u80fd\u5df2\u7f16\u5199\u5b8c\u6210\uff0c\u4f46\u8fd8\u6709\u5f85\u6d4b\u8bd5\uff0c\u6d4b\u8bd5\u901a\u8fc7\u540e\u5c06\u90e8\u7f72\u81f3\u751f\u4ea7\u73af\u5883\u3002|\n| \u274c | \u53c9\u53f7\u7b26 - \u529f\u80fd\u5c1a\u672a\u5f00\u59cb\u7f16\u5199\u6216\u8fd8\u672a\u7f16\u5199\u5b8c\u6210\u3002|\n| \ud83d\udd1c | SOON\u7b26 - \u529f\u80fd\u5df2\u63d0\u51fa\u4f46\u5c1a\u672a\u5206\u914d\u6307\u5b9a\u5f00\u53d1\u4eba\u5458\u3002|\n| \u26a0\ufe0f | \u8b66\u544a\u7b26 - \u529f\u80fd\u51fa\u73b0\u95ee\u9898\u5f85\u4fee\u590d\u3002|\n\n## \u9879\u76ee\u8fdb\u5ea6\n\n| \u72b6\u6001 | API\u7aef\u70b9\u8def\u5f84 | \u529f\u80fd |\n| :---: | :---: | :---: |\n| \ud83d\ude80 | `/token` | \u751f\u6210`Bearer Token` |\n| \ud83d\ude80 | `/users/me/` | \u83b7\u53d6\u7528\u6237\u4fe1\u606f |\n\n> \u5404\u63a5\u53e3\u7aef\u70b9\u9700\u6c42\n\n| \u72b6\u6001 | \u652f\u6301\u5e73\u53f0 | \u9700\u6c42 | \u5f00\u59cb\u65e5\u671f | ETA\u65e5\u671f | \u5f00\u53d1\u8005 |\n| :---: | :--- | :---: | :---: | :---: |:---: |\n| \ud83d\ude80 | \u6296\u97f3, TikTok | \u722c\u53d6\u5355\u4e2a\u89c6\u9891\u6570\u636e | 2022/10/08 | \u5df2\u5b8c\u6210 | @Evil0ctal |\n| \ud83d\ude80 | \u6296\u97f3, TikTok | \u722c\u53d6\u5355\u4e2a\u89c6\u9891\u8bc4\u8bba\u6570\u636e | 2022/10/08 | \u5df2\u5b8c\u6210 | @Evil0ctal |\n| \ud83d\ude80 | \u6296\u97f3, TikTok | \u722c\u53d6\u914d\u4e50\u4f5c\u54c1\u6570\u636e | 2022/10/08 | \u5df2\u5b8c\u6210 | @Evil0ctal |\n| \ud83d\ude80 | \u6296\u97f3, TikTok | \u722c\u53d6\u7528\u6237\u4e3b\u9875\u89c6\u9891\u6570\u636e | 2022/10/08 | \u5df2\u5b8c\u6210 | @Evil0ctal |\n| \ud83d\ude80 | \u6296\u97f3, TikTok | \u722c\u53d6\u7528\u6237\u4e3b\u9875\u5df2\u70b9\u8d5e\u89c6\u9891\u6570\u636e | 2022/10/08 | \u5df2\u5b8c\u6210 | @Evil0ctal |\n\n> \u6296\u97f3\u76f8\u5173\u63a5\u53e3\u751f\u4ea7\u90e8\u7f72 - API tags: Douyin\n\n| \u72b6\u6001 | API\u7aef\u70b9\u8def\u5f84 | \u529f\u80fd | issue |\n| :---: | :---: | :---: | :---: |\n| \ud83d\ude80 | `/douyin_video_data/` | \u722c\u53d6\u5355\u4e2a\u89c6\u9891\u6570\u636e | \u65e0\u5df2\u77e5\u95ee\u9898 |\n| \u26a0\ufe0f | `/douyin_video_comments/` | \u722c\u53d6\u5355\u4e2a\u89c6\u9891\u8bc4\u8bba\u6570\u636e | \u5931\u6548\u5f85\u66f4\u65b0 |\n| \u26a0\ufe0f | `/douyin_music_videos/` | \u722c\u53d6\u914d\u4e50\u4f5c\u54c1\u6570\u636e | \u5931\u6548\u5f85\u66f4\u65b0 |\n| \ud83d\ude80 | `/douyin_profile_videos/` | \u722c\u53d6\u7528\u6237\u4e3b\u9875\u89c6\u9891\u6570\u636e | \u65e0\u5df2\u77e5\u95ee\u9898 |\n| \ud83d\ude80 | `/douyin_profile_liked_videos/` | \u722c\u53d6\u7528\u6237\u4e3b\u9875\u5df2\u70b9\u8d5e\u89c6\u9891\u6570\u636e | \u65e0\u5df2\u77e5\u95ee\u9898 |\n\n> TikTok\u76f8\u5173\u63a5\u53e3\u751f\u4ea7\u90e8\u7f72 - API tags: TikTok\n\n| \u72b6\u6001 | API\u7aef\u70b9\u8def\u5f84 | \u529f\u80fd | issue |\n| :---: | :---: | :---: | :---: |\n| \ud83d\ude80 | `/tiktok_video_data/` | \u722c\u53d6\u5355\u4e2a\u89c6\u9891\u6570\u636e | \u65e0\u5df2\u77e5\u95ee\u9898 |\n| \ud83d\ude80 | `/tiktok_video_comments/` | \u722c\u53d6\u5355\u4e2a\u89c6\u9891\u8bc4\u8bba\u6570\u636e | \u65e0\u5df2\u77e5\u95ee\u9898 |\n| \ud83d\ude80 | `/tiktok_music_videos/` | \u722c\u53d6\u914d\u4e50\u4f5c\u54c1\u6570\u636e | \u65e0\u5df2\u77e5\u95ee\u9898 |\n| \ud83d\ude80 | `/tiktok_profile_videos/` | \u722c\u53d6\u7528\u6237\u4e3b\u9875\u89c6\u9891\u6570\u636e | \u65e0\u5df2\u77e5\u95ee\u9898 |\n| \ud83d\ude80 | `/tiktok_profile_liked_videos/` | \u722c\u53d6\u7528\u6237\u4e3b\u9875\u5df2\u70b9\u8d5e\u89c6\u9891\u6570\u636e | \u65e0\u5df2\u77e5\u95ee\u9898 |\n\n## \u5f85\u529e\u4e8b\u5b9c `Todo` \u5217\u8868\n\n- [ ] \u26a0\ufe0f \u4fee\u590d`/douyin_video_comments/`\u7aef\u70b9\n- [ ] \u26a0\ufe0f \u4fee\u590d`/douyin_music_videos/`\u7aef\u70b9\n\n## \u4f7f\u7528\u793a\u4f8b\n\n```python\nasync def async_test() -> None:\n # \u5f02\u6b65\u6d4b\u8bd5/Async test\n\n tiktok_url = 'https://www.tiktok.com/@evil0ctal/video/7156033831819037994'\n\n tiktok_music_url = 'https://www.tiktok.com/music/original-sound-7128362040359488261'\n\n douyin_url = 'https://www.douyin.com/video/7153585499477757192'\n\n douyin_user_url = 'https://www.douyin.com/user/MS4wLjABAAAA-Hu1YKTuhE3QkCHD5yU26k--RUZiaoMRtpfmeid-Z_o'\n\n print(\"Test start...\\n\")\n start_time = time.time()\n\n # \u83b7\u53d6TikHub\u8bf7\u6c42\u5934/Get TikHub request header\n print(\"Running test : API.authenticate()\")\n await api.authenticate()\n\n # \u83b7\u53d6TikHub\u7528\u6237\u4fe1\u606f/Get TikHub user information\n print(\"Running test : API.get_user_info()\")\n await api.get_user_info()\n\n print(\"\\nRunning ALL TikTok methods test...\\n\")\n\n # \u83b7\u53d6\u5355\u4e2a\u89c6\u9891\u6570\u636e/Get single video data\n print(\"Running test : API.get_tiktok_video_data()\")\n await api.get_tiktok_video_data(tiktok_url)\n\n # \u83b7\u53d6\u83b7\u53d6\u7528\u6237\u4e3b\u9875\u7684\u6240\u6709\u89c6\u9891\u6570\u636e/Get all video data on the user's homepage\n print(\"Running test : API.get_tiktok_profile_videos()\")\n aweme_list = await api.get_tiktok_profile_videos(tiktok_url, 20)\n print(f'Get {len(aweme_list)} videos from profile')\n\n # \u83b7\u53d6\u7528\u6237\u4e3b\u9875\u7684\u6240\u6709\u70b9\u8d5e\u89c6\u9891\u6570\u636e/Get all liked video data on the user's homepage\n print(\"Running test : API.get_tiktok_profile_liked_videos()\")\n aweme_list = await api.get_tiktok_profile_liked_videos(tiktok_url, 20)\n print(f'Get {len(aweme_list)} liked videos from profile')\n\n # \u83b7\u53d6TikTok\u89c6\u9891\u7684\u6240\u6709\u8bc4\u8bba\u6570\u636e/Get all comment data of TikTok video\n print(\"Running test : API.get_tiktok_video_comments()\")\n comments_list = await api.get_tiktok_video_comments(tiktok_url, 20)\n print(f'Get {len(comments_list)} comments from video')\n\n # \u83b7\u53d6\u97f3\u4e50\u9875\u9762\u4e0a\u7684\u6240\u6709(\u7406\u8bba\u4e0a\u80fd\u6293\u53d6\u5230\u7684)\u89c6\u9891\u6570\u636e/Get all (theoretically) video data on the music page\n print(\"Running test : API.get_tiktok_music_videos()\")\n aweme_list = await api.get_tiktok_music_videos(tiktok_music_url, 20)\n print(f'Get {len(aweme_list)} videos from music')\n\n print(\"\\nRunning ALL Douyin methods test...\\n\")\n\n # \u83b7\u53d6\u5355\u4e2a\u89c6\u9891\u6570\u636e/Get single video data\n print(\"Running test : API.get_douyin_video_data()\")\n await api.get_douyin_video_data(douyin_url)\n\n # \u83b7\u53d6\u83b7\u53d6\u7528\u6237\u4e3b\u9875\u7684\u6240\u6709\u89c6\u9891\u6570\u636e/Get all video data on the user's homepage\n print(\"Running test : API.get_douyin_profile_videos()\")\n aweme_list = await api.get_douyin_profile_videos(douyin_user_url, 20)\n print(f'Get {len(aweme_list)} videos from profile')\n\n # \u83b7\u53d6\u7528\u6237\u4e3b\u9875\u7684\u6240\u6709\u70b9\u8d5e\u89c6\u9891\u6570\u636e/Get all liked video data on the user's homepage\n print(\"Running test : API.get_douyin_profile_liked_videos()\")\n aweme_list = await api.get_douyin_profile_liked_videos(douyin_user_url, 20)\n\n # \u603b\u8017\u65f6/Total time\n total_time = round(time.time() - start_time, 2)\n print(\"\\nTest completed, total time: {}s\".format(total_time))\n\n\nif __name__ == '__main__':\n api = API(\n username='test',\n password='test',\n proxy=None,\n )\n asyncio.run(async_test())\n```\n\n\n",
"bugtrack_url": null,
"license": "Apache V2.0 License",
"summary": "Douyin/TikTok async data scraper.",
"version": "1.0.1",
"split_keywords": [
"tiktok",
"douyin",
"\u6296\u97f3",
"scraper",
"crawler",
"api",
"download",
"video",
"no watermark",
"async"
],
"urls": [
{
"comment_text": "",
"digests": {
"md5": "1e573f2a469503954a6b856b32df008a",
"sha256": "6cd8c8e49cb6a0aa507584e85c1a358f6f64f1db248f591ee7c0c924539f82ee"
},
"downloads": -1,
"filename": "tikhub-1.0.1-py3-none-any.whl",
"has_sig": false,
"md5_digest": "1e573f2a469503954a6b856b32df008a",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": ">=3.6",
"size": 10456,
"upload_time": "2022-12-20T00:15:13",
"upload_time_iso_8601": "2022-12-20T00:15:13.557987Z",
"url": "https://files.pythonhosted.org/packages/4a/01/b9eba1a3e7c469bf881a941f91bcbad49d6b8f66c4110ad99d23bee70825/tikhub-1.0.1-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"md5": "10eb095a2aea48c60856123ff428fdf6",
"sha256": "94bac745c23965f05fd642fabd9c18d682c9bcf663ef46d191efb5f64453703d"
},
"downloads": -1,
"filename": "tikhub-1.0.1.tar.gz",
"has_sig": false,
"md5_digest": "10eb095a2aea48c60856123ff428fdf6",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=3.6",
"size": 10725,
"upload_time": "2022-12-20T00:15:16",
"upload_time_iso_8601": "2022-12-20T00:15:16.758451Z",
"url": "https://files.pythonhosted.org/packages/89/86/26006eefee8f64332efc8c77d9190c6f892090bffb123a17b7af3045fa34/tikhub-1.0.1.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2022-12-20 00:15:16",
"github": true,
"gitlab": false,
"bitbucket": false,
"github_user": "orgs",
"github_project": "TikHubIO",
"lcname": "tikhub"
}