Python для OSINT в Telegram: автоматизация Threat intelligence

от автора

Привет Хабр! На связи лаборатория кибербезопасности компании AP Security.

В этой статье узнаем, как создать парсер Telegram на Python с использованием Telethon для осинта и сбора данных об угрозах.

Пошаговое руководство с практическими примерами.

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

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

На этом изображении показан фрагмент из документации Telethon, в котором говорится о важности обеспечения соответствия Условиям пользования Telegram при разработке приложений

На этом изображении показан фрагмент из документации Telethon, в котором говорится о важности обеспечения соответствия Условиям пользования Telegram при разработке приложений

А теперь давайте погрузимся в работу и приступим к коду.

Пошаговое руководство по парсингу Telegram-каналов с помощью Python и Telethon

Шаг 1: Получение API IDи API hash

  1. Создайте Telegram App Для взаимодействия с API Telegram вам понадобятся API ID и API хэш. Это уникальные учетные данные, необходимые для аутентификации вашего приложения.

  2. Перейдите на сайт my.telegram.org и войдите в систему, используя номер телефона, привязанный к вашей учетной записи Telegram.

На изображении показана панель учетных записей Telegram, предлагающая ссылки для доступа к инструментам разработки, удаления учетной записи

На изображении показана панель учетных записей Telegram, предлагающая ссылки для доступа к инструментам разработки, удаления учетной записи

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

В результате этих действий будут сгенерированы ваши API ID и API Hash. Обязательно задайте их в качестве переменных окружения, чтобы они не попали в ваш код. Важно сохранить эти учетные данные в тайне.

Примечание: сначала у меня возникли трудности с получением API ID и API Hash. Я использовал VPN и несколько прокси‑серверов и постоянно сталкивался с сообщением об ошибке, которое в итоге привело к предупреждению «слишком много попыток, повторите попытку позже». Подождав несколько часов, я попробовал снова — на этот раз я отключил VPN, и продолжил использовать только прокси, в результате чего проблема была решена.

Шаг 2: Настройка окружения

Теперь, когда вопросы с Telegram решены, перейдем к настройке среды, где будет разрабатываться и размещаться наше приложение. К счастью, этот процесс довольно прост и не займет много времени. Для получения дополнительной информации посетите страницу Telethon на GitHub или обратитесь к официальной документации: Telethon Docs.

Создайте папку для приложения

Сначала создадим папку для хранения приложения. Я назвал ее «telegram_app». Когда папка будет создана, мы перейдем в нее и начнем работу.

На изображении показан терминал операционной системы Linux, в котором создаётся директория «telegram_app» командой mkdir, а затем осуществляется переход в нее с помощью команды cd.

На изображении показан терминал операционной системы Linux, в котором создаётся директория «telegram_app» командой mkdir, а затем осуществляется переход в нее с помощью команды cd.

Установите Python и Telethon

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

На изображении показан терминальный сеанс, в котором пользователь проверяет версию Python ( на изображении она 3.10.12) и устанавливает библиотеку Telethon с помощью команды pip install telethon, зелёная полоса означает процесс установки.

На изображении показан терминальный сеанс, в котором пользователь проверяет версию Python ( на изображении она 3.10.12) и устанавливает библиотеку Telethon с помощью команды pip install telethon, зелёная полоса означает процесс установки.

Шаг 3: Написание скрипта для парсинга Telegram

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

На изображении показан терминал, в котором пользователь создает с помощью команды touch новый Python-файл с именем «telegram_crawler.py» , в котором будет написан код парсера Telegram.

На изображении показан терминал, в котором пользователь создает с помощью команды touch новый Python-файл с именем «telegram_crawler.py» , в котором будет написан код парсера Telegram.

Импортируйте необходимые пакеты

В только что созданном файле 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)
На изображении показан Python-скрипт в Visual Studio Code, в котором пользователь импортирует Telethon и создает клиента Telegram, используя учетные данные API, сохраненные в переменных окружения, тем самым подготавливая скрипт к взаимодействию с каналами Telegram.

На изображении показан Python-скрипт в Visual Studio Code, в котором пользователь импортирует Telethon и создает клиента Telegram, используя учетные данные API, сохраненные в переменных окружения, тем самым подготавливая скрипт к взаимодействию с каналами Telegram.

Создание асинхронной функции

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())
На изображении показан скрипт на Python в Visual Studio Code, в котором пользователь инициализирует клиент Telegram с помощью Telethon, определяет асинхронную функцию для отправки сообщения самому себе и запускает скрипт с помощью `client.loop.

На изображении показан скрипт на Python в Visual Studio Code, в котором пользователь инициализирует клиент Telegram с помощью Telethon, определяет асинхронную функцию для отправки сообщения самому себе и запускает скрипт с помощью `client.loop.

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

На изображении показан процесс успешного выполнения Python-скрипта, при котором выполняется отправка сообщения на аккаунт Telegram, а в терминале справа появляется запрос на ввод кода для входа, а также напоминание  об условиях предоставления услуг Telegram.

На изображении показан процесс успешного выполнения Python-скрипта, при котором выполняется отправка сообщения на аккаунт Telegram, а в терминале справа появляется запрос на ввод кода для входа, а также напоминание об условиях предоставления услуг Telegram.

Мой тестовый запуск прошел успешно, но, как вы можете видеть на изображении выше, мне было предложено ввести номер телефона и код, отправленный непосредственно в приложение Telegram. Как только я ввел оба параметра, скрипт сработал идеально, и я получил тестовое сообщение «We are good to go!».

Шаг 4: Вступайте в сообщества и парсите сообщения с каналов

Теперь, когда наш клиент инициализирован и тестовое сообщение успешно получено, мы готовы сделать следующий шаг. Теперь внимание переключается на определение каналов Telegram, которые мы хотим отслеживать для получения полезных данных. Существует несколько поисковых систем Telegram для подбора интересующих нас каналов, и в конце я приведу ссылки на некоторые из них. Однако для этого примера я буду использовать tlgrm.eu.

На изображении показана веб-страница tlgrm.eu со строкой поиска, где пользователи могут найти интересные каналы используя поиск по названиям, описаниям или ключевым словам, а также по опциями категорий.

На изображении показана веб-страница tlgrm.eu со строкой поиска, где пользователи могут найти интересные каналы используя поиск по названиям, описаниям или ключевым словам, а также по опциями категорий.

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

На изображении показан результат поиска по  Telegram-каналу Павла Дурова , в котором пользователи могут подписаться на посты о его путешествиях и впечатлениях, с возможностью просмотра последних или популярных постов.

На изображении показан результат поиска по 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, подтверждающий, что пользователь присоединился к «Du Rove’s Channel», а также продемонстрирован сценарий Python, использующий метод JoinChannelRequest в Telethon, чтобы присоединиться к каналу с помощью кода.

На изображении показан интерфейс Telegram, подтверждающий, что пользователь присоединился к «Du Rove’s Channel», а также продемонстрирован сценарий Python, использующий метод JoinChannelRequest в Telethon, чтобы присоединиться к каналу с помощью кода.

Получение и отображение сообщений из канала 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)
На изображении показано сообщение Telegram из «Du Rove’s Channel» и сценарий Python, использующий Telethon для подключения к каналу и получения сообщений с отображением метаданных сообщения в терминале.

На изображении показано сообщение Telegram из «Du Rove’s Channel» и сценарий Python, использующий Telethon для подключения к каналу и получения сообщений с отображением метаданных сообщения в терминале.

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

На изображении показано сообщение из «Du Rove’s Channel» в Telegram и сценарий Python, который использует библиотеку Telethon для подключения к каналу и получения сообщений. Сценарий применяет метод .stringify() для вывода информации о сообщении, включая метаданные, в структурированном формате.

На изображении показано сообщение из «Du Rove’s Channel» в Telegram и сценарий Python, который использует библиотеку Telethon для подключения к каналу и получения сообщений. Сценарий применяет метод .stringify() для вывода информации о сообщении, включая метаданные, в структурированном формате.

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

На изображении слева показано сообщение Telegram из «Du Rove’s Channel», а справа - скрипт на Python, использующий Telethon для подключения к каналу и сбора сообщений, с цветовой кодировкой вывода терминала для наглядного отображения обновлений статуса и деталей сообщения.

На изображении слева показано сообщение Telegram из «Du Rove’s Channel», а справа — скрипт на Python, использующий Telethon для подключения к каналу и сбора сообщений, с цветовой кодировкой вывода терминала для наглядного отображения обновлений статуса и деталей сообщения.

Шаг 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/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *