Выполнение общего кода для каждой команды pyTelegramBotAPI
есть телеграм-бот с кучей команд.
import telebot
mytoken=...
adminchat_id=...
bot = telebot.TeleBot(mytoken)
@bot.message_handler(commands = ['command1', 'command2'])
def func1(message):
....
@bot.message_handler(commands = ['command3', 'command4'])
def func2(message):
....
@bot.message_handler(commands = ['command99', 'command100'])
def func50(message):
....
Понадобилось переправлять все запросы пользователей боту по любой команде определенному пользователю. Добавил функцию
def resend_message(msg):
bot.send_message(adminchat_id, str(msg.from_user.username)+ ' ' + str(msg.from_user.first_name) + ' ' + str(msg.from_user.last_name) + '\n' + msg.text)
и прописал ее вызов (resend_message(message))в начало каждой func1 ... func50. Но может можно выполнить общий код для всех команд одной строчкой, не прописывая в каждую функцию?
Ответы (2 шт):
Во-первых, скажу, что msg.from_user.username и (по-моему) msg.from_user.last_name может быть None, так что рекомендую сделать проверку на это, иначе бот иногда может выдавать ошибки
Во-вторых, если вы хотите общую функцию для всех функций, то могли бы все вписать в одну функцию:
@bot.message_handler()
def func_with_resend_message():
resend_message(message)
if message.text.lstrip('/').lower() == 'command1':
return command1func(message)
if message.text.lstrip('/').lower() == 'command2':
return command2func(message)
и так далее
Либо же можно воспользоваться предложенным мною вариантом, но сделать это более интересно, взяв один из ответов в https://stackoverflow.com/questions/9168340/using-a-dictionary-to-select-function-to-execute
Решение найдено, достаточно было почитать документацию)
telebot.apihelper.ENABLE_MIDDLEWARE = True
...
@bot.middleware_handler(update_types=['message'])
def modify_message(bot_instance, message):
resend_message(message)
...