Привет Хабр! На связи лаборатория кибербезопасности компании AP Security.
В этой статье узнаем, как создать парсер Telegram на Python с использованием Telethon для осинта и сбора данных об угрозах.
Пошаговое руководство с практическими примерами.

Недавно я исследовал вопрос о влиянии ареста генерального директора Telegram Павла Дурова на незаконную криптоактивность, а именно: действительно ли воздействие на разработчиков рабочий путь борьбы с преступностью. И хотя некоторые пользователи перешли на другие платформы, ориентированные на конфиденциальность, такие как Signal, создали каналы в новых приложениях вроде SimpleX, глобально ландшафт вряд ли кардинально изменится. Telegram остается важнейшим инструментом для расследований финансовых преступлений, OSINT‑а и сбора разведданных об угрозах. Поэтому сегодня мы рассмотрим, как автоматизировать мониторинг угроз в Telegram с помощью Python.
Создавать парсер мы будем с использованием библиотеки Telethon Python. Перед изучением кода отметим, что если вы используете какую‑либо библиотеку для автоматизации действий в Telegram (или любом другом приложении), убедитесь, что вы знакомы с правилами и условиями платформы. Крайне важно не нарушать никаких правил, чтобы не заработать блокировку своего аккаунта. Я приведу отрывки из Terms of service Telegram, но вы сами должны изучить их и убедиться, что ваши действия не выходят за рамки этих правил.

А теперь давайте погрузимся в работу и приступим к коду.
Пошаговое руководство по парсингу Telegram-каналов с помощью Python и Telethon
Шаг 1: Получение API IDи API hash
-
Создайте Telegram App Для взаимодействия с API Telegram вам понадобятся API ID и API хэш. Это уникальные учетные данные, необходимые для аутентификации вашего приложения.
-
Перейдите на сайт my.telegram.org и войдите в систему, используя номер телефона, привязанный к вашей учетной записи Telegram.

3. Создайте новое приложение, заполнив необходимые данные: название приложения, краткое название и платформа. Поля URL и описание необязательны.

В результате этих действий будут сгенерированы ваши API ID и API Hash. Обязательно задайте их в качестве переменных окружения, чтобы они не попали в ваш код. Важно сохранить эти учетные данные в тайне.
Примечание: сначала у меня возникли трудности с получением API ID и API Hash. Я использовал VPN и несколько прокси‑серверов и постоянно сталкивался с сообщением об ошибке, которое в итоге привело к предупреждению «слишком много попыток, повторите попытку позже». Подождав несколько часов, я попробовал снова — на этот раз я отключил VPN, и продолжил использовать только прокси, в результате чего проблема была решена.
Шаг 2: Настройка окружения
Теперь, когда вопросы с Telegram решены, перейдем к настройке среды, где будет разрабатываться и размещаться наше приложение. К счастью, этот процесс довольно прост и не займет много времени. Для получения дополнительной информации посетите страницу Telethon на GitHub или обратитесь к официальной документации: Telethon Docs.
Создайте папку для приложения
Сначала создадим папку для хранения приложения. Я назвал ее «telegram_app». Когда папка будет создана, мы перейдем в нее и начнем работу.

Установите Python и Telethon
Далее убедитесь, что в вашей системе установлен Python. Затем выполните следующую команду, чтобы установить Telethon — специальну ю библиотеку Python 3 для взаимодействия
с API Telegram.

Шаг 3: Написание скрипта для парсинга Telegram
Для написания кода я буду использовать мой любимый редактор VS Code, но вы можете использовать любой другой, который вам больше нравится. В редакторе первым делом я создам новый файл, который назову telegram_crawler.py
.

Импортируйте необходимые пакеты
В только что созданном файле Python начните с импорта необходимых модулей и инициализации клиента Telegram с вашими учетными данными API. В первую очередь мы импортируем три пакета, которые описаны ниже:
from telethon import TelegramClient from telethon.tl.functions.channels import JoinChannelRequest import os
Безопасное хранение учетных данных API
Вместо того чтобы строго прописывать эти значения в скрипте, в целях безопасности лучше хранить их как переменные окружения. В нашем случае мы импортировали модуль os именно по этой причине.
app_api_id = os.getenv('TELEGRAM_APP_API_ID') `app_api_hash = os.getenv('TELEGRAM_APP_API_HASH')
Настройка клиента Telegram
Теперь мы можем инициализировать наш клиент Telegram, используя учетные данные API, которые мы создали на my.telegram.org и сохранили как переменные окружения.
client = TelegramClient('session', app_api_id, app_api_hash)

Создание асинхронной функции
Telethon работает асинхронно, а это значит, что вам нужно будет определять свои функции парсинга, используя синтаксис Python async def.
async def main(): # Simple example: send a message to yourself await client.send_message('me', 'We are good to go!')
Запуск сценария
Используйте метод client.loop.run_until_complete()
для запуска вашей асинхронной функции.
with client: client.loop.run_until_complete(main())

Если все настроено правильно и переменные окружения и учетные данные API в порядке, скрипт отправит сообщение на ваш собственный аккаунт Telegram.

Мой тестовый запуск прошел успешно, но, как вы можете видеть на изображении выше, мне было предложено ввести номер телефона и код, отправленный непосредственно в приложение Telegram. Как только я ввел оба параметра, скрипт сработал идеально, и я получил тестовое сообщение «We are good to go!».
Шаг 4: Вступайте в сообщества и парсите сообщения с каналов
Теперь, когда наш клиент инициализирован и тестовое сообщение успешно получено, мы готовы сделать следующий шаг. Теперь внимание переключается на определение каналов Telegram, которые мы хотим отслеживать для получения полезных данных. Существует несколько поисковых систем Telegram для подбора интересующих нас каналов, и в конце я приведу ссылки на некоторые из них. Однако для этого примера я буду использовать tlgrm.eu.

Мы автоматизируем мониторинг канала генерального директора Telegram Павла Дурова, специально отмечая все сообщения, в которых он упоминает «конфиденциальность» или «правоохранительные органы», поскольку они могут иметь отношение к текущим расследованиям. Конечно, вы можете выбрать другой канал (каналы) в зависимости от ваших потребностей в сборе информации. Гибкость этой настройки позволит вам адаптировать ее к конкретным требованиям расследования.

Вступаем в Telegram-канал
Итак, давайте присоединимся к нашему каналу, определив сначала асинхронную функцию join_channel
. Ее цель — автоматически присоединиться к указанному каналу Telegram с помощью метода JoinChannelRequest
из библиотеки Telethon. Сlient
— это инициализированный клиент Telegram, а channel_link
— это URL канала, к которому вы хотите присоединиться.
Мы используем await для отправки запроса к API Telegram на присоединение к каналу. В случае успеха скрипт печатает подтверждающее сообщение в виде голубого текста со ссылкой на канал , используя Fore.CYAN
. Если попытка не удалась, ошибка перехватывается и выводится на экран.
В функции main()
мы указываем канал (в данном случае канал Павла Дурова) и вызываем функцию join_channel()
, чтобы клиент попытался подключиться к каналу, прежде чем приступить к выполнению других задач.
async def join_channel(client, channel_link): try: await client(JoinChannelRequest(channel_link)) print(f"{Fore.CYAN}Joined channel: {channel_link}") except Exception as e: print(f"Failed to join channel: {e}") async def main(): # Define the Telegram channel link to monitor (in this case, Durov's channel) channel_link = 'https://t.me/Durov' await join_channel(client, channel_link)

Получение и отображение сообщений из канала Telegram
Далее добавим функциональность для получения и отображения сообщений из канала Telegram, к которому мы присоединились ранее.
В функции get_messages()
мы асинхронно перебираем сообщения в указанном Telegram-канале с помощью функции iter_messages()
. Мы установили ограничение в 5 сообщений. Для каждого сообщения, если оно содержит текст, скрипт форматирует его (синим цветом) и печатает разделитель (белым цветом) для наглядности.
Форматирование сообщения обрабатывается Fore.BLUE,
чтобы выделить текст сообщения, а линия дефисов обеспечивает разделение между каждым сообщением для удобства чтения.
В функции main()
, после присоединения к каналу с помощью join_channel()
, мы можем вызвать get_messages()
, чтобы получить и отобразить последние сообщения с этого канала.
async def join_channel(client, channel_link): try: await client(JoinChannelRequest(channel_link)) print(f"{Fore.CYAN}Joined channel: {channel_link}") except Exception as e: print(f"Failed to join channel: {e}") async def get_messages(client, channel, limit=5): async for message in client.iter_messages(channel, limit): if message.text: # Print the message in a structured format print(Fore.BLUE + (message.text)) # <--- we addeed stringify to format the messages print(Fore.WHITE + '------------------------------------------------------------------------------------') async def main(): # Define the Telegram channel link to monitor (in this case, Durov's channel) channel_link = 'https://t.me/Durov' await join_channel(client, channel_link)

Здесь мы добавили метод .stringify()
к выводу сообщения, чтобы отобразить его в более структурированном и читабельном формате. Вместо того чтобы выводить только текст, этот метод предоставляет подробную информацию о сообщении, такую как метаданные (идентификатор сообщения, дата, отправитель и т. д.), наряду с фактическим содержанием сообщения.

Наконец, чтобы было легче читать и следить за происходящим, мы добавили в скрипт библиотеку colorama
, чтобы вывести в терминал сообщения с цветовой кодировкой. Например, статус присоединения к каналу выводится голубым цветом (Fore.CYAN
), а содержание сообщения — синим (Fore.BLUE
). Это делает вывод визуально организованным и удобным для чтения, особенно при работе с несколькими обновлениями статуса.

Шаг 5: Собираем все вместе
Вот и все! Теперь у вас есть вся функциональность, объединенная в одном скрипте. Эта версия — только начало, но у вас есть много возможностей для творчества и дальнейшего развития. Наслаждайтесь экспериментами и развивайтесь дальше!
from telethon import TelegramClient from telethon.tl.functions.channels import JoinChannelRequest import os from colorama import Fore, Back, Style # add some color to the terminal printapp_api_id = '' app_api_hash = ''client = TelegramClient('session', app_api_id, app_api_hash)async def join_channel(client, channel_link): try: await client(JoinChannelRequest(channel_link)) print(f"{Fore.CYAN}Joined channel: {channel_link}") except Exception as e: print(f"Failed to join channel: {e}")async def get_messages(client, channel, limit=5): async for message in client.iter_messages(channel, limit): if message.text: # Print the message in a structured format print(Fore.BLUE + (message.text)) # <--- we addeed stringify to format the messages print(Fore.WHITE + '------------------------------------------------------------------------------------')async def main(): # Define the Telegram channel link to monitor (in this case, Durov's channel) channel_link = 'https://t.me/Durov' await join_channel(client, channel_link) await get_messages(client, channel_link) ##async def main(): # Simple example: send a message to yourself ## await client.send_message('me', 'We are good to go!')with client: client.loop.run_until_complete(main())
Шаг 6: Пути развития скрипта
Операционная безопасность (OpSec):
Когда вы занимаетесь парсингом каналов Telegram, поддержание высокой операционной безопасности имеет решающее значение. При необходимости используйте прокси-серверы, воздержитесь от создания незаконных или конфиденциальных каналов и всегда соблюдайте условия обслуживания Telegram и законодательство.
Обработка исключений:
Не забудьте добавить в свой скрипт надежную обработку ошибок. Вы же не хотите, чтобы он падал только потому, что вы не можете присоединиться к определенному каналу или получить доступ к определенным сообщениям. Немного дополнительных усилий здесь могут избавить вас от многих головных болей в дальнейшем.
Триггеры событий:
Вы можете поднять свой скрипт на новый уровень, добавив триггеры событий. Например, вы можете настроить его на отбор сообщений, содержащих определенные ключевые слова, или на выполнение дальнейших действий при наступлении определенного события в канале. Это придаст вашей настройке мониторинга большую гибкость и интеллектуальность.
Заключение
Выполнив эти шаги, вы получили рабочий парсер Telegram, созданный с помощью Python и Telethon. Этот инструмент может стать отличным помощником, независимо от того, собираете ли вы информацию об угрозах или просто следите за важными обсуждениями в ключевых каналах. Не останавливайтесь на достигнутом — погрузитесь в документацию Telethon и посмотрите, что еще можно сделать, чтобы ваш парсер стал еще мощнее. А если вы все еще ищете каналы для мониторинга, обратите внимание на другие инструменты поиска, такие как Teleteg, Telegago или IntelligenceX. Есть много чего интересного, и теперь у вас есть инструменты для этого!
Хотите следить за новыми материалами и новостями из мира информационной безопасности? В Telegram‑канале AP Security Вы найдёте большое количество материалов по наступательной безопасности, защите корпоративной сети, компьютерной криминалистике, а также статьи, созданные командой лаборатории кибербезопасности компании AP Security. |
ссылка на оригинал статьи https://habr.com/ru/articles/900462/
Добавить комментарий