Наверняка вы видели конкурсы в стиле «подпишись на всех спонсоров и выиграй что-то там». Сегодня мы расскажем, как создать бота для проведения таких конкурсов на Python своими руками, без использования сторонних сервисов и конструкторов. Фактически вы сможете просто скопировать исходный код, залить его на хостинг, и у вас будет свой собственный бот.
* Спойлер: исходный код Telegram-бота для розыгрышей за подписку находится в конце статьи.
Какие задачи решает Telegram-бот для розыгрышей
Как понятно из названия, бот для розыгрышей за подписку позволяет проводить конкурсы и продвигать с их помощью Telegram-каналы. Однако, кроме этого, у бота есть еще пара полезных фич, а именно:
Возможность сбора базы пользователей — в текущем виде бот сохраняет ID лишь тех пользователей, которые подписаны на все указанные каналы. Однако никто не мешает немного доработать его и сохранять ID всех юзеров, которые с ним взаимодействовали.
Возможность продажи мест в списке спонсоров — хоть технически бот никак не связан с продажами, его функционал позволяет предлагать потенциальным реклам место в списке спонсоров.
Парсинг данных — так как все подобные Telegram-боты требуют наличия прав администратора для проверки подписчиков, то чисто технически с его помощью можно собирать статистическую информацию из спонсорских каналов. Однако учтите, что несанкционированное использование и тем более обнародование такой информации в лучшем случае испортит вашу репутацию. А в худшем может обернуться проблемами с законом.
Впрочем, это лирика — перейдем к алгоритму.
Принцип работы Telegram-бота для проведения розыгрышей
На человеческом языке алгоритм бота устроен следующим образом:
- Бот прослушивает свои ЛС, отвечая на сообщения пользователей.
- После получения сообщения от пользователя бот загружает список спонсорских каналов из файла channels.txt.
- Бот поочередно проверяет наличие пользователя среди подписчиков, администраторов или создателей в каждом канале из файла.
- Если пользователь не подписан на один или более каналов из списка, бот выдает сообщение «Ты не молодец» и предлагает подписаться на каналы.
- Если пользователь подписан на все каналы, бот выдает сообщение «Ты молодец», проверяет наличие ID пользователя в файле users.txt и записывает ID, если его еще нет в этом файле.
Для удобства в боте реализована кнопка «Готово», однако отдельно рассматривать алгоритм ее работы применительно к задаче «провести конкурс» нецелесообразно — по сути, реакция бота будет такой же, как и на любой другой текст. Просто нажать на кнопку многим пользователями удобнее — поэтому мы добавили и ее.
Пошаговая инструкция, как создать Telegram-бот для проведения розыгрышей своими руками
Создание Telegram-бота для розыгрышей максимально простое, если сравнивать с прочими Telegram-ботами, достаточно лишь:
1. Авторизоваться на pythonanywhere (либо другом хостинге, поддерживающем работу с Python).
2. Запустить Bash-консоль, дождаться настройки сервера.
3. Подключиться к API Telegram с помощью модуля pyTelegramBotAPI, для этого в консоль вводим:
pip3.9 install --user pyTelegramBotAPI
4. Получить токен для своего бота. Нужно лишь написать официальному боту Telegram @BotFather и следовать его инструкции.
5. Загрузить на хостинг файл bot.py со следующим кодом, предварительно заменив фразу ТОКЕН СЮДА на свой токен, полученный в @BotFather:
import telebot
from telebot import types
bot = telebot.TeleBot('ТОКЕН СЮДА')
def read_channel_ids(file_path):
with open(file_path, 'r') as file:
channel_ids = [int(line.strip()) for line in file]
return channel_ids
def save_user_id(user_id, file_path):
with open(file_path, 'r') as file:
existing_ids = [int(line.strip()) for line in file]
if user_id not in existing_ids:
with open(file_path, 'a') as file:
file.write(str(user_id) + '\n')
chan_ids = read_channel_ids('channels.txt')
def check_channels_verified(user_id):
i = 0
all_channels_verified = True
while i < len(chan_ids):
member = bot.get_chat_member(chat_id=chan_ids[i], user_id=user_id)
statuses = ('creator', 'administrator', 'member')
if member.status not in statuses:
all_channels_verified = False
break
i += 1
return all_channels_verified
def send_verification_message(chat_id, all_channels_verified):
markup = types.InlineKeyboardMarkup()
btn1 = types.InlineKeyboardButton("Готово", callback_data='good')
if all_channels_verified:
bot.send_message(chat_id, 'Ты молодец!') # можно заменить на свой текст
save_user_id(chat_id, 'users.txt') # Сохранение идентификатора пользователя
else:
bot.send_message(chat_id, 'Ты не молодец!') # можно заменить на свой текст
markup.add(btn1)
bot.send_message(chat_id, "Подпишись на каналы:\n@TESTtrafficcardinal\n@TESTtrafficcardinal2\n@TESTtrafficcardinal3", reply_markup=markup) # можно заменить на свой текст
@bot.message_handler(content_types=["text"])
def handle_text(message):
all_channels_verified = check_channels_verified(message.from_user.id)
send_verification_message(message.chat.id, all_channels_verified)
@bot.callback_query_handler(func=lambda call: call.data == 'good')
def handle_callback(call):
all_channels_verified = check_channels_verified(call.from_user.id)
send_verification_message(call.message.chat.id, all_channels_verified)
bot.polling()
6. Добавить бота в администраторы продвигаемых каналов.
7. Добавить ID продвигаемых каналов в файл channels.txt. Каждый канал — с новой строки.
8. Создать файл users.txt.
9. Загрузить файлы channels.txt и users.txt в корень хостинга.
10. Запустить бот и проверить функционал.
Фразы бота представлены для общего ознакомления. Рекомендуем заменить их на свои.
Демонстрация работы бота
Исходный код Telegram-бота для проведения розыгрышей
https://disk.yandex.ru/d/bqiIqD8iHqBL7w
Подводя итоги
Как видите, проводить конкурсы за подписку с помощью Telegram-бота проще, чем кажется. Для этого вовсе не обязательно добавлять в свои каналы чужих ботов, сливать им свою стату и рисковать угоном канала.