Traffic Cardinal Traffic Cardinal написал 27.02.2024

Создаем бота для парсинга пользователей Telegram

Traffic Cardinal Traffic Cardinal написал 27.02.2024
7 мин
0
1365
Содержание

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

banner banner

Отчасти это обусловлено образом сверхприватного мессенджера. Кроме того, на это влияет и то, что Telegram все же изначально мессенджером и является. А значит — у него другая архитектура.

Тем не менее прасинг пользователей Telegram — задача вполне выполнимая. Более того, ее можно реализовать без танцев с бубном — штатными средствами самой Телеги. Как? Об этом мы и рассказали ниже.

Какие задачи решает бот для парсинга пользователей

Очевидно, что основная задача бота для парсинга — непосредственно парсинг. Но если смотреть на вопрос более приземленно, то данный бот может быть использован для следующих задач:

  • Сбор базы пользователей для последующих рассылок.

  • Анализ активности аудитории Telegram-каналов.

  • Анализ комментариев пользователей (бот парсит именно комментаторов, чем минимизирует сбор ботов и неактивных пользователей).

В целом то, как именно использовать собранную базу — упирается исключительно в вашу фантазию. Как и в случае любой другой социальной сети. Лишь бы ваше использование не нарушало законодательство.

Какие задачи не решает бот — бот не предназначен для получения исчерпывающего списка всех подписчиков. Увы, но эта информация действительно приватная и ее без танцев с бубном уже не получить. Но вот собрать активную часть подписчиков канала — более чем реально.

Принцип работы бота для парсинга пользователей Telegram

Принципиально бот довольно прост в реализации — он записывает всех, кто оставлял комментарии под указанным количеством постов. Если же рассматривать принцип его работы алгоритмически, то он делает следующее:

  1. Авторизуйтесь в профиле пользователя.
  2. Считывает указанную ссылку на канал.
  3. Анализирует заданное количество постов.
  4. Если были удаленные посты (пробелы в последовательности ИД постов) — игнорирует их и совершает добавочные итерации.
  5. Анализирует комментарии под каждым постом и создает массив ИД комментаторов.
  6. Сравнивает массив ИД с содержимым файла-лога.
  7. Фильтрует дубли и записывает только новые ИД.

Пошаговая инструкция, как создать бота для парсинга пользователей Telegram

Так как бот использует user_api, для начала вам понадобится получить api_id и api_hash, для этого:

  1. Авторизируемся в веб-версии.
  2. Жмем на «API development tools», заполняем поля.
  3. Сохраняем ваши api_id и api_hash в блокнот.

После этого настраиваем наш сервер, поддерживающий возможность развертки Python-скриптов, под работу с Telegram.

  1. Для этого вводим в его консоль следующее:

pip install asyncio

pip install telethon

  1. Затем в корневой папке создаем файл .py с любым названием. Пусть это будет parser.py
  2. Добавляем в наш файл следующий код:

from telethon.sync import TelegramClient

from telethon.tl import types

from telethon.tl.functions.messages import GetHistoryRequest

api_id = 'Замените на ваш API ID' # Замените на ваш API ID

api_hash = 'Замените на ваш API Hash' # Замените на ваш API Hash

phone_number = 'Замените на ваш номер телефона' # Замените на ваш номер телефона

channel_username = 'ЦЕЛЕВОЙ КАНАЛ'

output_file = 'output.txt'

async def main():

try:

# Инициализация клиента

client = TelegramClient('session_name', api_id, api_hash)

# Подключение к серверам Telegram

await client.connect()

# Авторизация пользователя, если необходимо

if not await client.is_user_authorized():

await client.send_code_request(phone_number)

await client.sign_in(phone_number, input('Введите код из СМС: '))

# Получаем идентификатор канала

channel = await client.get_entity(channel_username)

# Получаем последние 10 сообщений из канала (включая посты и комментарии)

messages = await client(GetHistoryRequest(

peer=channel,

limit=10,

offset_date=None,

offset_id=0,

max_id=0,

min_id=0,

add_offset=0,

hash=0

))

# Считываем существующие ИД из файла, если файл существует

existing_ids = set()

try:

with open(output_file, 'r') as file:

for line in file:

existing_ids.add(int(line.strip()))

except FileNotFoundError:

pass # Если файл не существует, игнорируем ошибку

# Список для уникальных ИД комментаторов

unique_comment_user_ids = set()

for message in messages.messages:

post_id = message.id

print(f"Post ID: {post_id}")

# Получаем комментарии к каждому посту

comment_user_ids = set()

try:

async for comment_message in client.iter_messages(channel, reply_to=post_id, reverse=True):

if isinstance(comment_message.sender, types.User):

comment_user_ids.add(comment_message.sender.id)

elif isinstance(comment_message.sender, types.Chat):

comment_user_ids.add(comment_message.sender.id)

except Exception as e:

print(f"Error while processing post ID {post_id}: {e}")

# Исключаем существующие ИД

comment_user_ids -= existing_ids

# Добавляем уникальные ИД в общий список

unique_comment_user_ids.update(comment_user_ids)

# Записываем уникальные ИД комментаторов в файл

with open(output_file, 'a') as file:

for user_id in unique_comment_user_ids:

file.write(f"{user_id}\n")

except Exception as e:

print(f"Error: {e}")

if __name__ == '__main__':

# Запуск асинхронного кода

import asyncio

asyncio.run(main())

  1. Подставляем вместо 'Замените на ваш API ID', 'Замените на ваш API Hash', 'Замените на ваш номер телефона' и 'ЦЕЛЕВОЙ КАНАЛ' — ваш api_id, api_hash, номер к которому привязан аккаунт и ссылку на целевой канал в формате t.me/channel соответственно. Кавычки НЕ УБИРАЕМ!
  2. Сохраняем файл.
  3. Запускаем бот командой:

python parser.py

  1. Авторизуем бота в Телеграме. Для этого при появлении надписи «Please enter your phone (or bot token)» вводим тот же номер, что ранее подставляли в код. После появления надписи «Please enter the code you received» вводим в консоль код из самой Телеги. Бот авторизован.

Демонстрация работы

В качестве «подопытной жертвы» мы выбрали канал МТС Банка.

Бот начал работу. Error как на скриншоте — это штатная работа бота. Так он реагирует на посты, которые отсутствуют. Вывод ошибки сделан сугубо для демонстрации отсутствия удаленных постов.

Содержимое файла output.txt. При желании можно проверить соответствие ИД комментаторов под постами с ИД со скриншота вручную. Проверку на отсутствие дублей можно проверить через Chat GPT.

Подводя итоги

Как видите, спарсерить ID пользователей Telegram из конкретного канала — задача вполне выполнимая. Да, у канала должны быть открыты комментарии. И да, вы спарсите лишь активную часть аудитории. Но для большинства задач нужен именно актив, а не «мертвые души».

Помимо всего прочего, вам никто не мешает закинуть этот код в цикл и перебирать не один канал, а сразу пачку. Почему мы не сделали это за вас? Потому что у Telegram есть лимиты обращений к API, и они не являются публичными. Без понимания того, что вы делаете хотя бы на базовом уровне, одновременный парсинг в несколько потоков, скорее всего, приведет к блокировке вашего аккаунта. Чтобы этого избежать, мы намеренно урезали эту часть функционала. Однако, обладая даже минимальным пониманием в алгоритмизации, закинуть все это дело в цикл будет несложно. А на этом у нас все.

Здравствуйте! У вас включен блокировщик рекламы, часть сайта не будет работать!