#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. разница в том, что они используют другой метод для распознавания цифр в строке — и нет предпочтительного метода — используйте все, что вам нравится.