AIOgram3 12. Добавление бота в чат
В этом посте я расскажу о том, как добавить бота в чат, дать ему права на чтение сообщений и разграничить команды.
Дополнительные материалы
Для скачивания материалов необходимо войти или зарегистрироваться
Файлы также можно получить в Telegram-боте по коду: 385736
Реклама
Telegram-боты могут работать не только 1 на 1 с пользователем, но и с целыми чатами.
Вот и в чате канала появилась необходимость в боте, а именно в следующем функционале:
- Приветствие новых пользователей чата.
- Удаление сообщений, содержащих мат (уж простите, но чат публичное место и если без мата не обойтись, то лучше промолчать).
- Погода. Да, погода. Уж не знаю на кой ляд она сдалась, но раз просят - надо делать.
И, что самое удобное, бот будет действовать на комментарии к постам на канале.
Добавление бота в чат.
Начнём с самого начала, а именно с добавления бота в чат.
В чате с ботом открываем его профиль.
Там выбираем пункт "Добавить в группу". В открывшемся списке выбираем необходимую группу.
Бот добавлен, но он не имеет доступа к сообщениям.
Он будет работать, если к нему напрямую обращаться по команде, а остальные сообщения он не будет видеть. Это не позволит ему проверять сообщения, а также не позволит работать машине состояний, если будет несколько уровней взаимодействия.
Чтобы разрешить доступ к сообщениям боту, необходимо сделать его администратором чата. Достаточно минимальных прав, либо можно на будущее выбрать необходимое. Всё зависит от требуемого функционала.
Для этого откройте управление группой и выберите пункт "Администраторы".
Нажмите "Добавить администратора" и выберите в списке вашего бота.
Затем выберите необходимые права и по желанию боту можно прописать роль.
Готово. Бот добавлен в группу и может читать сообщения.
Получение идентификатора чата.
Для взаимодействия бота с чатом, разграничением функционала и корректной работы, необходимо знать 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
и создаём функцию, возвращающую текст с новым списком команд.
Завершение.
Готово. Бот подготовлен к работе в чате. В следующем посте начнём делать самую востребованную функцию.
Всё правильно, это погода.
Все статьи