コンテンツ制作 · freestylefly/canghe-skills

douyin-downloader

Douyin(抖音)の透かしなし動画ダウンロードおよび文字起こしテキスト抽出ツール

L5 厳格管理 · 隔離環境と厳格な監査V2 人間監査済リバースAPI規約/コンプライアンスコマンド実行ネットワーク通信ファイル書き込みDual-pass Audit
Author freestyleflyGitHub freestylefly/canghe-skills ↗License MIT(仓库根 LICENSE)Commit dd0bf35595
管理レベルは Skill の能力と推奨統制措置を示すものであり、品質や安全性の認証、利用可否の判定ではありません。使用の可否はユーザーおよび管理者が決定します。Agent 環境によって制約が異なるため、自動保護を仮定しないでください。第三者製 Skill の著作権は原著作者に帰属し、利用リスクは利用者が負います。

1仕組みと動作原理

単一ファイルのNode CLIであり、exec/コマンドラインからdouyin.jsを直接呼び出し、info/download/extractの3つのサブコマンドで個別のタスクを実行します。

skills/canghe-douyin-downloader/SKILL.md
node /root/.openclaw/workspace/skills/douyin-downloader/douyin.js info "抖音分享链接"
処理内容:SKILL.mdにてOpenClawのexecツール経由の呼び出しを宣言しており、スクリプト自体はprocess.argvを用いてコマンドおよび-o/-v/--save-videoパラメータを解析します。

共有リンクの解析:正規表現でURLを抽出し、短縮リンク(v.douyin.com)のリダイレクトを追跡後、数値の動画IDを取得してDouyinのWeb detailエンドポイントを呼び出します。

skills/canghe-douyin-downloader/douyin.js
const apiUrl = `https://www.douyin.com/aweme/v1/web/aweme/detail/?aweme_id=${awemeId}`;
処理内容:公式APIで公開されていないWebエンドポイントを独自に呼び出す実装となっており、APIキーなしで動画情報を取得できる理由となっています。

「透かしなし」ダウンロードURLの取得:play_addrを優先取得し、URL内のplaywmをplayに置換(透かし除去の文字列置換)します。取得できない場合はdownload_addrにフォールバックします。

skills/canghe-douyin-downloader/douyin.js
const videoUrl = videoData.video?.play_addr?.url_list?.[0]?.replace('playwm', 'play') ||
処理内容:文字列置換によって透かしなしの直リンクを取得しており、説明にある「透かしなし」機能の実現手段となっています。

リクエストをiPhone Safariに統一偽装:すべてのhttp/httpsリクエストに固定のモバイルUser-Agentヘッダーを付与し、モバイルブラウザに偽装します。

skills/canghe-douyin-downloader/douyin.js
'User-Agent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 17_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) EdgiOS/121.0.2277.107 Version/17.0 Mobile/15E148 Safari/604.1'
処理内容:API呼び出しおよびページスクレイピングの両方でこのモバイルUA偽装を利用しており、クライアントのなりすまし動作に該当します。

動画ダウンロードのストリーミング書き込み:https/httpリクエストでレスポンスストリームを受け取り、content-lengthに応じて進捗を表示しながらローカルファイルにpipeし、3xxリダイレクトも追跡します。

skills/canghe-douyin-downloader/douyin.js
const writer = fs.createWriteStream(filepath);
処理内容:downloadFileが再帰的なリダイレクト処理、進捗出力、エラーハンドリングを行い、最終的に{video_id}.mp4としてディスクに保存します。

外部ffmpegサブプロセスによる音声抽出:-vn + libmp3lameを用いてmp4をmp3に変換し、音声ファイルを動画ファイルと同じディレクトリに出力します。

skills/canghe-douyin-downloader/douyin.js
const proc = spawn(ffmpegPath, args);
処理内容:runFfmpegがspawnをラップし、終了コードが0以外の場合にエラーをスローします。skill frontmatterでもrequires bins: [ffmpeg]が宣言されています。

音声文字起こしによるサードパーティ「SiliconFlow(硅基流动)」サービスへのアップロード:固定エンドポイントへPOST multipartリクエストを送信し、ユーザーのAPIキーをBearer形式で付与します。

skills/canghe-douyin-downloader/douyin.js
const DEFAULT_API_BASE_URL = 'https://api.siliconflow.cn/v1/audio/transcriptions';
処理内容:ユーザーの素材(音声)を外部サービスバックエンドに送信する経路であり、「テキスト抽出(APIキー必須)」の説明の実装部分です。

テキストのMarkdown保存と中間成果物のクリーンアップ:transcript.md(動画ID/抽出日時/ダウンロードリンクおよび本文を含む)を書き出し、動画保存が指定されていない場合は一時的なmp4とmp3を削除します。

skills/canghe-douyin-downloader/douyin.js
fs.writeFileSync(outputPath, markdown, 'utf-8');
処理内容:{outputDir}/{video_id}/transcript.mdに出力し、クリーンアップにはfs.unlinkSync(videoPath)およびunlinkSync(audioPath)を使用します。

環境変数からのAPIキー読み込み:DOUYIN_API_KEYまたはAPI_KEYから読み込み、設定されていない場合はextractがエラーを出力して即座に終了します。

skills/canghe-douyin-downloader/douyin.js
apiKey = process.env.DOUYIN_API_KEY || process.env.API_KEY;
処理内容:宣言された用途(音声文字起こし)のためだけにユーザー認証情報を読み込みます。info/downloadではキーは不要です。

API取得失敗時のページ解析へのフォールバック:douyin.comのページ内に埋め込まれたwindow._ROUTER_DATA JSONを取得して動画情報を抽出します。

skills/canghe-douyin-downloader/douyin.js
const match = pageContent.match(/window\._ROUTER_DATA\s*=\s*(.*?)<\/script>/);
処理内容:まずdetailエンドポイントを試行し、失敗した場合はページ内埋め込みJSONをスクレイピングするため、インターフェース変更に対する耐性を持たせています。

2コア機能

01透かしなし動画情報および直接ダウンロードリンクの取得(infoサブコマンド)
02Douyin動画のローカルへのダウンロード(downloadサブコマンド)
03音声文字起こしテキスト抽出(extractサブコマンド、APIキー必須)
04音声抽出(ffmpegによるmp3変換)
05メディア情報のプローブ(ffprobeによるduration/sizeの取得)
06短縮リンクのリダイレクト解決および失敗時のページJSONフォールバック
07APIキーの環境変数設定(DOUYIN_API_KEY / API_KEY)
08ダウンロード進捗表示と一時ファイルクリーンアップ

3外部依存関係

KindDependency / Endpoint
networkwww.douyin.com(未公开的 aweme detail web 端点)
networkv.douyin.com(分享短链,先跟重定向取真实 URL)
api硅基流动 语音转写 API(上传音频,Bearer DOUYIN_API_KEY)
cliffmpeg(转音频)与 ffprobe(读媒体信息)

4推奨統制措置と判定根拠

安全運用のための推奨統制措置
Agent 向け
隔離環境で実行、都度明示的な認可
管理者向け
厳格な認可、全量監査、コンプライアンス確認
判定根拠(ファイルパスと抜粋)
  • SKILL.md / 脚本: 非公開またはリバースエンジニアリングされたプライベートAPIの呼び出し / クライアント識別の偽装
  • SKILL.md / 脚本参数: 自動検出の回避、ホストサンドボックスの無効化、またはSSL証明書検証のスキップ
  • scripts/: ローカルスクリプトまたはコマンドの実行: douyin.js(nodeで実行、単一ファイルCLI)
  • 网络端点: 外部ネットワークアクセスの宣言: https://www.douyin.com/aweme/v1/web/aweme/detail/?aweme_id=…(非公開Webエンドポイント)
  • 本地工作目录: ファイルの読み書きと成果物の出力: {outputDir}/{video_id}.mp4(ダウンロードされた動画)
監査ノート: (機能およびポリシーレベルの判定であり、悪意のあるコードではありません)。(a) リバースエンジニアリング/なりすまし:Douyinの非公開Webエンドポイント(https://www.douyin.com/aweme/v1/web/aweme/detail/)へ独自にリクエストを行い、すべてのリクエストでiPhone SafariのUser-Agentを固定付与してモバイルクライアントに偽装し、さらにplay_addr内のplaywmをplayに置換して透かしなし直リンクを取得(プラットフォームの透かしマーキングを回避)しています。(b) 素材の外部送信:extractコマンドが動画から抽出した音声をサードパーティのバックエンド(api.siliconflow.cn、Bearer DOUYIN_API_KEY)へアップロードしており、ユーザーデータを外部サービスへ送信する処理を含みます。(c) コマンド実行面:外部のffmpeg/ffprobeサブプロセスを呼び出します。重大度の説明:TLS検証のダウングレードや高度なアンチオートメーション回避(webdriverパッチや署名偽造など)は確認されず、任意コード実行やバッチスクレイピングもありません。orange要素(環境変数の認証情報読み取り+素材の外部送信)が存在する一方、red要素(非公開エンドポイントのリバースエンジニアリング+モバイルクライアント偽装+透かし除去置換)が成立しているため、より厳格なred判定を適用しています。

5二重目の独立検証

  • [ok] 调用未公开 web 端点(red 主因之一) — douyin.js 拼接 https://www.douyin.com/aweme/v1/web/aweme/detail/?aweme_id=… 自行实现请求,非官方开放 API。
  • [ok] 移动端 UA 冒充(red 主因之二) — HEADERS 固定 iPhone Safari UA(EdgiOS/121.0)并用于所有请求;属客户端冒充。
  • [ok] 去水印串替换 — videoUrl 由 play_addr 的 url_list 经 replace('playwm', 'play') 得到,兑现「无水印」卖点。
  • [ok] 外部进程与音频出网 — spawn(ffmpeg/ffprobe) 用于转音频与探测;转写 POST 到 api.siliconflow.cn 并带 Bearer ApiKey,属素材出网。
  • [ok] 无 TLS 降级 / 无高级伪装 / 无任意代码执行 — §3 危险旗标与沙箱两类均无命中;无 eval/动态加载远程模块;无批量采集。
  • [ok] 来源与元数据 — _meta.json 记 owner whille、slug douyin-downloader-nodejs、version 1.0.0、publishedAt 1771744202949;SKILL.md homepage 指向 github.com/yzfly/douyin-mcp-server。

6結論

  • 依存関係なしの単一ファイル構成:Nodeとffmpegのみで動作し、npmインストール手順が不要で導入後すぐに利用可能。
  • info/downloadは認証情報不要:APIキーを一切指定せずに透かしなしリンクの取得および動画ダウンロードが可能。
  • 1つのコマンドで「ダウンロード→音声抽出→文字起こし→Markdown出力」の完全なパイプラインを実行可能(主要な「透かし除去+文字起こし」需要を網羅)。
  • リンク取得のフォールバック機能:API呼び出しが失敗した際、ページ内のwindow._ROUTER_DATA解析に切り替えるため、インターフェース変更に強い。
  • 一時成果物のクリーンアップ:動画の明示的な保存が指定されていない場合はmp4とmp3を自動削除し、不要なファイル残存を低減。
  • 最適な用途: Douyinの共有リンクから手軽に透かしなし動画を保存したい個人ユーザー、または発言内容をテキスト化したいユーザー(ffmpegおよびSiliconFlowのAPIキーを自己用意でき、安定性やコンプライアンス上のリスクを許容できる場合)に適しています。
    不向きな用途: 安定したSLA、著作権コンプライアンス審査、またはバッチ収集が必要なユースケースには適していません。データの外部送信(サードパーティへの文字起こしアップロード)に敏感なユーザーや、ffmpeg未インストールまたはNode環境に不慣れな環境には不向きです。
    Install Agent-Ready
    ① Verified Mirror 2026-10-10
    Option A · Direct DownloadDownload douyin-downloader.tar.gz
    sha256: 46c40531df500807…
    Option B · Copy Guide for Agent
    install.json
    Agent はこの JSON ガイドから自動的にダウンロードして検証します。
    ② Upstream GitHub
    GitHub Repo ↗
    Pinned to commit dd0bf35595.