Вы наверняка много раз слышали от коллег по цеху, что они что-то выиграли в очередном конкурсе. А может, даже выигрывали сами. Получить iPhone или другой приз за подписку всегда приятно.
Тем более что в арбитраже 99% таких розыгрышей — настоящие. Да и проводят их довольно часто, если оценивать температуру в среднем по больнице, так сказать. Но не мониторить же теперь ради этого все каналы 24/7?
Конечно, нет — куда проще поручить парсинг таких постов боту. О том, как его создать, мы и расскажем сегодня. Спойлер: ближе к концу статьи мы дадим наводку на конкурс, в котором можно выиграть iPhone 16 Pro Max.
Какие задачи решает бот для парсинга конкурсов
Данный бот может быть использован для:
частичной автоматизации участия в конкурсах;
поиска по ключевым словам;
мгновенного получения инфы по интересующим темам.
Кстати, два последних пункта — это фича. Изначально бот задуман именно как парсер конкурсов, но какая разница, что парсить?
Принцип работы бота для парсинга конкурсов
Алгоритмически парсер реализован по следующему принципу:
- Бот «прослушивает эфир» и реагирует на новые посты.
- После получения от Телеги информации о новом посте считывает файлы words.txt и button.txt.
- Если 2-я строка в файле YES — использует его, если NO — не использует.
- Если в содержимом поста есть фразы, совпадающие с фразами в файлах, — бот делает репост в избранное.
Как видите, ничего сложного.
* Для отсечения возможного мусора советуем после запуска отключить файл words.txt, заменив YES на NO. В этом случае бот будет искать только совпадения в кнопках, игнорируя содержимое постов.
Пошаговая инструкция, как создать бота для парсинга конкурсов в Telegram
С точки зрения программной реализации бот для парсинга конкурсов не является классическим Telegram-ботом. Это скорее юзер-бот, автоматизирующий взаимодействие с Телегой. Поэтому для его работы требуется доступ к юзер-api, через получение api_id и api_hash.
Чтобы это сделать, нужно:
- Открыть страницу разработчиков в веб-версии.
- Найти раздел в «API development tools» и заполнить соответствующие поля.
- Скопировать выданные Телегой api_id и api_hash.
Следующий шаг — настройка сервера, где будет обрабатываться код бота. Настраиваем сервер. Если своего Python-сервера у вас нет, есть бесплатное решение по этой ссылке. Если сервер уже готов, для настройки следуйте инструкции ниже.
- Открываем консоль и вводим:
pip install asyncio
pip install telethon
pip install os - Создаем текстовый файл и сохраняем как 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()) - Заменяем api_id сюда, api_hash сюда и ваш номер своими значениями.
- Сохраняем бот.
- Запускаем его.
- Видим, что в корневой папке появились файлы words.txt и button.txt — вносим в них слова, которые будут использоваться для поиска. Каждое слово с новой строки. С помощью YES/NO переключаем использование файла.
- Проверяем работу.
Демонстрация работы
За 5 минут работы бот подхватил 3 конкурса — 2 арбитражных и один не связанный с трафиком. В целом, учитывая, что для тестов использовалось всего 4 варианта текста на кнопке, неплохо. Но советуем выписывать все варианты, которые заметите, — у каждого канала своя стилистика.
P. S. А еще в процессе тестов автор заметил конкурс от Traffic Caridnal и BROCONF (крайний правый скриншот). Не забудьте залететь в него — ведь итоги будут уже совсем скоро. Кстати, говорят, что на Cardinal Conf 2 iPhone 16 Pro Max будут разыгрывать 🤫 — так что обязательно следите за нашим Telergam-каналом, чтобы не пропустить розыгрыш. Тем более что парсер конкурсов у вас уже есть.