Install
openclaw skills install tikhub-api-skill-kkTikHub API 多平台数据爬取工具,支持抖音/TikTok/B站等。当用户提到:(1) 爬取抖音/TikTok/B站视频或评论;(2) 获取用户信息/粉丝列表;(3) 批量下载无水印视频;(4) 抖音链接转文字(下载→音频→Whisper pipeline);(5) 调用 TikHub API。
openclaw skills install tikhub-api-skill-kk主方案:MCP(mcporter)— 零依赖,支持 7 大平台
备用方案:Python SDK(tikhub)— 仅在 MCP 不可用时使用
MCP 配置在 ~/.openclaw/workspace/config/mcporter.json,已包含以下服务器:
| Server | 平台 | 工具数 |
|---|---|---|
tikhub-bilibili | B站 | 41 |
tikhub-douyin | 抖音 | 245 |
tikhub-tiktok | TikTok | 204 |
tikhub-youtube | YouTube | 37 |
tikhub-xiaohongshu | 小红书 | 71 |
tikhub-weibo | 微博 | 64 |
tikhub-kuaishou | 快手 | 33 |
存储在 ~/.openclaw/workspace/.env → TIKHUB_API_KEY
TikHub API 并非完全免费:
$4.98(当前)Step 1:获取视频信息
mcporter call tikhub-bilibili.bilibili_web_fetch_one_video bv_id="BV号"
Step 2:获取 AI 字幕(完整文字稿)
# 先获取字幕 URL
mcporter call tikhub-bilibili.bilibili_web_fetch_video_subtitle a_id="av号" c_id="cid"
# 下载字幕文件(JSON 格式,含时间戳)
curl -sL "字幕URL" -H "User-Agent: Mozilla/5.0" -o subtitle.json
Step 3:获取弹幕
mcporter call tikhub-bilibili.bilibili_web_fetch_video_danmaku cid="cid"
Step 4:获取下载直链(分段 m4s,需 ffmpeg 合并)
mcporter call tikhub-bilibili.bilibili_web_fetch_video_playurl bv_id="BV号" cid="cid"
Step 1:从链接提取 aweme_id
# 短链接解析
curl -sI "https://v.douyin.com/xxx" | grep -i location
# 完整链接直接截取末尾数字
Step 2:获取视频信息
mcporter call tikhub-douyin.douyin_web_fetch_one_video aweme_id="aweme_id"
Step 3:获取下载直链(MP4)
mcporter call tikhub-douyin.douyin_app_v3_fetch_video_high_quality_play_url aweme_id="aweme_id"
Step 4:字幕/弹幕
# 字幕(需视频有字幕)
# 弹幕
mcporter call tikhub-douyin.douyin_web_fetch_one_video_danmaku item_id="aweme_id" duration=秒数 end_time=时间戳 start_time=0
mcporter call tikhub-tiktok.tiktok_web_fetch_one_video aweme_id="视频ID"
mcporter call tikhub-tiktok.tiktok_web_fetch_video_play_url aweme_id="视频ID"
mcporter call tikhub-youtube.youtube_web_fetch_one_video video_id="视频ID"
mcporter call tikhub-youtube.youtube_web_fetch_video_captions video_id="视频ID"
| 平台 | 方法 | 参数 |
|---|---|---|
| B站 | tikhub-bilibili.bilibili_web_fetch_one_video | bv_id |
| 抖音 | tikhub-douyin.douyin_web_fetch_one_video | aweme_id |
| TikTok | tikhub-tiktok.tiktok_web_fetch_one_video | aweme_id |
| YouTube | tikhub-youtube.youtube_web_fetch_one_video | video_id |
| 小红书 | tikhub-xiaohongshu.xiaohongshu_web_fetch_one_note | note_id |
| 平台 | 方法 | 说明 |
|---|---|---|
| B站 | bilibili_web_fetch_video_playurl | 分段 m4s,需合并 |
| 抖音 | douyin_app_v3_fetch_video_high_quality_play_url | MP4 直链 ✅ |
| TikTok | tiktok_web_fetch_video_play_url | MP4 直链 |
| YouTube | youtube_web_fetch_video_play_url | 直链 |
| 平台 | 字幕 | 弹幕 |
|---|---|---|
| B站 | bilibili_web_fetch_video_subtitle | bilibili_web_fetch_video_danmaku |
| 抖音 | ❌ 大多无字幕 | douyin_web_fetch_one_video_danmaku |
| TikTok | tiktok_web_fetch_video_caption | - |
| YouTube | youtube_web_fetch_video_captions | - |
仅在 MCP 调用失败时使用,或需要 SDK 特有功能时使用
pip3 install tikhub --user
import os
os.environ["TIKHUB_API_KEY"] = "你的KEY" # 从 .env 读取
os.environ["TIKHUB_BASE_URL"] = "https://api.tikhub.dev"
| 功能 | SDK 方法 | MCP 工具 |
|---|---|---|
| 抖音视频信息 | client.DouyinWeb.fetch_one_video | douyin_web_fetch_one_video |
| 抖音无水印下载 | client.DouyinAppV3.fetch_one_video | douyin_app_v3_fetch_video_high_quality_play_url |
| B站视频信息 | ❌ 不支持 | bilibili_web_fetch_one_video |
| 查询余额 | client.TikHubUser.get_user_info() | - |
import asyncio
import subprocess
import whisper
from tikhub import Client
async def douyin_to_text(aweme_id: str, output_dir="/tmp"):
async with Client(api_key=os.getenv("TIKHUB_API_KEY"), base_url="https://api.tikhub.dev") as client:
# 1. 获取视频信息
info = await client.DouyinWeb.fetch_one_video(aweme_id=aweme_id)
aweme = info["data"]["aweme_detail"]
desc = aweme["desc"]
# 2. 获取下载直链(SDK 无水印,MCP 只返回直链)
dl_resp = await client.DouyinAppV3.fetch_one_video(aweme_id=aweme_id)
video_url = dl_resp["data"]["video_data"]["video_url"]["url_list"][0]
# 3. 下载视频
video_path = f"{output_dir}/{aweme_id}.mp4"
subprocess.run([
"curl", "-sL", "-o", video_path, video_url,
"-H", "User-Agent: Mozilla/5.0",
"-H", "Referer: https://www.douyin.com/"
], check=True)
# 4. 提取音频
audio_path = f"{output_dir}/{aweme_id}.wav"
subprocess.run([
"ffmpeg", "-i", video_path, "-vn",
"-acodec", "pcm_s16le", "-ar", "16000", "-ac", "1",
audio_path, "-y"
], check=True)
# 5. 转写(需安装 whisper)
model = whisper.load_model("small", device="cpu")
result = model.transcribe(audio_path, language="zh")
return {"desc": desc, "text": result["text"]}
python3 -c "
import asyncio
import httpx
async def check():
key = open('/Users/kk/.openclaw/workspace/.env').read().split('TIKHUB_API_KEY=')[1].split('\n')[0]
async with httpx.AsyncClient(timeout=10) as c:
r = await c.get('https://api.tikhub.dev/api/v1/tikhub/user/get_user_info', headers={'Authorization': f'Bearer {key}'})
d = r.json()
print('余额:', d['user_data']['balance'], '美元')
asyncio.run(check())
"
| 平台 | 信息 | 字幕/弹幕 | 下载直链 | 备注 |
|---|---|---|---|---|
| B站 | ✅ | ✅ AI字幕 + 弹幕 | ✅ 分段直链 | 最完整 |
| 抖音 | ✅ | ✅ 弹幕 | ✅ MP4直链 | 无字幕 |
| TikTok | ✅ | ✅ 字幕 | ✅ MP4直链 | 需梯子 |
| YouTube | ✅ | ✅ 字幕 | ✅ 直链 | 需梯子 |
| 小红书 | ✅ | ❌ | ✅ | 图文为主 |
| 微博 | ✅ | ❌ | ✅ | 视频为主 |
| 快手 | ✅ | ❌ | ✅ | - |