Меню в Телеграмме бот python api

Я работаю с python-telegram-bot и пытаюсь создать систему вложенных меню, таких как BotFather. Например, у вас есть общее меню ботов (pic.1), где вы можете выбрать «Редактировать Бот» и получить новое соответствующее меню (рис.2) с возможностью вернуться в предыдущее меню. Я пытаюсь добиться этого с помощью кода:

# main menu
def start(bot, update):
menu_main = [[InlineKeyboardButton(‘Option 1′, callback_data=’m1’)],
[InlineKeyboardButton(‘Option 2′, callback_data=’m2’)],
[InlineKeyboardButton(‘Option 3′, callback_data=’m3’)]]
reply_markup = InlineKeyboardMarkup(menu_main)
update.message.reply_text(‘Choose the option:’, reply_markup=reply_markup)

# all other menus
def menu_actions(bot, update):
query = update.callback_query

if query.data == ‘m1’:
# first submenu
menu_1 = [[InlineKeyboardButton(‘Submenu 1-1′, callback_data=’m1_1’)],
[InlineKeyboardButton(‘Submenu 1-2′, callback_data=’m1_2’)]]
reply_markup = InlineKeyboardMarkup(menu_1)

Как сделать меню для Телеграм Бота на Python


bot.edit_message_text(chat_id=query.message.chat_id,
message_id=query.message.message_id,
text=’Choose the option:’,
reply_markup=reply_markup)
elif query.data == ‘m2’:
# second submenu
# first submenu
menu_2 = [[InlineKeyboardButton(‘Submenu 2-1′, callback_data=’m2_1’)],
[InlineKeyboardButton(‘Submenu 2-2′, callback_data=’m2_2’)]]
reply_markup = InlineKeyboardMarkup(menu_2)
bot.edit_message_text(chat_id=query.message.chat_id,
message_id=query.message.message_id,
text=’Choose the option:’,
reply_markup=reply_markup)
elif query.data == ‘m1_1’:
.
elif query.data == ‘m1_2’:
.
# and so on for every callback_data option

.

# handlers
dispatcher.add_handler(CommandHandler(‘start’, start))
dispatcher.add_handler(CallbackQueryHandler(menu_actions))

Этот код работает, но у меня такое чувство, что оно иррационально — построить длинное дерево elif . Более того, я не могу понять, как предоставить пользователю возможность вернуться в главное меню из меню второго уровня (поскольку главное меню расположено в другом обработчике, и я не могу поймать его с обратным вызовом от CallbackQueryHandler ). Итак, вопрос в том, что лучше всего создавать такие системы меню?

спросил(а) 2018-07-01T20:12:00+03:00 5 лет, 3 месяца назад
добавить комментарий
пожаловаться

Вы должны использовать pattern аргумента в CallbackQueryHandler . Также хорошо использовать классы или функции для клавиатур и сообщений.
Чтобы вернуться в главное меню, добавьте кнопку возврата в подменю с определенным шаблоном обратного вызова. Обратите внимание: вы используете edit_message_text в меню. Это означает, что ничего не произойдет, если вы reply_text функцию start с reply_text метода reply_text из любого меню. Полный рабочий пример с функциями:

#!/usr/bin/python3
from telegram.ext import Updater
from telegram.ext import CommandHandler, CallbackQueryHandler
from telegram import InlineKeyboardButton, InlineKeyboardMarkup
############################### Bot ############################################
def start(bot, update):
update.message.reply_text(main_menu_message(),
reply_markup=main_menu_keyboard())

def main_menu(bot, update):
query = update.callback_query
bot.edit_message_text(chat_id=query.message.chat_id,
message_id=query.message.message_id,
text=main_menu_message(),
reply_markup=main_menu_keyboard())

def first_menu(bot, update):
query = update.callback_query
bot.edit_message_text(chat_id=query.message.chat_id,
message_id=query.message.message_id,
text=first_menu_message(),
reply_markup=first_menu_keyboard())

def second_menu(bot, update):
query = update.callback_query
bot.edit_message_text(chat_id=query.message.chat_id,
message_id=query.message.message_id,
text=second_menu_message(),
reply_markup=second_menu_keyboard())

# and so on for every callback_data option
def first_submenu(bot, update):
pass

Еще по теме:  Бот Телеграм кто просматривал ваш инстаграм

def second_submenu(bot, update):
pass

############################ Keyboards #########################################
def main_menu_keyboard():
keyboard = [[InlineKeyboardButton(‘Option 1′, callback_data=’m1’)],
[InlineKeyboardButton(‘Option 2′, callback_data=’m2’)],
[InlineKeyboardButton(‘Option 3′, callback_data=’m3’)]]
return InlineKeyboardMarkup(keyboard)

def first_menu_keyboard():
keyboard = [[InlineKeyboardButton(‘Submenu 1-1′, callback_data=’m1_1’)],
[InlineKeyboardButton(‘Submenu 1-2′, callback_data=’m1_2’)],
[InlineKeyboardButton(‘Main menu’, callback_data=’main’)]]
return InlineKeyboardMarkup(keyboard)

def second_menu_keyboard():
keyboard = [[InlineKeyboardButton(‘Submenu 2-1′, callback_data=’m2_1’)],
[InlineKeyboardButton(‘Submenu 2-2′, callback_data=’m2_2’)],
[InlineKeyboardButton(‘Main menu’, callback_data=’main’)]]
return InlineKeyboardMarkup(keyboard)

############################# Messages #########################################
def main_menu_message():
return ‘Choose the option in main menu:’

def first_menu_message():
return ‘Choose the submenu in first menu:’

def second_menu_message():
return ‘Choose the submenu in second menu:’

############################# Handlers #########################################
updater = Updater(‘xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx’)

updater.dispatcher.add_handler(CommandHandler(‘start’, start))
updater.dispatcher.add_handler(CallbackQueryHandler(main_menu, pattern=’main’))
updater.dispatcher.add_handler(CallbackQueryHandler(first_menu, pattern=’m1′))
updater.dispatcher.add_handler(CallbackQueryHandler(second_menu, pattern=’m2′))
updater.dispatcher.add_handler(CallbackQueryHandler(first_submenu,
pattern=’m1_1′))
updater.dispatcher.add_handler(CallbackQueryHandler(second_submenu,
pattern=’m2_1′))

updater.start_polling()
################################################################################

Источник: progi.pro

Примеры ботов

Многие пользователи Telegram создают свои инструменты для создания ботов. На этой странице мы собираем их, чтобы начинающим ботостроителям проще было найти нужную библиотеку.

Node.js

Telegraf

Полная поддержка всех функций Bot API, включая игры, инлайн-режим, платежи и многое другое.

node-telegram-bot-api

  • Исходный код
  • Документация
  • Канал в Telegram

tgapi

Telebot

Botgram

Микрофреймворк для создания ботов.

telegram-bot-api

Slimbot

PHP

PHP Telegram API

Полная имплементация Bot API на PHP7.

PHP Telegram Bot

Библиотека с поддержкой плагинов.

Bot API PHP SDK

Мощный SDK с поддержкой Laravel.

TelegramBotApiBundle

Обёртка для Symfony.

Telegram Bot Api Base

PHP Telegram Bot

TuriBot

Python

AIOGram

Полностью асинхронная библиотека для Telegram Bot API, написанная на asyncio и aiohttp.

python-telegram-bot

Мощная и активно развивающаяся библиотека

Telepot

Фреймворк для создания ботов на Telegram Bot API.

Telegram Bot Service

Фреймворк для создания ботов. Основан на библиотеке Twisted для Python 3.

telebot

Небольшая библиотека для создания ботов. Подходит для развёртывания на Google App Engine.

Источник: tlgrm.ru

Как создать бота для Telegram | Бот отправляющий изображения котов

Боты для телеграмма сейчас весьма популярны, давайте и мы научимся делать своих.

ЯП который мы будем использовать, как всегда Python. Напишем простого бота, который по заданной команде будет присылать нам котиков, а еще добавим кнопку, чтобы не вводить команды каждый раз. Вот рабочий пример (надеюсь к моменту твоего прочтения, я его еще буду хостить).
И итог того, что должно получиться:

Скриншот чата с ботом

Подготовка

Для начала мы будем исходить из того, что Python3 уже установлен и из командной строки прекрасно работает >_ python и >_ pip. Сидим мы из под Linux или Windows неважно.
Для работы с телеграмом будем использовать эту библиотеку, для установки необходима командная строка с правами администратора.
И ввод одной команды.

pip install python-telegram-bot —upgrade

Еще по теме:  Видео обновления в Телеграмме это

pip install requests

Чат с BotFather

Не забудем и про добавление команды

Чат с BotFather

Пишем код

В принципе, многое уже и так есть в примерах в репозитории и заново ничего придумывать не надо, мы лишь изменим и дополним то, что уже есть.
И так поехали, берем из примеров простого бота echobot2, который уже умеет отвечать на все сообщения и знает команды /help /start. Отвечалку на все сообщения мы изменим, команды тоже немного поменяем и добавим свою /cat, которая собственно и будет постить котиков :3.
Для начала подставляем ранее полученный токен, необходимый для работы.

Код инициализации бота

Смотрим дальше и видим, что все обработчики в боте (команды, текст и тд) находятся в функции main и добавляются как dp.add_handler
Как вы можете заметить, событие использования команды в чате состоит из двух частей: текст команд и функции, которая вызывается при ее использовании.

По тому же принципу добавим свою команду строкой
dp.add_handler(CommandHandler(«cat», sendcat)), где cat — это команда , sendcat — вызываемая функция при получение данной команды.

Код инициализации бота

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

Код отправки сообщения в Telegram

Изменим отправляемый текст на сообщение об ошибке

Код отправки сообщения в Telegram

Также изменим отправляемый текст на /start и /help

Украшательства закончены. Приступим к котикам :).
Котики у нас будут состоять из двух функций. Первую вы уже видели в хендлере — sendcat, она будет отвечать за отправку, но встает вопрос, а что же нам собственно отправлять? Тут мы будем использовать вторую функцию getcat которая будет отвечает за предоставление ссылок на картинки с котиками, брать которые мы будет с сайта thecatapi. Его апи позволяет получать ссылки на случайные картинки с котами, чем мы и воспользуемся.
Подключаем библиотеку requests и пишим простенькую функцию выдающию ссылки на картинки с котиками. Потом просто вызываем ее в sendcat.

Получения ссылки python requests

Проверим что получилос. Запускаем наш скрипт, ищем в телеграмме бота по нику, который вы задали ему при создании и. Котики .

Скриншот чата с ботом

Уже неплохо, но что-то все равно не то. Мы отправляем котов не как картинки, а как ссылки, телеграм конечно их подгружает и показывает, но решение так себе. Исправим же это, открываем документацию по работе с апи телеграма для ботов и ищем метод отправки картинок.

Функция отправки изображения в Telegram

Возвращаемся обратно и в функции sendcat заменяем всю строку отправки сообщения на bot.sendPhoto(chat_id=update.message.chat_id, photo=getcat())

Функция отправки сообщения с картинкой

Скриншот чата с ботом

Почти все готово, осталось сделать кнопку в чате, чтобы не вписывать постоянно команду вручную.
Использовать мы будем Inline клавиатуру (прямо в чате которая), она состоит из двух функций: первая отвечает за отрисовку (markup), вторая за обработку нажатий (callback).
Снова идем в примеры, которые даются авторами библиотеки, вытаскиваем вот это и переделываем под себя.
Кое-что доподключаем:

Еще по теме:  Как в Телеграме открыть ссылку через Яндекс

Подключение библиотек inline keyboard

В итоге получается

Код клавиатуры inline в Telegram

Скриншот чата с ботом

Исходный код

import requests from telegram import InlineKeyboardButton, InlineKeyboardMarkup, ReplyKeyboardRemove, ReplyKeyboardMarkup, KeyboardButton from telegram.ext import Updater, CommandHandler, MessageHandler, Filters, CallbackQueryHandler import logging # Enable logging logging.basicConfig(format=’%(asctime)s — %(name)s — %(levelname)s — %(message)s’, level=logging.INFO) logger = logging.getLogger(__name__) # Define a few command handlers. These usually take the two arguments bot and # update. Error handlers also receive the raised TelegramError object in error. def start(bot, update): «»»Приветствие»»» update.message.reply_text(‘Привет, я бот, который очень любит котиков :3nНапиши мне /cat и я поделюсь ими с тобой’) def help(bot, update): «»»Сообщение для помощи с командами»»» update.message.reply_text(‘Чтобы получить котика напиши /cat’) def echo(bot, update): «»»На любой текст отвечаем ошибкой»»» update.message.reply_text(«Неизвестная команда :(«) def error(bot, update, error): «»»Log Errors caused by Updates.»»» logger.warning(‘Update «%s» caused error «%s»‘, update, error) def getcat(): »’Получение ссылки на картинку с котиком»’ try: r = requests.get(‘http://thecatapi.com/api/images/get?format=src’) url = r.url except: url = get_cat() print(‘Error with cat parsing’) pass return url def sendcat(bot, update): «»»Отправка котиков»»» bot.sendPhoto(chat_id=update.message.chat_id, photo=getcat(), reply_markup=draw_button()) def draw_button(): keys =[[InlineKeyboardButton(‘?Еще котика. ‘, callback_data=’1’)]] return InlineKeyboardMarkup(inline_keyboard=keys) def get_callback_from_button(bot, update): query = update.callback_query username = update.effective_user.username chat_id = query.message.chat.id message_id = query.message.message_id if int(query.data) == 1: bot.sendPhoto(photo=getcat(), chat_id=chat_id, message_id=message_id, reply_markup=draw_button()) def main(): «»»Start the bot.»»» # Create the EventHandler and pass it your bot’s token. updater = Updater(«СЮДА ВАШ ТОКЕН») # Get the dispatcher to register handlers dp = updater.dispatcher dp.add_handler(CallbackQueryHandler(get_callback_from_button)) dp.add_handler(CommandHandler(«start», start)) dp.add_handler(CommandHandler(«help», help)) dp.add_handler(CommandHandler(«cat», sendcat)) # on noncommand i.e message — echo the message on Telegram dp.add_handler(MessageHandler(Filters.text, echo)) # log all errors dp.add_error_handler(error) # Start the Bot updater.start_polling() # Run the bot until you press Ctrl-C or the process receives SIGINT, # SIGTERM or SIGABRT. This should be used most of the time, since # start_polling() is non-blocking and will stop the bot gracefully. updater.idle() if __name__ == ‘__main__’: main()

F.A.Q

  • Q: Т.к бот каждый раз запрашивает картинку, а потом еще и загружает ее в мессенджер, уходит масса времени. Как ускорить выдачу ответов?
  • A: Решение — использовать сервера Telegram, как кеш. Сохраняйте при отправке фото их media_id (куда нибудь в бд), чтобы потом можно было быстренько его оттуда вытянуть и отправить.
  • Q: А как сделать ребут, админку, оформить тексты т.д ?
  • A: Здесь есть отличные сниппеты
  • Q: Как осуществить . ?
  • A: Документация Telegram bot api, Вики библиотеки

Источник: liberbear.com

Рейтинг
( Пока оценок нет )
Загрузка ...