1仕組みと動作原理
あらゆる抽出処理の前に読み取り専用の認証情報事前チェックを実行し、credential_state に基づいて現在利用可能な機能のみに絞り込みます。
python3 scripts/extract_video.py --check-keys
2つの外部サービスで役割を明確に分担:TikHub が投稿/アカウントの構造化データを担当し、軽抖が音声書き起こしを担当。プラットフォームの対応範囲はハードコードされています。
- 当前 TikHub 专用数据解析支持抖音、小红书和微信视频号;其他轻抖可识别的平台仍可只执行文字稿提取。
TikHub 側は MCP(Streamable HTTP)を採用し、プロトコルバージョンと3つのプラットフォームエンドポイントはスクリプトの定数に記述されています。
MCP_PROTOCOL_VERSION = "2024-11-05"
軽抖側は「タスク送信 + ポーリングによる結果取得」の REST フローであり、タイムアウトとポーリング間隔の制御を備えています。
url = f"{base_url.rstrip('/')}/web/api/getTaskResult?{query}"
Key は4段階の優先順位で検索:環境変数 → ユーザー指定のローカルファイル → ~/.config/dbs/API_Keys.md → macOS キーチェーン。
["security", "find-generic-password", "-s", KEYCHAIN_SERVICE, "-w"],
付属の安全な設定スクリプトは getpass による非表示読み取り、0600 権限ファイルへの書き込み、アトミックな置換を行い、Key がコマンド、応答、ログに出力されないようにします。
secret = getpass.getpass("使用凭证:").strip()
リクエスト失敗時のエラーメッセージは、スローする前に API Key を [REDACTED] に置換し、エラー経由で認証情報が応答へ漏洩するのを防止します。
detail = detail.replace(api_key, "[REDACTED]")
Base URL とエンドポイントパスに対して形式検証を実施(純粋な HTTPS ドメイン + 固定の /api/v1/ プレフィックスのみ許可)し、宛先の改ざんによる攻撃対象領域を最小化します。
raise TikHubError("Base URL 必须是只有域名的 HTTPS 地址。")
アーカイブ規則とユーザー編集保護:{出力ディレクトリ}/{投稿者}/{タイトル}.md に書き出し、既存ファイルはデフォルトでスキップ、--overwrite 指定時のみ上書きします。
path.write_text(render_markdown(item, title, author), encoding="utf-8")
認証情報が不足している場合、技術用語を直接スローせず、「API Key の説明 → 機能選択 → 購入案内 → 固定免責事項の提示 → ローカル安全設定」という分かりやすいフローを進めます。
> dbskill 是免费开源项目,与 TikHub、轻抖无隶属、合作或利益关系。充值由用户自主决定,相关交易、服务、争议及风险由用户自行承担;法律另有规定的除外,dbskill 不承担责任。
一方の失敗で結果を破棄しない:片方が失敗しても他方を完了させ、JSON サマリーに partial_success を記録します。
TikHub 或轻抖任一侧失败时继续完成另一侧,并在汇总中标记 `partial_success`。已经取得的结果不能因单侧失败而丢弃。
2コア機能
3外部依存関係
| Kind | Dependency / Endpoint |
|---|---|
| api | TikHub(作品/账号数据,MCP Streamable HTTP + REST) |
| api | 轻抖(语音文字稿提交与轮询) |
| cli | python3(运行 4 个自带脚本;仅标准库) |
| cli | security(macOS 钥匙串读取,仅 darwin 且未禁用时) |
| network | 购买/充值页(仅展示给用户人工操作,不由脚本访问) |
4推奨統制措置と判定根拠
- 本地凭据 / 浏览器配置: ユーザーのログイン Cookie/セッション/キーリングの読み取り: macOS キーチェーンサービス dbs-tikhub-api-key / dbs-qingdou-api-key(security find-generic-
- scripts/: ローカルスクリプトまたはコマンドの実行: python3 scripts/extract_video.py --check-keys / --mode both|data|transcript
- 网络端点: 外部ネットワークアクセスの宣言: TikHub:https://api.tikhub.dev / https://api.tikhub.io(REST)
- 本地工作目录: ファイルの読み書きと成果物の出力: {出力ディレクトリ}/{投稿者}/{タイトル}.md(文字起こしアーカイブ;既存ファイルはデフォルトでスキップ、--overwrite 指定時のみ上書き)
5二重目の独立検証
- [ok] 凭证四级来源与钥匙串调用真实存在 — tikhub_api.py / extract_video_transcript.py 中 find_api_key 依次读 env → 指定文件 → ~/.config/dbs/API_Keys.md → subprocess security;KEYCHAIN_SERVICE 分别为 dbs-tikhub-api-key、dbs-qingdou-api-key。
- [ok] 凭证写入按安全实践(0600 + 原子替换) — configure_api_key.py:mkstemp → write → temporary.chmod(0o600) → os.replace → target.chmod(0o600),异常时 unlink 临时文件。
- [ok] 错误信息脱敏(不泄漏 Key) — 两个客户端均含 detail.replace(api_key, "[REDACTED]"),且响应体截断(500/1000 字符)。
- [ok] 外部端點清单无遗漏 — 全量 URL 抽取得到的运行时端點仅 TikHub(REST/MCP)与轻抖;其余为文档/购买页链接。
- [ok] 无第三方 Python 包依赖 — 脚本 import 仅 json/logging/os/re/subprocess/sys/time/urllib/datetime/pathlib/typing/argparse/tempfile/getpass;目录内无 requirements.txt/setup.py/pyproject.toml。
- [ok] 不绕过平台限制、不自动下载/发布 — SKILL.md 原文"公开、删除、私密、版权和可见范围限制以接口返回为准,不尝试绕过。"与"不自动下载媒体、发布内容、提交 Git 或推送。"
- [ok] "已存在默认跳过"的写盘保护属实 — extract_video_transcript.py save_item 依据 overwrite 参数决定是否跳过;SKILL.md 与 agents/openai.yaml 表述一致。
- [ok] 付费与法律提示为强制展示 — SKILL.md"必须先原样展示下面这条提示,不能省略或改写",法律提示文本与脚本 LEGAL_NOTICE 常量同源。
6結論
3d8bb7e6cc40716a…