Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Telegram チャンネルデータ取得ガイド

Avatar for Daisuke Masuda Daisuke Masuda PRO
November 07, 2025
4

Telegram チャンネルデータ取得ガイド

https://daisuke.masuda.tokyo/article-2025-11-08-0057

本スライドは、Telegram チャンネルから管理者投稿を完全アーカイブしつつ、新規投稿をリアルタイム監視するための技術ガイドです。MTProto クライアント API(Telethon / Pyrogram)と Bot API の違いと認証手順、messages.getHistory や iter_messages による履歴取得方法、Webhook/ロングポーリングや Telethon のイベントを使った監視手法を解説します。 さらに、n8n によるDB保存・クロスポスト・アラートなどのワークフロー事例と、レート制限・FloodWait発生時のバックオフなど本番運用のベストプラクティスが整理されています。

Avatar for Daisuke Masuda

Daisuke Masuda PRO

November 07, 2025
Tweet

Transcript

  1. 2025 年11 月7 日 チャンネル例: t.me/+DKcwQbX3QRphMjFk TELEGRAM チャンネルデータ取得ガイド 履歴投稿の取得とリアルタイム更新の監視 •

    Telegram チャンネルから管理者の全投稿履歴を取得する方法 • 新規投稿をリアルタイムで取得する監視テクニック • Telegram API とライブラリを使用した開発者向け技術アプローチ
  2. 概要とユースケース 収集可能なデータ: チャンネルコンテンツ: テキスト投稿、写真、動画、文書、投票、リンク メタデータ: 投稿日、閲覧数、転送数、投稿者署名 編集履歴: 既存投稿の変更履歴 API ファミリー:

    MTProto Client API (Telethon, Pyrogram, TDLib) Bot API (HTTP ベース、シンプルだが制限あり) このプレゼンテーションの内容: 全投稿の履歴取得(完全アーカイブ) 新規投稿のリアルタイム取得 認証、権限、レート制限 本番環境のベストプラクティスとコード例 API 比較  MTProto Client API チャンネル履歴への完全アクセス ユーザー名で公開チャンネルに参加可能 招待リンクで非公開チャンネルに参加可能 ユーザー認証が必要  Bot API シンプルなHTTP リクエスト Webhook やPolling によるリアルタイム更新 履歴メッセージにアクセス不可 ボットをチャンネル管理者に設定する必要あり 一般的なユースケース  研究とアーカイブ 分析のための完全なデータ保存  分析とダッシュボード エンゲージメントとコンテンツパフォーマンスの追跡  アラートと監視 新コンテンツのリアルタイム通知  コンテンツモデレーション 自動フィルタリングとコンプライアンスチェック 2
  3. API 認証とセットアップ 認証オプション:Telegram は異なる認証要件と機能を持つ2 つのAPI パスを提供 しています。 MTProto (Telethon/Pyrogram) :ユーザーアカウント認証が必要

    • my.telegram.org/auth でアプリを登録し、api_id とapi_hash を取得 • 電話番号認証でセッションファイルを作成(初回のみ) • @username または招待リンクでチャンネルに参加 Bot API :ボット用の簡略化されたHTTP インターフェース • @BotFather でボットを作成してトークンを受け取る • ボットを対象チャンネルの管理者として追加 • webhook を設定するか、getUpdates によるポーリングを使用 アクセスと権限: MTProto :完全な履歴アクセス可能、ただしユーザーアカウントが必要 Bot API :管理者として追加された後の投稿のみ閲覧可能 messages.getHistory はユーザーのみ使用可(ボットは利用不可) プライベートチャンネルはメンバーシップ/ 招待が必要 認証フロー  MTProto のセットアップ 1 my.telegram.org でアプリを登録 2 api_id (整数)とapi_hash (文字列)を保存 3 認証情報でクライアントを初期化 4 電話番号でログイン(セッション作成) 5 必要に応じて対象チャンネルに参加  Bot API のセットアップ 1 Telegram で@BotFather と会話 2 新しいボットを作成(/newbot ) 3 HTTP API トークンを受け取る 4 ボットをチャンネルの管理者として追加 5 webhook またはポーリングを設定 必要な権限 チャンネル管理者としてのボット: 投稿を受信するには以下の権限を有効にしてください: メッセージの投稿 メッセージの編集 メッセージの削除 メッセージの閲覧 注:完全なチャンネル履歴を取得するには、MTProto クライアントAPI を使用してくださ い。ボットは参加前に投稿されたメッセージにアクセスできません。 3
  4. 履歴投稿の取得 MTProto メソッド: 公式API メソッドを使用してチャンネル投稿の完全な履歴 にアクセス。 messages.getHistory : すべての投稿をページングするための主要メソッド パラメータ:peer,

    offset_id, limit, min_id, max_id channels.getMessages : ID で特定のメッセージを取得 既知のメッセージID を対象とした取得に有用 管理者投稿の識別: 署名付き投稿の場合:message.post_author を確認 スーパーグループの場合:ChannelParticipantsAdmins フィルターを使 用 メッセージ送信者を管理者リストと照合 Bot API の制限: ❗ 重要: Bot API は過去のメッセージを取得できません ボットは管理者として参加した後に投稿された新しいメッセージのみ受信 MTProto ページネーションの流れ messages.getHistory リクエストごとに最大100 件のメッセージを返す offset_id limit max_id min_id パラメータによってメッセージ履歴のページング制御  次のページには offset_id を増分 TELETHON 実装 Telethon による効率的なページング # 最もシンプルなアプローチ - 自動ページネーション async for message in client.iter_messages( channel, reverse=True, # 古いものから順に limit=None # すべてのメッセージ ): process_message(message) 手動ページング制御 より詳細な制御が必要な場合: 実行間で last_id を保存して増分更新 バッチ処理のためのオフセット + リミットパターンを実装 FloodWaitError 例外を適切に処理 4
  5. リアルタイム監視方法 監視アプローチ: 2 つの主要なAPI ファミリーが新しいTelegram チャンネル投稿 をリアルタイムで取得するための異なる方法を提供しています 主要な監視オプション: Bot API

    :ロングポーリングまたはWebhook を使用したHTTP ベース MTProto クライアントAPI :イベント駆動型のサブスクリプションモデル Bot API はchannel_post 更新には管理者権限が必要 MTProto は一般ユーザーアカウントまたはボットで動作 信頼性の考慮事項: 中断後に再開するためにupdate_id/message_id を保持 レート制限処理のための指数バックオフの実装 重複を防ぐための冪等処理の確保 接続状態を監視し自動的に再接続 監視アプローチ図  ロングポーリング タイムアウト付きgetUpdates クライアントが繰り返しリクエスト  Webhook setWebhook サーバーがエンドポイントにプッシュ  イベントサブスクリプション NewMessage イベント Telethon/Pyrogram コールバック  更新処理 更新オブジェクトを処理 channel_post データを抽出 実装の詳細 Bot API ロングポーリング: getUpdates(offset=last_id+1, timeout=30, allowed_updates=["channel_post"]) Bot API Webhook : setWebhook(url="https://your-domain.com/hook", allowed_updates=["channel_post"]) MTProto イベント: @client.on(events.NewMessage(chats=[channel_id])) async def handler(event) 5
  6. TELETHON VS PYROGRAM VS BOT API 比較 実装オプション: ユースケース要件に基づく最適なAPI アプローチの選択

    主な検討事項: 履歴データの取得が必要か? 対応可能な認証の複雑さ ソリューションのホスト方法(サーバー、サーバーレス) チームの技術的熟練度 選択ガイド: チャンネル履歴の完全取得が必要? → MTProto (Telethon/Pyrogram )を選 択 シンプルなHTTP API が必要? → Bot API を選択 管理者権限が必要? → チャンネル投稿にはすべてのオプションで管理者権 限が必要 豊富なユーザーデータとイベント? → Telethon が最も充実したオブジェク トモデルを提供 API 比較  Telethon (MTProto) メリット:  完全なメッセージ履歴アクセス  豊富なオブジェクトモデルとイベント  強力な非同期イテレーター デメリット:  ユーザーログインとセッションが必要  FLOOD_WAIT エラー処理が必要  認証が複雑  Pyrogram (MTProto) メリット:  モダンで洗練されたAPI 設計  完全なメッセージ履歴アクセス  ユーザーモードとボットモード両対応 デメリット:  認証/ セッションの複雑さ  レート制限への懸念  ユーザー電話番号認証が必要  Bot API (HTTP) メリット:  シンプルなHTTP リクエスト  簡単なwebhook/ ロングポーリング  シンプルなトークン認証 デメリット:  履歴データへのアクセスなし  更新取得には管理者権限が必要  リアルタイム更新のみに限定 6
  7. TELETHON コード実装例 Telethon の実装: Telethon ライブラリを使用してTelegram チャ ンネルの投稿を取得し監視するための実用的なコードスニペッ ト。 これらの例は以下を示しています:

    チャンネル投稿の完全な履歴バックフィル イベントハンドラによるリアルタイム監視 公開および非公開チャンネルの両方に対応 実装上の注意点: 簡潔にするためにエラー処理は省略 再開可能性のために最後に処理されたメッセージID を保存 FLOOD_WAIT エラーに対しては常に指数バックオフを実装 本番環境ではasync とスレッディングの使用を検討 TELETHON コードスニペット 履歴バックフィル from telethon import TelegramClient, utils from telethon.tl.functions.messages import ImportChatInviteRequest # 認証 client = TelegramClient('session_name', api_id, api_hash) await client.start() # 必要に応じてプライベートチャンネルに参加 try: invite_hash = 'DKcwQbX3QRphMjFk' # t.me/+DKcwQbX3QRphMjFkより await client(ImportChatInviteRequest(invite_hash)) except: pass # 既にチャンネルに参加済み # すべてのメッセージをバックフィル(古いものから) async for message in client.iter_messages('t.me/+DKcwQbX3QRphMjFk', reverse=True): save_to_database(message.id, message.date, message.text) # 他の属性にアクセス: message.views, message.forwards など # メディアの場合: message.photo, message.document, message.video... リアルタイム監視 from telethon import TelegramClient, events client = TelegramClient('session_name', api_id, api_hash) # 新しいメッセージ用のイベントハンドラを登録 @client.on(events.NewMessage(chats=['t.me/+DKcwQbX3QRphMjFk'])) async def new_message_handler(event): message = event.message # 新しいチャンネル投稿を処理 print(f"新規投稿 {message.id}: {message.text}") save_to_database(message.id, message.date, message.text) @client.on(events.MessageEdited(chats=['t.me/+DKcwQbX3QRphMjFk'])) async def edited_message_handler(event): # 既存投稿の編集を処理 message = event.message update_in_database(message.id, message.text) async def main(): await client.start() await client.run_until_disconnected() 7
  8. Bot API コード実装例 Webhook 設定: HTTPS コールバックでボットが更新を受信するよう設定 # requestsライブラリを使用してwebhookを設定 import

    requests TOKEN = "123456:ABC-DEF1234ghIkl-zyx57W2v1u123ew11" WEBHOOK_URL = "https://your-domain.com/webhook" api_url = f"https://api.telegram.org/bot{TOKEN}/setWebhook" params = { "url": WEBHOOK_URL, "allowed_updates": ["channel_post"], } response = requests.post(api_url, json=params) print(response.json()) Webhook アプローチの利点: 即時更新配信(ポーリング遅延なし) 高トラフィックボットにはロングポーリングより効率的 サーバーレスプラットフォームにデプロイ可能 Webhook ハンドラの例 # Flask webhookハンドラの例 from flask import Flask, request, jsonify import json app = Flask(__name__) BOT_TOKEN = "123456:ABC-DEF1234ghIkl-zyx57W2v1u123ew11" @app.route(f"/webhook", methods=['POST']) def webhook_handler(): # 受信した更新をパース update = request.get_json() # 更新にチャンネル投稿が含まれているか確認 if 'channel_post' in update: channel_post = update['channel_post'] chat_id = channel_post['chat']['id'] message_id = channel_post['message_id'] message_text = channel_post.get('text', "") # チャンネル投稿を処理 process_channel_post(chat_id, message_id, message_text) return jsonify({'ok': True}) def process_channel_post(chat_id, message_id, text): # ここに処理ロジックを記述 print(f"New post in {chat_id}: {text[:30]}...") # データベースへの保存、通知のトリガーなど デプロイ: HTTPS 対応サーバーにホスト(Cloudflare Workers, Vercel など) セキュリティ: オプションでリクエスト検証のためsecret_token パラメータを setWebhook に追加 8
  9. N8N とTELEGRAM の連携 n8n とは: Telegram チャンネルの監視やデータ処理をノーコード/ ローコードで 実現するビジュアルワークフロー自動化プラットフォーム セットアップ手順:

    @BotFather でTelegram ボットを作成し、API トークンを取得 ボットを対象チャンネルの管理者として追加 n8n のTelegram Trigger ノードにボットトークンを設定 「Channel Post 」イベントを選択して新規投稿を監視 実用的なユースケース: データベース(PostgreSQL 、MongoDB )への自動コンテンツ保存 Telegram とTwitter/Discord など他プラットフォーム間のクロス投稿 AI 連携によるコンテンツ分析(OpenAI 、感情分析) キーワードや投稿パターンに基づくリアルタイムアラート ビジュアルワークフロー図 実装例 コンテンツアーカイブ: Telegram トリガー → HTTP リクエスト(メディア取得) → PostgreSQL クロスプラットフォーム投稿: Telegram トリガー → フィルター(メディアあ り)→ Twitter/Discord アラートシステム: Telegram トリガー → 関数(キーワード検索)→ メー ル/SMS 送信  Telegram トリガー イベント:チャンネル投稿   フィルター/処理 IF, Switch, Function ノード   データベース  通知  API 呼び出し 9
  10. レート制限とベストプラクティス Bot API の制限: データ収集ワークフローを構築する際に考慮すべき主な制約。 全体レート: 最大約30 リクエスト/ 秒 チャンネル投稿:

    グループ/ チャンネルあたり約20 メッセージ/ 分 更新保持期間: 最大24 時間まで保存 MTProto の考慮事項: FLOOD_WAIT_X エラーを指数バックオフで処理 適切なページサイズを使用(100 〜200 メッセージ) 繰り返しのログインを避けるためsession ファイルで初期化 メッセージのタイムスタンプにおけるタイムゾーンの違いを考慮 API レート比較 実装のベストプラクティス データパイプライン message_id 、日付、テキスト、メディ ア参照を保存 (chat_id, message_id) で重複を排除 last_id からの増分レジュームをサポー ト 信頼性 各レスポンス後にオフセットを再計算 障害復旧のための状態を永続化 リトライメカニズムを実装 コンプライアンス チャンネルのプライバシー設定を尊重 許可なく非公開チャンネルのスクレイ ピングを避ける データ保護規制を考慮 最適化 リアルタイム効率化のためwebhook を 使用 適切な場所でキャッシングを実装 可能な場合はバッチ処理を行う Bot API (全体) 30 リクエスト/ 秒 Bot API (チャンネル) 20 メッセージ/ 分 MTProto 可変(FLOOD_WAIT あり) 10
  11. まとめとリソース 重要なポイント: API 選択: 履歴データの完全取得にはMTProto を使用;管理者チャンネルの シンプルなリアルタイム監視にはBot API を使用 データパイプライン:

    大規模データセットを処理するためのページネーシ ョン、オフセット、リトライを計画 信頼性: 再開可能な操作とクラッシュ回復のために実行間で状態を永続化 実装戦略: レート制限に慣れるためにテストチャンネルから始める FLOOD_WAIT エラーとAPI 例外のためのエラー処理を実装する メッセージとメディアコンテンツのためのストレージ戦略を設計する チャンネルデータを取得する際にはプライバシーと利用規約を考慮する 公式ドキュメント  MTProto API リファレンス 履歴データ取得のためのTelegram Core API messages.getHistory: https://core.telegram.org/method/messages.getHistory channels.getMessages: https://core.telegram.org/method/channels.getMessages  Bot API ドキュメント リアルタイム監視のためのHTTP ベースインターフェース Bot API: https://core.telegram.org/bots/api getUpdates & Webhooks: https://core.telegram.org/bots/api#getting-updates  Python クライアントライブラリ Telegram API のハイレベルラッパー Telethon: https://docs.telethon.dev Pyrogram: https://docs.pyrogram.org  サンプルチャンネル このプレゼンテーションでデモに使用されたチャンネル https://t.me/+DKcwQbX3QRphMjFk 11