Как создавать динамические команды в telegram

#python #telegram

#питон #телеграмма

Вопрос:

Как вы отправляете идентификатор для элементов в базе данных, не создавая метод для каждого идентификатора

Моя цель — ввести желаемый идентификатор /13 , и бот вернет мне необходимую информацию об этом элементе

Предпочтительным репозиторием является pyTelegramBotAPI

для доступа к базе данных и манипулирования ею я использую flask-sqlalchemy

 import telebot

from config import telegram_token       

bot = telebot.TeleBot(telegram_token)

@bot.message_handler(commands=['summary'])
def send_welcome(message):
    summary = """ return general info about bot performance """
    bot.reply_to(message, summary )


@bot.message_handler(commands=['<id>'])
def send_welcome(message):
    id_ = """ return info about this id"""
    bot.reply_to(message, id_)

 

Комментарии:

1. Я не знаю, есть ли telebot у on_message него что-то подобное Discord , но если у него есть что-то похожее, то вы можете получить полное сообщение и написать собственный код, чтобы проверить, что вы получаете в сообщении — вместо использования command . В конце концов, вы могли бы проверить, может ли он использоваться regex command . И затем вы должны проверить, что у вас есть в содержимом сообщения.

2. Я проверил вашу ссылку на API, и там есть @bot.message_handler(regexp="SOME_REGEXP") то, что вы могли бы использовать, regexp="d " чтобы получить любое число. И позже вы должны использовать message.text , чтобы получить это число в виде строки.

Ответ №1:

Ваша ссылка на API показывает метод с regex помощью команды распознать

 @bot.message_handler(regexp="SOME_REGEXP") 
 

который вы могли бы использовать , regexp="/d " чтобы получить любой /number .

И позже вы должны использовать message.text[1:] , чтобы получить это number как строку (без / ).

 @bot.message_handler(regexp="/d ")
def get_id(message):  
    id_ = message.text[1:]        # as string without `/`
    #id_ = int(message.text[1:])  # as integer
    bot.reply_to(message, id_)
 

Редактировать:

Запускать функцию только для /number того, чтобы она также нуждалась ^ $

 regexp="^/d $"
 

Без ^ $ этого будет выполняться функция также для hello /13 world


Минимальный рабочий код

 import os
import telebot

TELEGRAM_TOKEN = os.getenv('TELEGRAM_TOKEN')

bot = telebot.TeleBot(TELEGRAM_TOKEN)

@bot.message_handler(regexp="^d $")
def get_id(message):  
    id_ = message.text[1:]        # as string without `/`
    #id_ = int(message.text[1:])  # as integer
    bot.reply_to(message, id_)

bot.polling()
 

Редактировать:

Вы также можете использовать

 @bot.message_handler(func=lambda message: ...)
 

Нравится

 @bot.message_handler(func=lambda msg: msg.text[0] == '/' and msg.text[1:].isdecimal())
def get_id(message):  
    id_ = message.text[1:]        # as string without `/`
    #id_ = int(message.text[1:])  # as integer
    bot.reply_to(message, id_)
 

или более читабельный

 def is_number_command(message):
    text = message.text
    return text[0] == '/' and text[1:].isdecimal()
    
@bot.message_handler(func=is_number_command)
def get_id(message):  
    id_ = message.text[1:]        # as string without `/`
    #id_ = int(message.text[1:])  # as integer
    bot.reply_to(message, id_)
 

Вы можете использовать text[1:].isdecimal() или text[1:].isdigit() или text[1:].isnumeric() или str.isdecimal(text[1:]) или str.isdigit(text[1:]) или str.isnumeric(text[1:])

С func помощью вы можете использовать другие функции, чтобы сделать его еще более сложным.

Комментарии:

1. Таким образом, в основном используется обычное регулярное выражение python

2. Я добавил пример с @bot.message_handler(func=lambda message: ...)

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

4. разница в том, что они используют другой метод для распознавания цифр в строке — и нет предпочтительного метода — используйте все, что вам нравится.