Всем привет! В этой статье я покажу один из способов, как написать телеграм-бота, который будет добавлять кнопки с лайком и дизлайком при появлении поста на канале.
Я буду использовать библиотеку aiogram для бота и sqlite3 для работы с БД.
1. likes.sqlite
Создадим базу данных likes.sqlite. Со временем в ней будет много таблиц. Одна таблица - один пост на канале. Структура таблицы будет такая:
Имя таблицы - id сообщения (поста), uid - id пользователя, нажавшего на кнопку. Если нажал на лайк, поле like получает значение 1 (true), dislike - 0 (false) и наоборот. Также поле uid должно иметь ограничение по уникальности, в первую очередь, для упрощения кода. Поля like и dislike должны иметь тип данных boolean.
2. db.py
Для работы с базой данных создадим файл db.py. В нём будут следующие функции:
1. new_post(mid) - вызывается при появлении нового поста, принимает его id (mid).
Тут, думаю, несложно. 8 строка - создаётся таблица. 9-12 строки - создание полей с нужными параметрами.
2. get_likes_num(mid) - возвращает словарь с ключами "likes" и "dislikes", к которым относится количество лайков и дизлайков сообщения (mid).
В 18 и 20 строках считается количество полей like и dislike со значениями 1 (true), и в 22 строке возвращаются эти значения в виде словаря.
3. add_like(mid, uid, data) - вызывается при нажатии пользователем на лайк или дизлайк. Принимает id сообщения (mid), id пользователя (uid) и то, что он нажал (data).
В блоке try добавляем id пользователя и, в зависимости от data, лайк или дизлайк. Исключение будет возникать в случае, если такой id уже существует в таблице. Из этого следует, что изменить своё решение (например, поменять лайк на дизлайк) нельзя, но вы можете это исправить, добавив несколько строк нужного кода.
3. bot.py
Теперь перейдём к коду бота.
Импортируем нужные библиотеки и не забываем про db.py. Сперва напишем функцию, возвращающую инлайн клавиатуру с кнопками лайка и дизлайка:
Думаю, тут всё понятно. Символы лайка и дизлайка: 👍👎.
Теперь создадим два хэндлера: первый срабатывает при появлении нового поста, второй - при нажатии на кнопку:
24 строка - создаем новую таблицу в базе данных. 25 - редактируем клавиатуру появившегося поста.
34 - добавляем лайк/дизлайк в базу данных. 36 - редактируем клавиатуру поста, чтобы отобразить количество лайков и дизлайков.
Осталось добавить бота в администраторы канала и готово. Использовать бота сразу на нескольких каналах не стоит, так как id сообщений могут совпадать. Но если всё же хочется или надо, то можно, например, вести параллельно несколько баз данных (сколько каналов - столько баз), где название базы - id канала.
Исходный код: https://gist.github.com/susanin3/f64250a28439db84c2dad51a7db92647
Пример канала с такими лайками: https://t.me/dich001
На этом всё. Надеюсь, объяснение было понятно, а если остались вопросы - пишите их в комментарии. Если эта статья помогла вам или вы считаете её полезной (а если и то и то, то вообще супер), то можете поставить лайк для продвижения статьи. Всем спасибо!