Во второй части серии статей по написанию телеграм бота на python, мы добавим функциональность. Бот будет приветствовать новых юзеров, предлагать выбрать и сохранять лиги. Добавим возможность получить результаты по выбранным лигам.
«Рыба» кода бота
Сразу запишем функции в «bot.py», которые понадобятся. Предварительно удалите test_message :
Это не окончательная версия, я мог что-то упустить. В процессе добавим недостающие.
Каждая функция обернута декоратором, так мы общаемся с Телегармом:
Итак. Пользователь нажимает команду старт, получает приветственное сообщение. В нем мы предлагаем выбрать 3 лиги и мониторить результаты по ним. Получить результаты можно командой или кнопкой меню. Так же мы даем возможность изменить выбранные соревнования или удалить свои данные из бота.
Добавление команд в бота
Изначально команды не настроены. Пользователи могут вводить их, но специально меню нет. Для добавления нужно снова написать https://t.me/botfather команду /setcommands . Выберите своего бота и добавьте этот текст:
Как сделать бота для TELEGRAM на Python? | Бот модератор
start — Запуск и перезапуск бота
help — Возможности бота
online — Результаты матчей
В ответ получите «Success! Command list updated. /help». Теперь можно перейти в своего бота и проверить:
Ответы на команды
Взаимодействие с ботом начинается с команды /start . Нужно поприветствовать и предложить следующий шаг. Эта команда будет возвращать текст с клавиатурой. Точно так же работает и /help .
Добавим обработку этих команд в «bot.py», обновите start_handler help_handler :
Я добавил импорт import app.service as s . В этом модуле клавиатура и функция проверки пользователя. start_handler проверяет есть ли пользователь в кеше или базе данных, и отправляет ему соответствующий текст.
Перед отправкой текста для выбора лиг, я сохранил его будущий id. Получил номер последнего сообщения (это сама команда «start») и добавил 2 пункта: +1 за наш ответ на команду и +1 за само сообщения выбора лиг. Зная id сообщения, его можно редактирвать.
Теперь напишем клавиатуру и get_league_ids в модуль «service».
# fonlinebot/app/service.py from aiogram.types import ReplyKeyboardMarkup, KeyboardButton, InlineKeyboardMarkup, InlineKeyboardButton from emoji import emojize from config import BOT_LEAGUES, BOT_LEAGUE_FLAGS from database import cache, database as db from app.dialogs import msg MAIN_KB = ReplyKeyboardMarkup( resize_keyboard=True, one_time_keyboard=True ).row( KeyboardButton(msg.btn_online), KeyboardButton(msg.btn_config) ) async def get_league_ids(user_id: str) -> list: «»»Функция получает id лиг пользователя в базе данных»»» leagues = cache.lrange(f»u», 0, -1) if leagues is None: leagues = await db.select_users(user_id) if leagues is not None: leagues = leagues.split(‘,’) [cache.lpush(f»u», lg_id) for lg_id in leagues] else: return [] return leagues
MAIN_KB — основная клавиатура, как на скриншоте выше. Разберем подробнее:
- ReplyKeyboardMarkup — объект, который создает клавиатуру.
- Параметр resize_keyboard=True уменьшает ее размер.
- А с one_time_keyboard=True клавиатура будет скрываться, после использования.
- .row — метод для группировки кнопок в строку.
- KeyboardButton(msg.btn_online) и KeyboardButton(msg.btn_config) — кнопки с заданным текстом.
Осталось только добавить текста сообщений в dialogs. Вставьте этот код в класс Messages .
# fonlinebot/app/dialogs.py # . start_new_user: str = «Привет. Я могу сообщать тебе результаты матчей online.» start_current_user: str = «Привет. С возвращением! » «Используй команды или меню внизу для продолжения.» help: str = «»» Этот бот получает результаты матчей за последние 48 часов. Включая режим LIVE. — Что бы выбрать/изменить лиги нажмите «Настройки». — Для проверки результатов нажмите «Онлайн». Бот создан в учебных целях, для сайта pythonru.com «»»
Выбор, изменение и удаление лиг
Сначала внесем правки в наши вспомогательные модули.
В «dababase» в класс Database добавим новый метод insert_or_update_users .
# fonlinebot/database.py #. async def insert_or_update_users(self, user_id: int, leagues: str): user_leagues = await self.select_users(user_id) if user_leagues is not None: await self.update_users(user_id, leagues) else: await self.insert_users(user_id, leagues) #.
В настройки добавим переменные метрик времени:
Источник: pythonru.com
Как сделать чтобы бот в телеграме отвечал только сообщением с определённым префиксом
В мире мессенджеров Телеграм стал одним из самых популярных платформ для создания и использования ботов. Боты в Телеграме могут быть полезными во многих областях, от развлечений до бизнеса. Однако, когда вы создаете бота, вы можете столкнуться с проблемой, когда бот начинает отвечать на все сообщения без ограничений.
В этой статье мы рассмотрим способы сделать так, чтобы ваш бот в Телеграме отвечал только на сообщения с определенным префиксом. Давайте начнем!
1. Получение API-ключа бота
Первым шагом является создание бота и получение API-ключа. Для этого откройте Telegram и введите в строку поиска BotFather. БотFather — это официальный бот разработчиков Telegram, через который вы можете создать своего собственного бота.
Найдите бота BotFather и напишите ему сообщение «/newbot». Следуйте инструкциям, введите имя для бота и уникальное имя пользователя, заканчивающееся на «bot». В ответ вы получите API-ключ для вашего бота.
2. Настройка и развертывание бота
После того, как у вас есть API-ключ для бота, вы должны настроить и развернуть его. Создайте новый проект на платформе программирования, которую вы предпочитаете, и подключитесь к Telegram API, используя ваш API-ключ.
Возможно, вы захотите использовать готовые библиотеки для разработки Telegram ботов на языках программирования, таких как Python (python-telegram-bot), JavaScript (node-telegram-bot-api) или другие. Эти библиотеки облегчают вам задачу взаимодействия с API Telegram и обработки сообщений от бота.
3. Определение префикса для ответов
Теперь, когда ваш бот настроен, вы можете приступить к установке префикса для ответов. Префикс — это символ или серия символов в начале сообщения, которые позволяют вашему боту распознать, что это сообщение требует ответа.
4. Обработка сообщений и проверка префикса
Теперь, когда вы определили префикс для ответов, необходимо обрабатывать поступающие сообщения и проверять наличие префикса. В зависимости от языка программирования и используемой библиотеки, обработка сообщений может быть немного отличаться.
Ниже приведен пример обработки сообщений на Python, используя библиотеку python-telegram-bot:
5. Тестирование бота
После того, как вы настроили обработку сообщений с префиксом, вам следует протестировать своего бота. Напишите ему сообщение с префиксом в начале и убедитесь, что он отвечает только на такие сообщения.
Если ваш бот отвечает только на сообщения с префиксом, значит, задача выполнена успешно!
Создание бота в Телеграме, который отвечает только на сообщения с определенным префиксом, может быть полезным, особенно когда вы хотите ограничить его функциональность или предотвратить случайные ответы или спам.
В этой статье мы рассмотрели шаги, которые необходимо выполнить для реализации такой функции в вашем боте. Не забывайте, что каждая библиотека программирования и каждый язык программирования могут иметь свои особенности, поэтому ознакомьтесь со спецификациями и документацией вашей выбранной платформы разработки Telegram бота.
Удачи в создании вашего бота в Телеграме!
Источник: qaa-engineer.ru
Бот дразнилка для telegram
Однажды, в одной группе мессенджера телеграм появился занятный бот, который умел передразнивать фразы «да» и «нет». Если сообщение любого из участников заканчивалось на что-то похожее на «да/нет», он отвечал: «Пакет го*на» или «Го*на пакет» (не будем нецензурщиной осквернять блог). В общем. прикольно.
Я его добавил в офисную группу, и он периодически отвечал, но потом стал все реже проявлять активность, тупить, к тому же народ требовал хлеба и зрелищ, а именно возможности обучать бота, чтобы его лексикон стал расширяемым. Как итог, у меня появилась идея создания своего бота, который бы повторял функции существующего, но дополнительно мог обучаться.
Как все создавалось
На тот момент у Ильи (еще один наш разработчик) уже был опыт написания бота для promurom.ru, он его писал на php. «Php — это не интересно», — подумал я, к тому же давно было желание в изучении nodejs, а тут нескольких зайцев: и прокачка скилов, и развлечение, и новые технологии =) Про написание ботов есть стопицот постов и мануалов, я не буду подробно рассказывать все этапы регистрации и разработки (чего там разрабатывать? 3 строчки кода и 2 библиотеки для nodejs). Самая главная библиотека Telegram Bot API for NodeJS — это обертка над стандартным АПИ телеграма. Для меня очень сложным был процесс понимания как же боты работают, не саму обработку запросов, а именно процесс общения между сервером телеграм и моим сервером. Я себе представлял это так: пользователь шлет команду боту, сообщение уходит на сервер теоеграм, оттуда идет на мой сервер, забирает ответ и отправляет этот ответ в чат (забегая вперед скажу, что так он тоже может, но процесс настройки чуть сложнее). В действительности все оказалось проще, собственно сам бот крутить на сервере и с некоторой периодичностью присасывается к серверу телеграми и слушает не пришло ли ему чего (Long polling) Никаких сложных настроек сервера и протоколов.
За пару часов я накидал частичный аналог старого бота, который реагировал на да/не и еще пару фраз, запулил его на сервере и добавил в офисную группу.
Расширяемый лексикон
Теперь переходим к следующему этапу, наделим бота способностью учиться. Как-то не сразу в моей голове сложилось понимание как реализовать весь процесс и в каком формате хранить данные. Сначала родилось решение «в лоб» завести базу из одной таблицы, состоящей из 2х полей, где будут храниться фразы и ответы а них. Но этот вариант с моими навыками на тот момент показался сложноватым. К тому же идея при каждом запросе дергать базу тоже не внушала оптимизма. В дело вступил коллективный разум, я закинул проблему в общий чат и обсуждение началось. Конечно, буквально за пару десятков фраз мы ушли то основной темы и стали рассуждать как можно еще «улучшить» бота, наделить его ИИ и т.д. Но одна хорошая мысль прозвучала: «Не бойся часто дергать файловую систему, это не так долго (тем более в век ssd), а самое главное — просто». В общем, принял решение, что хранить словарь буду в файле на диске. А потом мне пришло понимание, что я работаю с процессом, который не останавливается, nodejs запускается аки демон и висит в процессах, пока его не убьешь явно. Т.е. при запуске все переменные попадают в память и никуда оттуда не деваются, если, конечно, ты сам их не прибьешь, следовательно, словарь будет все время лежать в ОЗУ, а это самое быстрое что может быть. И так решение: словарь храним на диске, при запуске забираем его в память и работаем из ОЗУ, при расширении словаря пишем на диск обновленный словарь — ПРОФИТ!
С форматом хранения не стал долго ломать голову, есть стандартный для js — json (в честь Джейсона Стетема, наверное), вот его и взял за основу, фраза в качестве ключа, а ответ значение:
Потом пришла мысль: «А если будет несколько ответов на одну фразу?». Несколько одинаковых ключей быть не может, поэтому, не мудрствуя лукаво — фраза в качестве ключа, а значения хранить в массиве. И в итоге получаем такую структуру:
При выборе ответа берем какую-нибудь функцию генерации случайного числа и на его основе выбираем элемент массива. С форматом хранения ок, а как же обучать?
Что я понял про команды бота для телеграм? Все фразы, которые начинаются со слеша имеют атрибут команда, для чего их регистрировать через папу-бота, мне так и не понятно, может, я что-то не так читал или это проблема обертки для nodejs, но факт остается фактом. Обработку команды /help также пишет сам разработчик, следовательно что он хочет, то и выводит, я думал, что хэлп на уровне сервера работает, и отдает все зарегистрированные команды. Т.е. если бот не приватный, то можно вообще любую фразу интерпретировать как команду. Я создал команду обучения:
/learn_new фраза=ответ
Если формат будет не правильный, бот об этом сообщит. Из недостатков: в качестве фразы может быть только одно слово, бот реагирует только на последнее слово.
Вот как-то так =) Ищите во всех телеграмах страны, бот с именем Draznilka.
Сергей Рыбкин | 21.01.2020
Наш сайт — серебрянный призер Tagline Awards 2019
Источник: sawtech.ru