Cat

AIOgram3 12. Добавление бота в чат

В этом посте я расскажу о том, как добавить бота в чат, дать ему права на чтение сообщений и разграничить команды.

Все статьи

Icon Link

Дополнительные материалы

Icon Link

Реклама

Icon Link
Telegram-бот на AIOgram3 proDream 01 Октябрь 2023 Просмотров: 2406

Telegram-боты могут работать не только 1 на 1 с пользователем, но и с целыми чатами.

Вот и в чате канала появилась необходимость в боте, а именно в следующем функционале:

  1. Приветствие новых пользователей чата.
  2. Удаление сообщений, содержащих мат (уж простите, но чат публичное место и если без мата не обойтись, то лучше промолчать).
  3. Погода. Да, погода. Уж не знаю на кой ляд она сдалась, но раз просят - надо делать.

И, что самое удобное, бот будет действовать на комментарии к постам на канале.

 

Добавление бота в чат.

Начнём с самого начала, а именно с добавления бота в чат.

В чате с ботом открываем его профиль. 


Там выбираем пункт "Добавить в группу". В открывшемся списке выбираем необходимую группу.

 

Бот добавлен, но он не имеет доступа к сообщениям. 

 

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

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

Для этого откройте управление группой и выберите пункт "Администраторы". 

 

Нажмите "Добавить администратора" и выберите в списке вашего бота.

 

Затем выберите необходимые права и по желанию боту можно прописать роль.

Готово. Бот добавлен в группу и может читать сообщения.

 

Получение идентификатора чата.

Для взаимодействия бота с чатом, разграничением функционала и корректной работы, необходимо знать ID-чата.

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

Воспользуемся простым.

Открываем чат с ботом https://t.me/userinfobot


Сразу после запуска он покажет ваш Telegram-ID, но нам необходим ID-чата.

Переходим в чат и пишем сообщение от имени чата. Затем выделяем сообщение и пересылаем его в ранее упомянутого бота.

 

В ответ он пришлёт идентификатор чата начинающийся со знака -. Всё верно, Идентификаторы пользователей - целое число, а идентификаторы чатов и каналов - отрицательное.

 

Отлично. Теперь у вас есть идентификатор вашего чата.

 

Доработка кода бота.

Разобравшись с формальностями, перейдём к коду. Откроем файл settings.py.

У нас есть Dataclass Secrests в котором мы храним важные для работы бота данные, а именно токен и идентификатор администратора.

Добавим новую строчку:

group_id: int = -12345

 

Вместо -12345 вставляем идентификатор вашего чата.

 

Меню для чата.

На данный момент в моём боте есть четыре команды:

  • start - Начало работы
  • get_file - Получение файла с материалами
  • help - Помощь по доступным командам
  • about - Информация о боте

 

Однако, в чате в первых двух командах нет необходимости. Я хочу, чтобы они были доступны только из бота и их не было видно в меню чата.

Для этого откроем файл commands.py.
В теле функции set_commands находится список commands, определяющий меню бота. Его мы не трогаем. 
Ниже до команды await bot.set_my_commands создаём новый список commands_chat и вписываем туда, по аналогии со списком выше, команды доступные в чате.

 

У меня на данный момент это две команды:

  • help - Помощь по доступным командам
  • about - Информация о боте

Ниже, под await bot.set_my_commands добавляем ещё одну такую же строчку. Изменив первый аргумент на новый список, а во втором прописав BotCommandScopeChat(chat_id=Secrets.group_id). Так мы определяем, что меню будет доступно в конкретном чате.

Новая строка:

from botlogic.settings import Secrets

await bot.set_my_commands(commands_chat, BotCommandScopeChat(chat_id=Secrets.group_id))

 

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

 

Ограничение существующих команд.

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

Откроем файл send_file.py и в самое начало функции send_file_start добавим условие:

from botlogic.settings import Secrets

if message.chat.id != Secrets.group_id:

 

Получится вот так:

async def send_file_start(message: Message, state: FSMContext):  
    if message.chat.id != Secrets.group_id:  
        await message.answer(views.send_file_start_msg())  
        await state.set_state(SendFileSteps.get_code_from_user)

 

Во второй функции нет необходимости в проверке, поскольку в неё не попасть без первой.

Далее откроем файл simple.py и добавим такое же условие к функции start_command.

Функция about_command у меня универсальна, оставляем как есть.

Функция help_command выводит текст со списком доступных команд, следовательно, необходимо сделать две текстовые функции в файле views.py
Сперва добавим условие, как и раньше, ниже прописываем else и повторяем команду с сообщением, изменив название функции, например, на help_chat_message.

Получается вот так:

async def help_command(message: Message):  
    if message.chat.id != Secrets.group_id:  
        await message.answer(views.help_message())  
    else:  
        await message.answer(views.help_chat_message())

 

Переходим во views.py и создаём функцию, возвращающую текст с новым списком команд.

 

Завершение.

Готово. Бот подготовлен к работе в чате. В следующем посте начнём делать самую востребованную функцию.
Всё правильно, это погода.

Автор

    Нет комментариев

    Реклама