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

Создание бота для парсинга конкурсов в Telegram

Traffic Cardinal Traffic Cardinal написал 06.11.2024
6 мин
0
569
Содержание

Вы наверняка много раз слышали от коллег по цеху, что они что-то выиграли в очередном конкурсе. А может, даже выигрывали сами. Получить iPhone или другой приз за подписку всегда приятно.

banner banner

Тем более что в арбитраже 99% таких розыгрышей — настоящие. Да и проводят их довольно часто, если оценивать температуру в среднем по больнице, так сказать. Но не мониторить же теперь ради этого все каналы 24/7?

Конечно, нет — куда проще поручить парсинг таких постов боту. О том, как его создать, мы и расскажем сегодня. Спойлер: ближе к концу статьи мы дадим наводку на конкурс, в котором можно выиграть iPhone 16 Pro Max.

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

Данный бот может быть использован для:

  • частичной автоматизации участия в конкурсах;

  • поиска по ключевым словам;

  • мгновенного получения инфы по интересующим темам.

Кстати, два последних пункта — это фича. Изначально бот задуман именно как парсер конкурсов, но какая разница, что парсить?

Принцип работы бота для парсинга конкурсов

Алгоритмически парсер реализован по следующему принципу:

  1. Бот «прослушивает эфир» и реагирует на новые посты.
  2. После получения от Телеги информации о новом посте считывает файлы words.txt и button.txt.
  3. Если 2-я строка в файле YES — использует его, если NO — не использует.
  4. Если в содержимом поста есть фразы, совпадающие с фразами в файлах, — бот делает репост в избранное.

Как видите, ничего сложного.

* Для отсечения возможного мусора советуем после запуска отключить файл words.txt, заменив YES на NO. В этом случае бот будет искать только совпадения в кнопках, игнорируя содержимое постов.

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

С точки зрения программной реализации бот для парсинга конкурсов не является классическим Telegram-ботом. Это скорее юзер-бот, автоматизирующий взаимодействие с Телегой. Поэтому для его работы требуется доступ к юзер-api, через получение api_id и api_hash.

Чтобы это сделать, нужно:

  1. Открыть страницу разработчиков в веб-версии.
  2. Найти раздел в «API development tools» и заполнить соответствующие поля.
  3. Скопировать выданные Телегой api_id и api_hash.
    Следующий шаг — настройка сервера, где будет обрабатываться код бота. Настраиваем сервер. Если своего Python-сервера у вас нет, есть бесплатное решение по этой ссылке. Если сервер уже готов, для настройки следуйте инструкции ниже.
  4. Открываем консоль и вводим:
    pip install asyncio
    pip install telethon
    pip install os

  5. Создаем текстовый файл и сохраняем как bot.py вставляем в него:
    import os
    from telethon import TelegramClient, events
    import re
    api_id = 'api_id сюда'
    api_hash = 'api_hash сюда'
    phone_number = 'ваш номер'
    favorite_chat_id = 'me'
    service_line = "#Используй YES во второй строке, чтобы включить поиск, NO чтобы выключить. Каждую фразу пишите с новой строки."
    valid_switches = ['YES', 'NO']
    def load_keywords(filename, default_word):
    if not os.path.exists(filename):
    with open(filename, 'w') as f:
    f.write(service_line + '\nYES\n' + default_word + '\n')
    with open(filename, 'r') as f:
    lines = [line.strip() for line in f.readlines()]
    if len(lines) == 0 or lines[0] != service_line:
    lines.insert(0, service_line)
    if len(lines) < 2 or lines[1] not in valid_switches:
    lines.insert(1, 'YES')
    with open(filename, 'w') as f:
    f.write('\n'.join(lines) + '\n')
    search_flag = lines[1] == 'YES'
    keywords = [line.lower() for line in lines[2:]]
    return search_flag, keywords
    client = TelegramClient(phone_number, api_id, api_hash)
    def get_button_text(reply_markup):
    buttons_text = []
    if reply_markup:
    for row in reply_markup.rows:
    for button in row.buttons:
    buttons_text.append(button.text)
    return buttons_text
    def has_keyword(text, keywords):
    text_cleaned = re.sub(r'[^\w\s]', '', text.lower())
    return any(keyword in text_cleaned for keyword in keywords)
    @client.on(events.NewMessage)
    async def handler(event):
    search_in_message, message_keywords = load_keywords('words.txt', 'конкурс')
    search_in_button, button_keywords = load_keywords('button.txt', 'участвую')
    message_text = event.raw_text
    buttons_text = get_button_text(event.message.reply_markup)
    message_has_keyword = False
    button_has_keyword = False
    if search_in_message and has_keyword(message_text, message_keywords):
    print(f"Сообщение с ключевыми словами найдено в тексте сообщения!")
    message_has_keyword = True
    if search_in_button and any(has_keyword(button, button_keywords) for button in buttons_text):
    print(f"Сообщение с ключевыми словами найдено в кнопках!")
    button_has_keyword = True
    if message_has_keyword or button_has_keyword:
    await client.forward_messages(favorite_chat_id, event.message)
    print("Сообщение переслано в избранное!")
    async def main():
    await client.start(phone_number)
    print("Бот запущен и ждет сообщений...")
    await client.run_until_disconnected()
    with client:
    client.loop.run_until_complete(main())
  6. Заменяем api_id сюда, api_hash сюда и ваш номер своими значениями.
  7. Сохраняем бот.
  8. Запускаем его.
  9. Видим, что в корневой папке появились файлы words.txt и button.txt — вносим в них слова, которые будут использоваться для поиска. Каждое слово с новой строки. С помощью YES/NO переключаем использование файла.
    Файл button.txt отвечает за поиск по содержимому кнопок, words.txt — за поиск по содержимому самих постов.
    Файл button.txt отвечает за поиск по содержимому кнопок, words.txt — за поиск по содержимому самих постов.
  10. Проверяем работу.

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

Стартовые настройки на момент начала тестов
Стартовые настройки на момент начала тестов

Для проверки работоспособности написали соответствующие посты в тестовых каналах — все работает. Отключаем поиск по содержимому, чтобы не копаться в мусоре
Для проверки работоспособности написали соответствующие посты в тестовых каналах — все работает. Отключаем поиск по содержимому, чтобы не копаться в мусоре

За 5 минут работы бот подхватил 3 конкурса — 2 арбитражных и один не связанный с трафиком. В целом, учитывая, что для тестов использовалось всего 4 варианта текста на кнопке, неплохо. Но советуем выписывать все варианты, которые заметите, — у каждого канала своя стилистика.

P. S. А еще в процессе тестов автор заметил конкурс от Traffic Caridnal и BROCONF (крайний правый скриншот). Не забудьте залететь в него — ведь итоги будут уже совсем скоро. Кстати, говорят, что на Cardinal Conf 2 iPhone 16 Pro Max будут разыгрывать 🤫 — так что обязательно следите за нашим Telergam-каналом, чтобы не пропустить розыгрыш. Тем более что парсер конкурсов у вас уже есть.

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