Найти в Дзене
Записки сисадмина

Python. Telegram bot. Добавление пользователей в канал.

Периодически, подавая заявки в закрытые телеграм каналы, мне тут же писали боты. Но ведь я знаю, что бот не может начать диалог с пользователем (из соображений безопасности). Так почему у этих ботов есть возможность писать мне? И как создать себе такого же бота? chat_join_request_handler - Обрабатывает запрос на вступление в чат. Бот должен иметь права администратора can_invite_users в чате, чтобы получать такие апдейты. В качестве параметра передаёт в декорируемую функцию объект telebot.types.ChatJoinRequest. Здесь нас интересует только два параметра: id пользователя, который отправил запрос и id канала, в который пользователь пытается войти. @bot.chat_join_request_handler() def request_message(message): channel_id = message.chat.id user_id = message.user_chat_id Теперь наш бот видит все уведомления о заявках на вступление в канал. Также бот получает возможность написать первым пользователю, который отправил заявку, так как телеграм считает, что пользователь начал чат. appr
Оглавление

Периодически, подавая заявки в закрытые телеграм каналы, мне тут же писали боты. Но ведь я знаю, что бот не может начать диалог с пользователем (из соображений безопасности). Так почему у этих ботов есть возможность писать мне? И как создать себе такого же бота?

Давайте разбираться.

  • Создаем закрытый канал в телеграмме, добавляем туда нашего бота в качестве администратора и даем ему права на добавление подписчиков.
-2
  • Создаем ссылку на канал с включенным параметром «заявка на вступление» и отправляем ее нашим пользователям.
-3

  • Напишем обработчик заявок на вступление.

chat_join_request_handler - Обрабатывает запрос на вступление в чат. Бот должен иметь права администратора can_invite_users в чате, чтобы получать такие апдейты. В качестве параметра передаёт в декорируемую функцию объект telebot.types.ChatJoinRequest.

Здесь нас интересует только два параметра: id пользователя, который отправил запрос и id канала, в который пользователь пытается войти.

-4
@bot.chat_join_request_handler()
def request_message(message):
channel_id = message.chat.id
user_id = message.user_chat_id

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

  • Раз уж мы видим заявки, давайте их обрабатывать. В этом нам помогут 2 функции:

approve_chat_join_request - Используйте этот метод, чтобы одобрить запрос на вступление в чат. Бот должен быть администратором чата и иметь права администратора can_invite_users. Возвращает True в случае успеха.

Функция принимает 2 параметра: chat_id и user_id.

decline_chat_join_request - Используйте этот метод, чтобы отклонить запрос на вступление в чат. Бот должен быть администратором чата и иметь права администратора can_invite_users.

Функция так же принимает 2 параметра: chat_id и user_id.

В случае, если мы хотим автоматически впускать всех пользователей - можем сразу добавить одобрение от бота в обработчик запросов на вступление:

-5
@bot.chat_join_request_handler()
def request_message(message):
channel_id = message.chat.id
user_id = message.user_chat_id
bot.approve_chat_join_request(chat_id=channel_id, user_id=user_id)

  • Добавим немного логики.

Я хочу, чтобы пользователь ввел код подтверждения. Если код совпадет, бот должен добавить пользователя в канал. Если нет - должен дать отказ.

-6
@bot.chat_join_request_handler()
def request_message(message):
channel_id = message.chat.id
user_id = message.user_chat_id
adm_code = bot.send_message(message.user_chat_id, 'Напиши мне код активации')
bot.register_next_step_handler(adm_code, approve_message, channel_id, user_id)
def approve_message(adm_code, channel_id, user_id):
if adm_code.text == '12345':
bot.approve_chat_join_request(chat_id=channel_id, user_id=user_id)
bot.send_message(chat_id=user_id, text='Код прошел проверку, я добавил тебя в канал')
else:
bot.decline_chat_join_request(chat_id=channel_id, user_id=user_id)
bot.send_message(chat_id=user_id, text='Неправильный код')
-7
  • Дальнейшую логику с сохранением и обработкой данных пользователя можете дописать сами.

Весь код выложил здесь.