Telegram ChatGPT机器人与/image命令共存问题求助
Telegram ChatGPT机器人与/image命令冲突的修复方案
核心问题分析
- 消息处理器重复注册:两个无过滤条件的
@dp.message_handler()会导致消息处理逻辑混乱,process_user_input无法正常接收用户输入。 - 全局变量作用域错误:
images函数中未声明global is_image_processing,修改的是局部变量,全局状态未更新,导致gpt_answer的判断失效。 - 多用户状态冲突:全局变量无法区分不同用户的处理流程,多用户同时操作会互相干扰。
- /image命令重复处理:
gpt_answer和images都处理/image命令,逻辑冗余且易引发冲突。
修复后的完整代码
# 用字典存储每个用户的图片处理状态,key为用户ID,value标记是否处于图片流程 user_image_processing = {} @dp.message_handler(commands=['image']) async def images(message: types.Message): user_id = message.from_user.id # 标记当前用户进入图片处理流程 user_image_processing[user_id] = True image_zapiska() zapiska() ins1 = InlineKeyboardButton('256x256', callback_data='size_256x256') ins2 = InlineKeyboardButton('512x512', callback_data='size_512x512') ins3 = InlineKeyboardButton('1024x1024', callback_data='size_1024x1024') keyboard = InlineKeyboardMarkup().add(ins1, ins2, ins3) await message.reply("Выберите размеры изображения:", reply_markup=keyboard) @dp.callback_query_handler(lambda c: c.data.startswith('size_')) async def process_callback_size(callback_query: types.CallbackQuery): size = callback_query.data.split('_')[1] await bot.answer_callback_query(callback_query.id) inn1 = InlineKeyboardButton('1', callback_data='num_1') inn2 = InlineKeyboardButton('2', callback_data='num_2') inn3 = InlineKeyboardButton('3', callback_data='num_3') inn4 = InlineKeyboardButton('4', callback_data='num_4') keyboard = InlineKeyboardMarkup().add(inn1, inn2, inn3, inn4) await bot.edit_message_text( chat_id=callback_query.message.chat.id, message_id=callback_query.message.message_id, text=f'Размер изображения: {size}\nВыберите количество изображений:', reply_markup=keyboard ) @dp.callback_query_handler(lambda c: c.data.startswith('num_')) async def process_callback_num(callback_query: types.CallbackQuery): user_id = callback_query.from_user.id count = callback_query.data.split('_')[1] await bot.answer_callback_query(callback_query.id) await bot.send_message( chat_id=callback_query.message.chat.id, text=f'Выбрано количество изображений: {count} \nвведите запрос:' ) # 确保用户状态处于图片处理流程 user_image_processing[user_id] = True @dp.message_handler() async def message_router(message: types.Message): user_id = message.from_user.id # 优先处理图片流程的用户输入 if user_image_processing.get(user_id, False): prompt = message.text print(prompt) # 这里添加调用Dall·e生成并发送图片的逻辑 # 示例:await bot.send_photo(chat_id=message.chat.id, photo=generated_image_url) # 完成后结束当前用户的图片处理流程 del user_image_processing[user_id] return # 处理ChatGPT对话逻辑(保留你原来的无错误代码) # the rest of the code has no errors in it
关键修改说明
- 替换全局变量为用户状态字典:用
user_image_processing字典存储每个用户的处理状态,彻底解决多用户操作冲突问题。 - 合并消息处理逻辑:删除冗余的
gpt_answer和process_user_input函数,统一用message_router路由消息,先判断是否在图片流程,再处理ChatGPT逻辑。 - 修正作用域问题:所有状态操作都针对用户ID对应的字典项,无需全局变量声明,避免局部变量覆盖全局变量的错误。
- 移除重复命令处理:保留单独的
@dp.message_handler(commands=['image'])处理/image命令,删除gpt_answer中的重复判断,简化逻辑。
内容的提问来源于stack exchange,提问作者giwi
相关产品推荐
相关产品推荐

