
Python으로 작성된 텔레그램 대규모 감시 봇

Informer (TGInformer)는 텔레그램에서 여러 실제 사용자인 것처럼 위장할 수 있는 봇 라이브러리로서, 계정당 500개 이상의 텔레그램 채널을 감시할 수 있습니다. 세부 정보는 MySQL 데이터베이스, 비공개 Google 시트, 그리고 분석을 위한 개인 채널에 기록됩니다.
이는 알려진 버그가 있는 작동하는 개념 증명 프로젝트입니다. 자유롭게 포크하고 공유해 주시고 연락 주세요.



키워드 필터링을 위한 정규 표현식 지원
SQLAlchemy를 사용한 데이터베이스 독립적 데이터 저장

메시지 및 채널 컨텍스트 데이터를 개인 채널과 데이터베이스에 로깅
메시지 발신자, 채널, 채널 참여자 수 등 메타 정보 저장


참여한 채널의 세션 유지
한 번 로그인하면 2FA 재인증 없이 봇이 영구적으로 로그인 유지
계정당 최대 500개 채널 참여

Informer에 필요한 모든 환경 변수가 포함된 informer.env 파일을 편집하세요.
필요한 텔레그램 관련 정보는 여기서 가져올 수 있습니다:
https://my.telegram.org/auth로 이동하여 전화번호와 전화(또는 텔레그램)로 전송된 확인 코드를 제공하여 계정을 인증합니다.


인증되면 "API Development Tools"를 클릭합니다.

아래 양식을 작성하여 새 애플리케이션을 만듭니다.

이제 informer.env 파일의 TELEGRAM_API_HASH 및 TELEGRAM_API_APP_ID 필드에 필요한 매개변수 값이 준비되었습니다.

TELEGRAM_ACCOUNT_PHONE_NUMBER를 포함한 값을 바꾸고 다음 섹션으로 넘어갑니다.
지금까지 Telethon과 Informer가 텔레그램 API에 접근하는 데 필요한 것을 얻었습니다. 다음으로 봇 계정의 식별자를 가져와야 합니다.
userinfobot 사용자를 검색합니다.


텔레그램 사용자 이름과 텔레그램 계정 ID를 받게 됩니다. 이는 중요합니다.

informer.env 파일을 편집하고 TELEGRAM_ACCOUNT_ID 값(이전 단계의 텔레그램 계정 ID)과 TELEGRAM_ACCOUNT_USER_NAME을 채웁니다.선택적으로 TELEGRAM_NOTIFICATIONS_CHANNEL_ID에 사용자 이름 또는 채널 ID를 입력할 수 있습니다.
TELEGRAM_ACCOUNT_PHONE_NUMBER가 작성되었는지 확인하세요. 이것이 세션 생성의 핵심입니다. 여러 계정을 생성하려면 아래 Burner App을 확인하세요.Python 3을 실행 중인지 확인하고 디렉토리에서 ./quick_start.sh를 실행하기만 하면 됩니다.
처음 실행 시 텔레그램으로 인증하고 로컬 세션 파일을 생성하려면 먼저 이 작업을 수행해야 합니다.
나중에 app/session에 다른 계정의 파일을 복사하고 원한다면 Docker를 통해 마운트할 수 있습니다.

이전에 로그인한 적이 있으면 텔레그램을 통해, 그렇지 않으면 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를 실행하여 고아 컨테이너와 볼륨을 제거합니다. 참고: 이렇게 하면 데이터베이스가 RESET되어 모든 데이터가 손실됩니다.
참고 사항:
이전에는 자체 MySQL 인스턴스를 실행해야 했으며, 이로 인해 연결 문자열 호환성 및 버전 문제가 발생했습니다. 이번 업데이트에서는 인스턴스가 자동으로 생성되고 디스크에 유지됩니다.
또한 Dozzle이 제공되어 브라우저에서 로그를 볼 수 있습니다. http://localhost:9999로 이동하여 app_informer 컨테이너를 클릭하면 됩니다.
자신의 전화번호를 사용하지 않고 어느 정도 익명성을 가지고 Informer 봇을 실행하려면 iOS 및 Android에서 사용 가능한 Burner App을 사용할 수 있습니다.
Burner 앱 설치

위와 동일한 단계를 따라 여기에 새 전화번호를 제공합니다: https://my.telegram.org/auth
Burner로 인증합니다. SMS를 통해 인증 코드가 전송되며, 이를 제공해야 합니다.

텔레그램에 로그인합니다.
app 디렉토리에서 python3 bot.py <api_user_id>를 실행하여 앱으로 로그인을 시도합니다.
Telethon으로 로그인하므로 이전처럼 터미널에 인증 코드를 요청할 것입니다.
이는 텔레그램 메시지 또는 SMS를 통해 전송되었습니다.
이것을 제공하면 아래 언급된 세션 파일에 세션 자격 증명이 저장됩니다. 세션 파일이 저장되어 있는 한 더 이상 인증할 필요가 없습니다.
세션은 app/session/ 폴더에 <telegram_phone_number>.session으로 저장됩니다.
필요한 모든 세션 파일을 얻을 때까지 반복하고 Docker에 마운트하기만 하면 됩니다.
계정을 확장하는 방법을 알아내는 것은 약간의 악몽이었습니다. 자동화된 프로세스가 필요했기 때문입니다. 텔레그램은 짧은 코드로 문자를 받을 수 있는 실제 전화번호를 요구합니다.
불행히도 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의 텔레그램 클라이언트 SDK (Telethon: https://docs.telethon.dev/en/latest/)를 통해 모두 인증할 수 있습니다.
가장 좋은 점은 Burner 번호가 14일 동안 무료라는 것입니다. 클라이언트 API를 통해 연결된 텔레그램 계정은 한 번만 로그인하면 세션이 영구적으로 유지됩니다. Burner API와 통합하지는 않았지만, 과정은 간단합니다.
봇은 Telethon Python SDK (https://docs.telethon.dev/en/latest/) 위에 구축되었습니다.
이 개념 증명을 구축하면서 발견한 몇 가지 참고 사항과 문제점:
FloodWaitErrors는 API에 너무 많은 요청을 보낼 때 발생할 수 있습니다. 사용자 정보를 조회하거나 너무 많은 채널에 너무 빨리 가입하는 경우 등입니다.
TelegramClient(<session_file_name>, <api_user_id>, <api_user_hash>)
이 파일은 SQLite 데이터베이스이며 연결할 수 있습니다. 캐시 역할을 하며 기록 데이터와 세션 인증 정보를 저장하므로 텔레그램의 2FA를 다시 인증할 필요가 없습니다. API를 처음 사용할 때는 처음 로그인하여 인증해야 합니다.
봇이 실행되고 채널에 가입하면 클라이언트가 실시간으로 업데이트되고 새로 가입한 채널이 표시됩니다.

팁: TelegramX는 다중 로그인을 지원하므로 이러한 목적에 가장 적합한 클라이언트입니다. 여기서 다운로드하세요:
참고: Google Sheets 통합은 완전히 선택 사항입니다. 애플리케이션은 MySQL 데이터베이스만으로도 완벽하게 작동합니다.
Google Sheets 로깅을 활성화하려면:
app/credentials/README.md의 자세한 설정 가이드를 따르세요.간단한 개요:
app/credentials/google_credentials.json에 배치이는 선택 사항이며 봇은 이것 없이도 작동합니다.
bot.py를 두 번 실행해야 할 것입니다. 한 번은 채널에 가입하게 하고, 다른 한 번은 모니터링하게 합니다. 이 명백한 버그를 인지하고 있으며 다음 수정 버전에서 수정할 예정입니다.이 프로젝트가 흥미로웠나요? 그렇다면 별표를 눌러주세요.
암호화폐 업계의 친구를 위해 이틀 만에 개념 증명으로 만들었습니다. 흥미롭거나 수익성 있는 응용 프로그램을 찾으셨다면, 언제든지 협업할 의향이 있습니다. 다음 주소로 연락 주세요:
Twitter의 @paulpierre 또는 hi (at) paulpierre (dot) com
제 흥미로운 프로젝트의 대부분은 github에서 비공개이지만, http://www.github.com/paulpierre 또는 과거 작업은 http://www.paulpierre.com에서 확인하실 수 있습니다.
Copyright (c) 2020 Paul Pierre Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in allcopies or substantial portions of the Software. THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.