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

Создаем Telegram-бот для розыгрышей за подписку

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

Наверняка вы видели конкурсы в стиле «подпишись на всех спонсоров и выиграй что-то там». Сегодня мы расскажем, как создать бота для проведения таких конкурсов на Python своими руками, без использования сторонних сервисов и конструкторов. Фактически вы сможете просто скопировать исходный код, залить его на хостинг, и у вас будет свой собственный бот.

banner banner

* Спойлер: исходный код Telegram-бота для розыгрышей за подписку находится в конце статьи.

Какие задачи решает Telegram-бот для розыгрышей

Как понятно из названия, бот для розыгрышей за подписку позволяет проводить конкурсы и продвигать с их помощью Telegram-каналы. Однако, кроме этого, у бота есть еще пара полезных фич, а именно:

  • Возможность сбора базы пользователей — в текущем виде бот сохраняет ID лишь тех пользователей, которые подписаны на все указанные каналы. Однако никто не мешает немного доработать его и сохранять ID всех юзеров, которые с ним взаимодействовали.

  • Возможность продажи мест в списке спонсоров — хоть технически бот никак не связан с продажами, его функционал позволяет предлагать потенциальным реклам место в списке спонсоров.

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

Впрочем, это лирика — перейдем к алгоритму.

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

На человеческом языке алгоритм бота устроен следующим образом:

  1. Бот прослушивает свои ЛС, отвечая на сообщения пользователей.
  2. После получения сообщения от пользователя бот загружает список спонсорских каналов из файла channels.txt.
  3. Бот поочередно проверяет наличие пользователя среди подписчиков, администраторов или создателей в каждом канале из файла.
  4. Если пользователь не подписан на один или более каналов из списка, бот выдает сообщение «Ты не молодец» и предлагает подписаться на каналы.
  5. Если пользователь подписан на все каналы, бот выдает сообщение «Ты молодец», проверяет наличие 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. Запустить бот и проверить функционал.

Фразы бота представлены для общего ознакомления. Рекомендуем заменить их на свои.

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

Пишем боту сообщение. Так как мы не подписаны — он выдает «Ты не молодец» и призывает подписаться на каналы
Пишем боту сообщение. Так как мы не подписаны — он выдает «Ты не молодец» и призывает подписаться на каналы

Подпишемся на два канала из трех. Пишем снова. Бот все еще не считает нас «молодцом». В файле users.txt новых записей нет — так как условие конкурса не выполнено, а значит, мы еще не являемся участником.
Подпишемся на два канала из трех. Пишем снова. Бот все еще не считает нас «молодцом». В файле users.txt новых записей нет — так как условие конкурса не выполнено, а значит, мы еще не являемся участником.

Подписываемся на все каналы. Пишем боту еще раз. Бот выдает сообщение «Ты молодец!» и добавляет нас в список участников конкурса
Подписываемся на все каналы. Пишем боту еще раз. Бот выдает сообщение «Ты молодец!» и добавляет нас в список участников конкурса

Исходный код Telegram-бота для проведения розыгрышей

https://disk.yandex.ru/d/bqiIqD8iHqBL7w

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

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

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