TMDとは telegrammediadownloader のこと。設定に従ってTelegramの会話からメディアをダウンロードでき、Webページとオプションのボット操作も用意されている。
Telegramのアプリ認証情報を申請したときは、うまくいかずに手こずった。ネットワークを変えて試したり、後で友人に手伝ってもらったりもした。この過程は個人の記録として残しておくが、申請が失敗したからといって、それを一律に「IPがクリーンでない」せいにするのはよくないし、他人の api_id と api_hash を借りるのもおすすめしない。
まず3つの認証情報を区別する
api_id はTelegramアプリの数字のIDで、api_hash は同じアプリのハッシュ。どちらも my.telegram.org/apps で取得する。bot_token はBotFatherでボットを作ったときに発行されるもので、オプションのボット機能にしか使わない。
api_id、api_hash と、BotFatherが発行する bot_token を混同しないこと。自分のアプリ認証情報、ログイン用の確認コード、sessionファイルは、他人に送ったり公開リポジトリにコミットしたりしない。

説明図:Telegramのダウンロード:認証情報、セッション、ファイルは別々に保存
ディレクトリと設定を準備する
まず 公式の設定サンプル から設定を丸ごとコピーし、必要なフィールドを書き換える。以下は関連するフィールドを抜き出しただけで、完全なファイルとしてそのまま上書きしてはいけない。
api_id: 123456
api_hash: YOUR_OWN_API_HASH
save_path: /app/downloads
web_host: 0.0.0.0
web_port: 5000
web_login_secret: REPLACE_WITH_A_LONG_RANDOM_SECRET
allowed_user_ids:
- me
api_id の数字もあくまで例。ボットで操作したい場合は、自分の bot_token と、それを使えるアカウントを設定する。ダウンロード対象、保存パス、メディアの種類は完全なテンプレートに従って設定し、自分がアクセス・保存する権利のあるものだけをダウンロードする。
Docker Composeを使う
プロジェクトのイメージをそのまま使うなら、build: . を同時に書く必要はない。これはローカルにビルドコンテキストがあることを前提にしていて、チュートリアルからcomposeファイルを1つコピーしただけでは、たいてい存在しない。
services:
telegram_media_downloader:
image: tangyoha/telegram_media_downloader:latest
restart: unless-stopped
ports:
- "127.0.0.1:8066:5000"
volumes:
- ./config.yaml:/app/config.yaml
- ./data.yaml:/app/data.yaml
- ./downloads:/app/downloads
- ./sessions:/app/sessions
- ./temp:/app/temp
- ./log:/app/log
実行前に、プロジェクトのサンプルに従って本物の config.yaml と data.yaml を用意する。Dockerに同名のディレクトリを勝手に作らせてはいけない。ダウンロード用、セッション用、ログ用のディレクトリにも、コンテナのユーザーが読み書きできる正しい権限を与える。
ここではホスト側の入口を 127.0.0.1 に限定していて、公網全体に開放しているわけではない。別のパソコンから使うなら、SSH転送でアクセスするか、信頼できる内部ネットワークで認証付きリバースプロキシの背後に配置する。
初回ログインとバックグラウンド実行
初回はアカウントと確認コードを対話的に入力する必要がある。まず次を実行する。
docker compose run --rm telegram_media_downloader
ターミナルでプロジェクトの案内に従ってログインし、sessionが永続化ディレクトリに書き込まれたことを確認してから、このフォアグラウンド実行を止めてバックグラウンドサービスを起動する。
docker compose up -d
docker compose logs --tail=100 telegram_media_downloader
初回実行時のセッションファイルは失ってはいけない。そうしないと、コンテナを再作成した後でも再ログインが必要になることがある。「とりあえず動かす」ために一時的に生成したsessionを、消えてしまうディレクトリにマウントしないこと。
リモートサーバーの場合は、自分のパソコンで次の転送を実行してから http://127.0.0.1:8066 を開く。your-server は実際のサーバーアドレスに置き換える。
ssh -L 8066:127.0.0.1:8066 your-user@your-server
問題が起きたらどの層を見るか
ログインに失敗したら、まず自分のアプリ認証情報、アカウントの状態、確認コードの流れを確認する。Webページが開かないなら、まずコンテナが5000番をリッスンしているか、ポートマッピングとSSH転送を確認する。ダウンロード結果が出ないなら、セッション設定、ファイルの種類、対象の権限、ログを確認する。これらは同じ種類の不具合ではない。
Rcloneはダウンロード完了後のオプションの転送ツール。まずローカルのダウンロードと永続化を正常に動かし、それから別途リモートとマウントパスを設定する。サーバー上の $HOME とコンテナ内のパスを混同しないこと。
参考:プロジェクト説明、Composeサンプル。この記事は設定の確認までで、あなたのTelegramアカウントへのログインや実機でのメディアダウンロードは行っていない。