メインコンテンツへスキップ

Telegram::GroupScraper - Telegramの公開チャンネルおよびグループ用スクレイパー

Telegram

スクレイパーの概要

このスクレイパーは、Telegramの公開チャンネルおよびグループからすべての投稿とメッセージを収集します。

動作ロジックは他のスクレイパーとは異なり、チャンネルやグループ内のメッセージを自動的に反復処理します。そのため、1つのタスク内で他のスクレイパーと併用することはできません

結果の行の順序は、投稿番号順であることは保証されません(スレッドに依存します)。チャット/チャンネルのメタデータはチャンネルごとに1回読み込まれ、各投稿のすべての行に複製されます。

内蔵された強力なテンプレートエンジン Template Toolkit により、結果に独自のロジックを適用したり、JSON、SQL、CSVを含む様々な形式でデータを出力したりすることができ、必要に応じた形式と構造で結果を保存することが可能です。

スクレイパーの活用事例

収集可能なデータ

公開チャンネルおよびグループに対応しています。

メッセージ

  • 投稿へのリンク (url)
  • 投稿ID (post_id)
  • チャンネル/グループのユーザー名(@なし) (channel)
  • HTML形式の投稿テキスト (message_text)
  • HTMLなしのプレーンテキスト (message_text_plain) — フィルタリング、検索、出力用
  • ISO形式の日付 (message_date)
  • 閲覧数 (views) — Telegramの表記通り: 15.5K1.2M など。チャンネルのみ、グループの場合は空
  • ビデオ通知 (message_video_notice) — 投稿にビデオがあるが、配列 message_videosURLがなく、このフィールドが 入力されている 場合:動画は Telegramにログインした状態でのみ視聴可能(認証が必要)で、ファイルへの直リンクはありません。これは収集の エラーではなく、Telegramがログインなしではこれらのビデオを提供しない仕様によるものです。

投稿者

  • プロフィールへのリンク (user_link)
  • 名前 (user_name)
  • アバターのURL (user_avatar)

転送(フォワード)

  • 転送元 (forward_from)
  • ソースへのリンク (forward_from_url) — 利用可能な場合、オリジナルのURL
  • リンクがない場合の説明 (forward_from_notice) — forward_from_url が空の場合に記入されます(例:「Source link not available in embed」)。直リンクがなく、オリジナルが削除、非表示、またはその他の理由でアクセスできない状態です。スクレイパーの エラーではありません

返信 (reply)

  • 返信先のメッセージURL (reply_to_url)
  • URLからの投稿ID (reply_to_post_id)
  • 元のメッセージの作成者 (reply_to_author)
  • 元のメッセージのテキスト(プレーン) (reply_to_text)

リアクション

  • リアクションの総数 (reactions_total) — 文字列としての数値。K/M/B は換算されます。

チャット/チャンネルのメタデータ

チャンネルごとに1回読み込まれ、投稿の各行に複製されます。

  • タイトル (chat_title)
  • 購読者数/メンバー数 (chat_members)
  • オンライン数 (chat_online) — グループのみ。チャンネルの収集 開始時点 のオンラインユーザー数で、スクレイピング中には 更新されません。チャンネルの場合は空。
  • 説明(プレーンテキスト) (chat_description)
  • メディアとリンクのカウンター (chat_photos, chat_videos, chat_files, chat_links) — チャンネルのみ

配列

reactions — フィールド emojicount (Telegramの表記通り: 161.2K)。誰がリアクションしたかは収集されません: 絵文字のタイプと総数のみが利用可能です。

message_photos — フィールド url。アルバムの場合は複数行になります。

message_videos — フィールド url。URLがないが投稿にビデオがある場合は、message_video_notice を確認してください(Telegramログイン後のみ視聴可能)。

links — フィールド url。投稿テキスト内の外部リンク。パスのない t.me/username 形式のリンクはここには 含まれません(これらは mentions です)。

mentions — フィールド username (@username)。t.me/username リンクおよび <a> タグ内の @username テキストから抽出されます。

機能

  • クエリの柔軟な正規化(クエリを参照)
  • 日付によるフィルタリング (dateFrom, dateTo) および転送メッセージのスキップ (skipForwards)
  • 写真とビデオのアルバム — 1つの投稿に複数のURL

ユースケース

  • チャンネルまたはグループの投稿内容の収集
  • リアクション、閲覧数、転送のモニタリング

クエリ

公開チャンネルとグループをサポートしています。すべての形式は https://t.me/{username} に変換されます:

クエリ動作
@usernameチャンネルまたはグループ、Start message number から開始
username同上
https://t.me/username同上
t.me/username同上
https://t.me/s/username同上
https://t.me/username/123チャンネルまたはグループ、投稿 #123 から開始 (Start message number は無視されます)

無効なクエリ → ログに Unknown query と記録され、結果は空になります。

例:

https://t.me/a_parser
@a_parser
https://t.me/a_parser/100

結果の出力例

A-Parserは、内蔵のテンプレートエンジン Template Toolkit により柔軟な結果フォーマットをサポートしており、任意の形式やCSV、JSONなどの構造化された形式で結果を出力できます。

デフォルト出力

結果フォーマット:

$channel/$post_id: $message_text_plain ($views views, $reactions_total reactions)

結果の例:

a_parser/1234: これらはフィルタです) ( views, 0 reactions)
a_parser/85962: Googleが保護に関する新しい何かをリリースしました) ( views, 2 reactions)

CSVテーブルへの出力

結果フォーマット:

[% tools.CSVline(channel, post_id, message_text_plain, views, reactions_total) %]

結果の例:

a_parser,1234,"これらはフィルタです)",,0
a_parser,85962,"Googleが保護に関する新しい何かをリリースしました)",,2

フィルタリングと投稿のスキップ

以下の場合、行は 結果に含まれません:

  1. 日付が Date from / Date to の範囲外
  2. Skip forwards が有効で、投稿が転送されたものである場合

日付や転送によるフィルタリング時、投稿は 「発見された」とみなされ、チャンネルの巡回は継続されます。

チャンネルの巡回が停止する条件:

  • 最後に発見された投稿の後、新しい発見がないまま Max empty posts で指定された数のIDを連続して確認した場合
  • または、開始から連続して空の投稿が続いた場合(まだ1つも投稿が発見されていない場合)

結果の処理

A-Parserではスクレイピング中に結果を直接処理できます。このセクションでは、Telegramスクレイパーで最も一般的なケースを紹介します。

メッセージ内の単語の有無による結果のフィルタリング

例

フィルタを追加し、ドロップダウンリストから $message_text - Message text を選択します。タイプとして RegEx match を選択します。 正規表現フィールドに、必要な単語を含む正規表現を入力します:

\bスクレイパー\b|\bGoogle\b|\byandex\b|\bスクレイパー\b|\bプロキシ\b|\bドーク\b

\b - 単語の境界

| - または(OR)

is - 正規表現フラグ

サンプルをダウンロード

A-Parserへのサンプルのインポート方法

eJyVVN1v2jAQ/18sHjaJ8qFSacobRaLaxEpX6BOg6oovqVfH9myHgTL+952dkMC6
PewhVu53v/v2uWQe3Jt7sOjQO5asSmbiP0uYR4mZhfyK6+0V7iE3ElmXGbAObeCu
2LKmJMmd1YVZbC0YtETimEIhPeuWzB8MkrdUSB9V5D5oEpajc5Dhs8c9EWvCsmJb
zMFvXwnegSwCsl6/rIvB6DqN5yCco+ocRuSmRtYvv+i70zqTWAsHUBz3tfAfToIw
TFvSNcYTzgw+nVNHLak2gIZElWjjhVZUinDsuNmcOuGm2lKxhHfMsFd3v1EuYIdL
XfUPW3hK0j3koTEdDh6DtpdGRx8+9nxsKHAuQkSQVYQwsjbqkxI/YmOVJi79WoFu
anUeJx8dBPBwym7FOlFm5KKItt8qG5akIB12maNUp0CJ8D81ggYLXtt57ADhJdNq
LOUMdyhbWvR/WwjJ6X6NUzL6XBv+nTJ/5+PYlHceaof2p6UcGi9Rup1/ba24numM
KudhUFLkwpPsJrpQYTADAt8QTdOz+9CzXFtswnhbYBOc1smg4kRsJzY2LXRRxcVU
LsGtVqnI5pS/FRxPzEItaWfnaqLDRoayVCElTcXhY3s7xq6eQhCayt8ZT2KIUPlp
Y5nXWroviypVYwXdvpuQYE6NPI9au9yClE+Ps3MNa28UCa/eG5f0+76XYx+eq/eD
BUOPmaYbRWUdN83D0rxF5b+el6Q80si+u4fKIBQY6IRRp1zcseHxN9yRrow=
ヒント

こちらも参照してください:

設定可能な項目

パラメータデフォルト値説明
Max empty posts1000最後に投稿が見つかった後、チャンネルの巡回を停止するまでに試行する連続した空のIDの数。保存される投稿の制限ではありません
Start message number1巡回を開始する投稿番号(クエリに /123 が含まれていない場合)
Skip forwards転送されたメッセージを保存しない
Date from開始日(から)、その日を含む。形式 YYYY-MM-DD
Date to終了日(まで)、その日を含まない。形式 YYYY-MM-DD