You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

关键修改说明

  1. 替换全局变量为用户状态字典:用user_image_processing字典存储每个用户的处理状态,彻底解决多用户操作冲突问题。
  2. 合并消息处理逻辑:删除冗余的gpt_answer和process_user_input函数,统一用message_router路由消息,先判断是否在图片流程,再处理ChatGPT逻辑。
  3. 修正作用域问题:所有状态操作都针对用户ID对应的字典项,无需全局变量声明,避免局部变量覆盖全局变量的错误。
  4. 移除重复命令处理:保留单独的@dp.message_handler(commands=['image'])处理/image命令,删除gpt_answer中的重复判断,简化逻辑。

内容的提问来源于stack exchange,提问作者giwi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 18:22:48