
Pythonで書かれたTelegram大量監視ボット

Informer (TGInformer) は、Telegram 上で複数の実際のユーザーになりすまし、アカウントごとに 500 以上の Telegram チャンネルをスパイできるボットライブラリです。詳細は MySQL データベース、プライベート Google シート、および分析用のプライベートチャンネルに記録されます。
これは既知のバグがある動作する概念実証プロジェクトです。フォーク、共有、連絡は自由に行ってください。



キーワードフィルタリングに正規表現をサポート
SQLAlchemy によるデータベースに依存しないデータ永続化

コンテキストメッセージとチャンネルデータをプライベートチャンネルとデータベースに記録
メッセージの送信者、チャンネル、チャンネルの参加者数に関するメタ情報を保存


参加したチャンネルのセッションを永続化
一度ログインすれば、2FA 再認証なしでボットは永久にログイン状態を維持
アカウントあたり最大 500 チャンネルに参加

informer.env ファイルを編集します。このファイルには informer に必要なすべての環境変数が含まれています。
必要な Telegram 関連情報は以下で取得できます。
https://my.telegram.org/auth にアクセスし、電話番号と電話番号 (または Telegram) に送信された確認コードを入力してアカウントを認証します。


認証が完了したら、「API Development Tools」をクリックします。

以下のフォームに記入して新しいアプリケーションを作成します。

これで、informer.env ファイルの TELEGRAM_API_HASH と TELEGRAM_API_APP_ID フィールドに必要なパラメータ値が取得できました。

TELEGRAM_ACCOUNT_PHONE_NUMBER を含む値を置き換えて、次のセクションに進みます。
ここまでで、Telethon と Informer が Telegram API にアクセスするために必要なものを取得しました。次に、ボットのアカウントの識別子を取得する必要があります。
userinfobot を検索します。


Telegram のユーザー名とアカウント ID が表示されます。これは重要です。

informer.env ファイルを編集し、前の手順で取得した Telegram アカウント ID を TELEGRAM_ACCOUNT_ID に、ユーザー名を TELEGRAM_ACCOUNT_USER_NAME に設定します。オプションで TELEGRAM_NOTIFICATIONS_CHANNEL_ID にユーザー名またはチャンネル ID を入力することもできます。
TELEGRAM_ACCOUNT_PHONE_NUMBER が入力されていることを確認してください。これはセッション生成の鍵となります。複数アカウントを作成する場合は、以下の Burner アプリを参照してください。
Python 3 が動作していることを確認し、ディレクトリで ./quick_start.sh を実行してください。
初回実行時に Telegram で認証し、ローカルセッションファイルを生成するために、これを最初に実行する必要があります。
後で、異なるアカウントのファイルを app/session にコピーし、必要に応じて Docker 経由でマウントできます。

以前にログインしたことがある場合は Telegram 経由、または SMS で受け取った認証コードの入力を求められます。

Enter キーを押すと、app/session フォルダに、指定した国際電話番号に .session 拡張子を付けたファイル名でセッションが生成されます。
次のセクションでは、Docker Compose を使用してデータベースをセットアップします。
この手順はオプションですが、プライベートグループチャンネルを作成し、グループ ID を取得したい場合は次の手順を実行します。

informer.env ファイルの TELEGRAM_NOTIFICATIONS_CHANNEL_URL パラメータに URL を設定します。
チャンネル ID を取得するには、app ディレクトリで python3 bot.py <TELEGRAM_ACCOUNT_ID> を実行します(<TELEGRAM_ACCOUNT_ID> は以前に生成したアカウント ID です)。
スクリプトが読み込まれると、参加しているすべてのチャンネルが表示されます。この値をコピーして informer.env ファイルの TELEGRAM_NOTIFICATIONS_CHANNEL_ID パラメータに設定し、スクリプトを終了します。これで Informer を実行する準備が整いました。
quick_start.sh を実行した後、次のコマンドで Docker Compose を実行できます。
./start.sh を実行して、MySQL データベースを含む Docker コンテナをビルドします
./stop.sh を実行してコンテナを停止します
./clean.sh を実行して、未使用のコンテナとボリュームを削除します。 ** 注意 ** これによりデータベースがリセットされ、すべてのデータが失われます。
注意すべき点がいくつかあります。
以前は独自の MySQL インスタンスを実行する必要があり、接続文字列の互換性やバージョニングに問題が発生することがありました。このアップデートでは、自動的に作成され、ディスクに永続化されます。
さらに、ブラウザでログを表示できる Dozzle が提供されています。http://localhost:9999 にアクセスし、app_informer コンテナをクリックしてください。
自分の電話番号を使用したくなく、ある程度の匿名性を持って Informer ボットを実行したい場合は、iOS および Android で利用可能な Burner アプリを使用できます。
Burner アプリをインストールします

上記と同じ手順で、新しい電話番号を https://my.telegram.org/auth に入力します
Burner で検証します。SMS で認証コードが送信されるので、それを入力する必要があります

Telegram にログインします
app ディレクトリで python3 bot.py <api_user_id> を実行してアプリにログインを試みます
Telethon でログインするため、先ほどと同様にターミナルで認証コードを求められます。これは Telegram メッセージまたは SMS で送信されます。コードを入力すると、セッション資格情報が後述のセッションファイルに保存されます。セッションファイルが保存されている限り、再認証は必要ありません。
セッションは app/session/ フォルダに <telegram_phone_number>.session として保存されます。
必要なセッションファイルがすべて揃うまで繰り返し、Docker でマウントするだけです。
アカウントをスケーリングする方法を見つけるのは、自動化プロセスが必要だったため、少し悪夢でした。Telegram はショートコードからの SMS を受信できる実際の電話番号を使用する必要があります。
残念ながら、Twilio のような API を持つサービスは、米国、カナダ、英国では詐欺防止のためショートコードからの SMS 受信が禁止されています https://support.twilio.com/hc/en-us/articles/223181668-Can-Twilio-numbers-receive-SMS-from-a-short-code- これが理想的だったのですが、残念です。
この取り組みに一晩を無駄にしましたが、過去に使用した素晴らしいアプリ、Burner (https://www.burnerapp.com/) を思い出しました。偶然にも、API (https://developer.burnerapp.com/api-documentation/incoming-webhooks/) があります。つまり、番号を動的に生成し、新しいアカウントをインスタンス化し、Python の Telegram クライアント SDK (Telethon: https://docs.telethon.dev/en/latest/) を介してすべてを認証できます。
最も良い点は、Burner の番号は 14 日間無料であることです。クライアント API 経由で接続された Telegram アカウントは、一度ログインするだけでセッションが永続的に保持されます。私は Burner API と統合していませんが、プロセスは簡単です。
ボットは Telethon Python SDK (https://docs.telethon.dev/en/latest/) 上に構築されています。
この概念実証の構築中に遭遇した注意点と落とし穴をいくつか挙げます。
FloodWaitErrors は、ユーザー情報の照会やあまりに多くのチャンネルに高速で参加するなど、API に過剰なリクエストを送信した場合に発生する可能性があります。
TelegramClient(<session_file_name>, <api_user_id>, <api_user_hash>)
このファイルは実際には sqlite データベースであり、接続できます。キャッシュとして機能し、過去のデータとセッション認証情報を保存するため、Telegram の 2FA で再認証する必要がなくなります。初回使用時にはログインと認証が必要であることに注意してください。
ボットが実行されチャンネルに参加すると、クライアントがリアルタイムで更新され、参加した新しいチャンネルが表示されます。

ヒント: TelegramX は複数ログインをサポートしているため、これらの目的にははるかに優れたクライアントです。以下からダウンロード:
注: Google スプレッドシートの連携は完全にオプションです。 アプリケーションは MySQL データベースだけでも問題なく動作します。
Google スプレッドシートへのログ記録を有効にする場合:
app/credentials/README.md の詳細なセットアップガイドに従ってくださいクイック概要:
app/credentials/google_credentials.json に配置これはオプションであり、ボットはこれがなくても動作します。
bot.py を 2 回実行する必要がある可能性が高く、1 回目でチャンネルに参加させ、2 回目で監視します。この明らかなバグは認識しており、次のリビジョンで修正します。このプロジェクトは面白いと思いましたか?もしそうなら、スターを付けてください。
これは、暗号通貨分野の友人のために概念実証として 2 日間で作成されました。何か興味深い、または収益性の高いアプリケーションを見つけたら、ぜひコラボレーションしたいです。連絡先は以下の通りです:
@paulpierre on Twitter または hi (at) paulpierre (dot) com
私の興味深いプロジェクトのほとんどは github で非公開ですが、ぜひチェックしてみてください: http://www.github.com/paulpierre または過去の作品: http://www.paulpierre.com
Copyright (c) 2020 Paul Pierre 以下に定める条件に従い、本ソフトウェアおよび関連文書ファイル(以下「ソフトウェア」)の複製を取得するすべての人に対し、ソフトウェアを無制限に扱うことを許可します。これには、ソフトウェアの複製、使用、変更、結合、公開、配布、サブライセンス、および/または販売の権利、およびソフトウェアを提供された人にこれらを行うことを許可する権利を、無償でかつ制限なしに含みます。 上記の著作権表示および本許諾表示を、ソフトウェアのすべての複製または重要な部分に記載するものとします。 ソフトウェアは「現状のまま」で提供され、明示的か暗黙的かを問わず、いかなる保証もありません。これには、商品性、特定目的への適合性、および非侵害の保証が含まれますが、これに限定されません。いかなる場合も、著作者または著作権保持者は、契約、不法行為、またはその他の行為におけるいかなる請求、損害、その他の責任についても責任を負いません。これは、ソフトウェアに起因または関連して生じたもの、またはソフトウェアの使用またはその他の取扱いに起因するものとします。