电报机器人命令中的问题
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)
我正在创建一个以图像格式发送数学问题的机器人。我想为不同的命令创建两个两个函数,这样一个命令只发送一种类型的问题,而另一个发送另一种类型的问题。示例:/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)