Tony Wang6 分で読めますTelegram の公開チャンネルをスクレイピングする方法(2026年版・Python)
Python で Telegram の公開チャンネルをスクレイピング:t.me/s + BeautifulSoup、Telethon、/web/scrape — 制限・アカウント停止リスク・法的基礎知識。
公開 Telegram チャンネルは、暗号資産のセンチメント、OSINT、ブランドモニタリングのためのリアルタイムフィードです。プライベートグループとは異なり、公開チャンネルは Web プレビュー(https://t.me/s/<handle>)でアカウントなしに閲覧できます。2026年現在も実用的な方法は3つあります。そのプレビューを Python でパースする、公式の MTProto スタックを Telethon で動かす、あるいは同じ公開 URL をマネージドなスクレイプ API 経由で取得し、プロキシやレート制限を自分で面倒見なくて済むようにする、の3つです。
このガイドでは、実行可能なコードとともに3つすべての方法を解説し、それぞれが実際に何を返すのか、そして越えてはいけない法的な一線について説明します。
なぜ Telegram をスクレイピングするのか
- 暗号資産と市場の話題 — ティッカーへの言及やナラティブの変化は、X や Reddit に出回る前にアルファ系チャンネルで先に見られることが多いです。
- OSINT とニュースモニタリング — 公開ニュースや地域の放送系チャンネルは、ほぼリアルタイムで更新をプッシュします。
- ブランド・製品への言及 — 主要な SNS の外側で起きるリーク、非公式のサポート関連の話題、レピュテーションリスクを把握できます。
Telegram をスクレイピングするのは合法ですか?
ログイン不要のプレビューへの公開 Web アクセスは、認証を回避したりプライベートなメンバーシップを自動化したりするのとは立場が異なります。迷った場合はチャンネルのテキストをユーザー生成コンテンツとして扱い、保持期間を最小限にし、AI 学習用途については法的助言を得てください。
選択肢1:公開 Web プレビューをスクレイピングする(t.me/s/)
チャンネルが公開されている場合、ブラウザで https://t.me/s/<handle> を開いてください。ログインは不要です。2026年半ば時点で、公式の Telegram News チャンネル(t.me/s/telegram)は1ページあたり約 20件 の直近メッセージを配信しており、それぞれに安定したウィジェットクラスが付いています。
| フィールド | CSS/属性(実機確認済み) |
|---|---|
| メッセージカード | div.tgme_widget_message |
| チャンネル+ID | data-post(例:telegram/429) |
| 本文テキスト | .tgme_widget_message_text |
| タイムスタンプ | time[datetime](ISO-8601) |
| 閲覧数 | .tgme_widget_message_views(省略表記、例:1.72M) |
import requests
from bs4 import BeautifulSoup
url = "https://t.me/s/telegram"
resp = requests.get(url, headers={"User-Agent": "telegram-research/1.0"}, timeout=20)
resp.raise_for_status()
soup = BeautifulSoup(resp.text, "html.parser")
rows = []
for msg in soup.select("div.tgme_widget_message"):
text_el = msg.select_one(".tgme_widget_message_text")
time_el = msg.select_one("time[datetime]")
views_el = msg.select_one(".tgme_widget_message_views")
rows.append({
"post": msg.get("data-post"),
"text": text_el.get_text(" ", strip=True) if text_el else None,
"date": time_el["datetime"] if time_el else None,
"views": views_el.get_text(strip=True) if views_el else None,
})
print(len(rows), "messages")
print(rows[0])
本格的なパイプラインには不向きな理由:
- 浅い履歴。 最初のページはおおよそ直近20件の投稿にとどまります。それより古いページには
?before=<message_id>のような呼び出しが必要ですが、Telegram はこれをきれいな公開アーカイブ API としてではなく、プログレッシブな AJAX として提供しています。 - 薄いメタデータ。 MTProto が公開している返信チェーン、完全なメディア記述子、多くの転送元情報が失われます。
- マークアップの変化。 クラス名はしばらく安定していますが、ウィジェットの再デザインは実際に起こります。
data-postへのアサーションを固定し、パース結果が空になったらセレクタを再確認してください。 - IP レピュテーション。 データセンターの IP からのバースト的なトラフィックはやはり制限を受けます。リクエストのペースを調整し、User-Agent で自分の bot を正直に名乗ってください。
静的 HTML のスキル(セレクタ、礼儀正しいアクセス、CSV エクスポート)については、Python ウェブスクレイピングガイド と BeautifulSoup チュートリアル をご覧ください。
選択肢2:Telethon/MTProto(全履歴だがアカウントにリスクあり)
伝統的な方法は、Telethon(Python)を通じた公式クライアントプロトコルの利用です。my.telegram.org でアプリケーションを登録し、電話番号で認証を行い、メッセージを反復処理します。
from telethon.sync import TelegramClient
api_id = 123456 # int from my.telegram.org
api_hash = "YOUR_API_HASH"
with TelegramClient("session_name", api_id, api_hash) as client:
for message in client.iter_messages("telegram", limit=10):
print(message.id, message.date, (message.text or "")[:80])
読み取り専用の公開モニタリング用途では各チームがこれを避ける理由:
- 電話番号がブロックされるリスク。 Telegram は VoIP や仮想番号(Twilio、Google Voice、多くの「SMS ファーム」)に対して積極的に対処します。最初の自動呼び出しの直後にアカウントが停止されるケースが多く見られます。個人の電話番号をスクレイパーに使うのは割に合いません。
- FloodWaitError。 深い履歴のページネーションは意図的に遅くなっています。アクティブなチャンネルの何年分もの履歴を取得しようとすると、数秒から数時間の待機が発生することを覚悟してください。
- セッション運用。 セッションファイル、2要素認証、デバイスリスト、再接続ロジックを自分で管理することになります — 通常のプロダクトクライアントには妥当ですが、一方向の公開フィード取得には負担が大きすぎます。
- API 規約。 クライアント開発者は API 利用規約 を遵守する必要があり、これにはコンテンツライセンス規約に紐づく AI 利用禁止も含まれます。
Telethon は、正当に認証済みアクセスが必要な場合(自分が所属するプライベートチャンネル、全履歴、プロトコル品質でのメディアダウンロードなど)に使いましょう。使い捨てのスクレイパー用アイデンティティ層として使うべきではありません。
選択肢3:/web/scrape によるマネージド取得
現時点で、Crawlora のカタログには専用の「Telegram チャンネル JSON」プロダクトエンドポイントはありません。できる のは、t.me/s/<handle> を通常の公開 URL として扱うことです。ウェブスクレイピング API の POST /api/v1/web/scrape を呼び、raw_html(または html)をリクエストし、選択肢1と同じ BeautifulSoup 抽出処理を実行します。API は Chrome になりすました HTTP リクエスト、必要に応じたブラウザへのエスカレーション(render: "auto")、egress を処理してくれるため、レジデンシャルプロキシを自分でローテーションする必要はありません。
curl -X POST "https://api.crawlora.net/api/v1/web/scrape" \
-H "x-api-key: $CRAWLORA_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"url": "https://t.me/s/telegram",
"formats": ["raw_html", "metadata"],
"render": "auto",
"only_main_content": false
}'
import requests
from bs4 import BeautifulSoup
resp = requests.post(
"https://api.crawlora.net/api/v1/web/scrape",
headers={"x-api-key": "YOUR_API_KEY"},
json={
"url": "https://t.me/s/telegram",
"formats": ["raw_html", "metadata"],
"render": "auto",
"only_main_content": False, # keep message widgets intact
},
timeout=60,
)
resp.raise_for_status()
payload = resp.json()["data"]
html = payload["raw_html"]
print("status", payload["metadata"]["status_code"], "method", payload["scrape"]["method"])
soup = BeautifulSoup(html, "html.parser")
for msg in soup.select("div.tgme_widget_message")[:5]:
text = msg.select_one(".tgme_widget_message_text")
print(msg.get("data-post"), text.get_text(" ", strip=True)[:100] if text else None)
Telegram のウィジェットレイアウトでは only_main_content を false に設定してください — デフォルトの true は、必要になるメッセージ構造を含み得るチロム部分を取り除いてしまいます。無料プランは 月2,000クレジット、クレジットカード不要 です。/web/scrape は成功したリクエストごとに課金されます(料金ページ 参照)。
サインアップ不要のスモークテストとしては、任意の t.me/s/... URL を 無料ウェブスクレイパー に貼り付け、API キーを組み込む前に返される HTML/Markdown を確認してください。
どの選択肢を選ぶべきか
| 目的 | 最適な方法 |
|---|---|
| 直近の公開投稿を一度だけ確認したい | 選択肢1(t.me/s/ に対する requests + BeautifulSoup) |
| 全履歴、自分が所属するプライベートチャンネル、プロトコル品質のメディア | 選択肢2(自分が管理する実際のアカウントによる Telethon) |
| プロキシ運用なしのスケジュール型公開モニタリング | 選択肢3(/web/scrape + 同じパーサー) |
| Telegram からの AI 学習用コーパス | なし — Telegram のコンテンツライセンス規約によりブロックされます |
収集できるもの
公開 Web プレビュー(選択肢1・3)から:
- チャンネルのハンドル+メッセージ ID(
data-post) - メッセージテキスト(存在する場合。一部のカードはメディアのみ)
time[datetime]からの ISO タイムスタンプ- 省略表記の閲覧数(例:
1.72M) - ページ上のチャンネルカウンター(登録者数、写真数、動画数、リンク数)
Telethon/MTProto(選択肢2)からは、さらに以下も:
- ~20件の Web ウィンドウを超える深い履歴
- 構造化されたメディア参照、返信、転送(プロトコルが公開している範囲で)
- 認証済みアカウントがメンバーである 場合に限り、プライベートチャンネルとグループ
招待を持っていないチャットからのプライベートなユーザープロフィール、電話番号、コンテンツは収集しないでください。
制約とよくある課題
- プライベートおよび招待制のチャンネル は公開 Web からスクレイピングできません。メンバーシップ+MTProto だけが誠実な方法です。
- 履歴の深さ。
t.me/s/は意図的に浅く設計されています。Telethon を計画するか、「直近の投稿のみ」で妥協してください。 - メディアの帯域幅 — 大きな動画は汎用プロキシ経由だとタイムアウトします。意図的にダウンロードし、キャッシュしてください。
- レート制限 — Telethon は
FloodWaitErrorを返します。Web プレビューはバースト的な負荷の下でソフトなブロックを返します。詰め込みすぎず、間隔を空けてください。 - AI 利用 — Telegram は、スクレイピングまたは API から取得したプラットフォームデータをモデルの学習や微調整に使用することを禁止しています。それに合わせてパイプラインを設計してください。
出典
この機能が役立つ場面
まずは無料でお試しください: t.me/s/<handle> の URL を 無料ウェブスクレイパー に貼り付けるか、アンチボットチェッカー で bot への抵抗をチェックできます — サインアップ不要です。
Telegram は数あるソーシャルソースのひとつです。コミュニティのスレッドについては Reddit をスクレイピングする方法 を、速報系の投稿については Twitter/X をスクレイピングする方法 を、法的な枠組みについては ウェブスクレイピングは2026年に合法ですか? をご覧ください。対象サイトが WAF で反撃してきた場合は、bot をブロックするサイトのスクレイピング をご覧ください。
任意の公開 URL を 無料ウェブスクレイパー でスモークテストし、ウェブスクレイピング API ページで製品全体を確認し、料金ページ でクレジットコストを確認してください。
自前のプロキシ群を運用せずに公開ページを取得
POST /web/scrape は、任意の公開 URL に対して生の HTML または Markdown を返します。成功時のみ課金、月2,000クレジット無料、クレジットカード不要。
How-to-Scrape ガイドシリーズ の一部です — 私たちが扱うすべてのプラットフォームを1か所にまとめています。
よくある質問
アカウントなしで Telegram をスクレイピングできますか?
はい、公開チャンネルであれば可能です。https://t.me/s/<handle> を開くだけでログインは不要です。テキスト・タイムスタンプ・閲覧数付きで、おおよそ直近20件の投稿が取得できます。プライベートグループ、DM、招待制チャンネルには、依然としてメンバーである認証済み MTProto クライアントが必要です。
Python で Telegram をスクレイピングする最適な方法は?
直近の公開投稿には、t.me/s/ に対する requests + BeautifulSoup、またはマネージドプロキシを使いたい場合は同じ HTML を POST /web/scrape 経由で取得します。全履歴には、実際の電話番号による Telethon を使います。Crawlora のカタログには現時点で専用の Telegram JSON プロダクトエンドポイントはありません。
Telegram チャンネルをスクレイピングするのは合法ですか?
ログイン不要のプレビューへの公開 Web アクセスは、認証の回避とは異なる扱いを受けることが多いですが、Telegram のコンテンツライセンス規約は AI モデルの学習・微調整のためのプラットフォームデータのスクレイピングを禁止しており、API 規約も同じ禁止事項を示しています。公開コンテンツのみを収集し、個人情報(PII)は避け、Telegram の規約とお住まいの地域の法律を確認してください。これは法的助言ではありません。
なぜ Telethon で自分の番号がブロックされるのですか?
Telegram は VoIP や仮想番号(Twilio、Google Voice、SMS ファームなど)を積極的に検知します。そうした番号で登録した自動化 MTProto クライアントは、最初の呼び出し直後にアカウントが停止されることが多くあります。自分が管理する実際の番号を使うか、読み取り専用のモニタリングであれば公開 Web プレビューにとどめてください。
直近20件を超える Telegram の投稿を取得するには?
t.me/s/ のプレビューは意図的に浅く(約20件のメッセージ)設計されています。より深い履歴には、認証済みページネーションに対応した Telethon(または他の MTProto クライアント)が必要で、Telegram が履歴取得をレート制限した際の FloodWaitError も処理する必要があります。
Crawlora に Telegram 用の API はありますか?
チャンネル専用の正規化されたエンドポイントはありません。公開の t.me/s/ URL に対して raw_html などの formats を指定した POST /api/v1/web/scrape を使い、直接リクエストする場合と同じように BeautifulSoup でパースしてください。API がレンダリングのエスカレーションと egress を処理します。