电报机器人命令中的问题

Problems in telegram bot commands

我正在创建一个以图像格式发送数学问题的机器人。我想为不同的命令创建两个两个函数,这样一个命令只发送一种类型的问题,而另一个发送另一种类型的问题。示例:/random 发送一般问题,而 /comb 发送组合问题。

我的尝试:

@dp.message_handler(commands=['random', 'comb'])
async def random_cat(message: types.Message):
    captions = ["Nice problem!", "Niceeeeee :eyes:",
                "Noice", "Very cool"]
    caption = random.choice(captions)
    asyncio.create_task(fetch_cat())
    if dp.message_handler(commands=['random']):
        for image in [random.choice(["quest1.jpg", "quest2.jpg", "quest4.jpg", "quest5.jpg", "quest6.jpg",
                                    "quest7.jpg", "quest8.jpg","quest9.jpg", "quest10.jpg", "quest11.jpg", "quest12.jpg"])]:
            f = open(image, 'rb')
            photo = f.read()
            f.close()        
    elif dp.message_handler(commands=['comb']):
        for item in [random.choice(["quest14.jpg", "quest15.jpg"])]:
            r = open(item, 'rb')
            photo = r.read()
            r.close()             
    # _id = random.random()
    await bot.send_photo(chat_id=message.chat.id,
                         photo=photo,
                         caption=emojize(
                             caption) if caption == captions[1] else caption,
                         reply_to_message_id=message.message_id)
if __name__ == '__main__':
    executor.start_polling(dp, skip_updates=True)

即使使用代码,机器人也会针对相同的命令发送相同的消息。如何解决这个问题?如果可能的话,我如何更改代码以便将来能够为其他类型的问题输入新命令?

dp.message_handler(commands=['random']) 不是用来检查命令的,而是用来给命令分配功能的。

我测试过,应该是

if message.text == '/random':
    # ... code ...

elif  message.text == '/comb':
    # ... code ...

如果你想 运行 命令带参数然后使用 str.startswith()

if message.text.startswith('/random'):
    # ... code ...

elif message.text.startswith('/comb'):
    # ... code ...

或者您可以拆分消息以获取命令和参数作为列表。

    cmd, *args = message.text.split(" ")
    
    if cmd == '/random':
       # ... code ...

    elif cmd == '/comb':
        # ... code ...

如果没有参数,那么 args 将为空列表。


完整的工作代码:

因为 /random/comb 的某些代码相同,所以我将其移至单独的函数 send_question()

而且我将图像保存在全局变量中 - 它们不必在执行命令时一次又一次地创建。

import logging
from aiogram import Bot, Dispatcher, executor, types
import os
import random
import asyncio

API_TOKEN = os.getenv('TELEGRAM_TOKEN')
print(API_TOKEN)

# Configure logging
logging.basicConfig(level=logging.INFO)

# Initialize bot and dispatcher
bot = Bot(token=API_TOKEN)
dp = Dispatcher(bot)

# ------------------------------------------

def emojize(x):
    return x

async def send_question(message, all_photos):
    
    captions = ["Nice problem!", "Niceeeeee :eyes:", "Noice", "Very cool"]
    caption = random.choice(captions)
    print('caption:', caption)

    image = random.choice(all_photos)
    print('image:', image)

    with open(image, 'rb') as f:
        photo = f.read()

    asyncio.create_task(fetch_cat())

    await bot.send_photo(chat_id=message.chat.id,
                         photo=photo,
                         caption=emojize(caption) if caption == captions[1] else caption,
                         reply_to_message_id=message.message_id)

# ------------------------------------------

random_photos = ["quest1.jpg", "quest2.jpg", "quest3.jpg", "quest4.jpg",
                 "quest5.jpg", "quest6.jpg", "quest7.jpg", "quest8.jpg",
                 "quest9.jpg", "quest10.jpg", "quest11.jpg", "quest12.jpg"]            

comb_photos = ["quest14.jpg", "quest15.jpg"]
    
@dp.message_handler(commands=['random', 'comb'])
async def random_cat(message: types.Message):

    print(message.text)
    #print(dp.message_handler(commands=['random']))
    
    cmd, *args = message.text.split(" ")
    print(cmd, args)
    
    if cmd.startswith('/random'):
        await send_question(message, random_photos)
    elif cmd.startswith('/comb'):
        await send_question(message, comb_photos)

# ------------------------------------------

if __name__ == '__main__':
    executor.start_polling(dp, skip_updates=True)

编辑:

你也可以运行它作为两个独立的函数

@dp.message_handler(commands=['random'])
async def random_cat(message: types.Message):
    
    await send_question(message, random_photos)

@dp.message_handler(commands=['comb'])
async def random_cat(message: types.Message):

    await send_question(message, comb_photos)