0

0

使用 Aiogram 构建多聊天 Telegram 机器人时状态管理问题

心靈之曲

心靈之曲

发布时间:2025-08-24 17:42:01

|

680人浏览过

|

来源于php中文网

原创

使用 aiogram 构建多聊天 telegram 机器人时状态管理问题

本文档旨在解决在使用 Aiogram 构建多聊天 Telegram 机器人时,由于不恰当的状态管理导致后续聊天无法使用机器人功能的问题。通过分析问题代码,明确状态设置的必要性,并提供修改后的代码示例,帮助开发者避免类似问题,提升机器人用户体验。

在使用 Aiogram 构建 Telegram 机器人时,状态管理是一个重要的概念,它允许机器人记住用户的上下文信息,并根据不同的状态执行不同的操作。然而,不恰当的状态管理可能会导致意想不到的问题,例如,多个聊天室中的用户在使用相同命令时,机器人可能会进入错误的状态,导致后续交互异常。

问题分析

原始代码中,在 /help 命令的处理函数 help 中,使用了 await AnswerState.helpInfo.set() 来设置状态。这个状态的目的是什么?从后续代码来看,这个状态似乎并没有实际用途,因为在 help_handler_answer 函数中,只是简单地更新了状态数据,并没有依赖这个状态进行任何逻辑判断。

更重要的是,这个状态的设置会影响到其他聊天室的用户。当一个聊天室的用户触发了 /help 命令后,机器人会进入 AnswerState.helpInfo 状态。如果此时另一个聊天室的用户也尝试使用 /help 命令,由于机器人已经处于 AnswerState.helpInfo 状态,这个新的 /help 命令将不会被 help 函数处理,而是会被状态处理器处理,导致功能失效。

解决方案

解决这个问题的方法很简单:移除 await AnswerState.helpInfo.set() 这行代码。因为如上文分析,这个状态的设置并没有实际用途。

修改后的 help 函数如下:

help_cb = CallbackData("help",'SenderId', "SenderName", 'action')
appeal_cb = CallbackData("appeal",'SenderId', 'action')

@dp.message_handler(commands="help")
async def help(message: types.Message):
    print("help")
    result = await db.check_if_allow(message.chat.id)
    if not result:
        await message.answer("Поки-що вам не дозволено відправляти запити про допогу. Спробуйте пізніше")
    else:
        if len(message.text) < 3:
            await message.answer("Опишіть вашу проблему детальніше.")
        else:
            forms, form = await db.get_chats_name(message.chat.id)
            await db.update_cooldown(message.chat.id)

            markup = InlineKeyboardMarkup()
            markup.add(InlineKeyboardButton("? Відповісти", callback_data=help_cb.new(SenderId = message.chat.id, SenderName = form[0],  action='answer')))
            markup.add(InlineKeyboardButton("?️ Видалити", callback_data=help_cb.new(SenderId = message.chat.id, SenderName = form[0], action='delete')))
            markup.add(InlineKeyboardButton("⛔ Поскаржитися", callback_data=help_cb.new(SenderId = message.chat.id, SenderName = form[0], action='appeal')))

            await message.answer("Запит на допомогу успішно надіслана")

            text = f"<b>? Новий запит про допомогу!</b>\nКлас: {form[0]}\nЗапитання: {message.text}"

            for form in forms:
                await bot.send_message(form[0], text=text, reply_markup = markup)

            # await AnswerState.helpInfo.set() # 移除这行代码

进一步优化

虽然移除 await AnswerState.helpInfo.set() 可以解决问题,但仍然可以对代码进行一些优化,使其更清晰易懂。例如,可以将 helpInfo 数据直接存储在 help_handler_answer 函数中,而不是通过状态来传递。

Boba.video
Boba.video

AI动漫视频生成器

下载

修改后的 help_handler_answer 函数如下:

@dp.callback_query_handler(help_cb.filter(action='answer'))
async def help_handler_answer(query: CallbackQuery, callback_data: dict, state: FSMContext):
    print("answer")
    # await state.update_data(helpInfo = [callback_data["SenderId"], callback_data["SenderName"]]) # 移除这行代码
    text = f"<b>Введіть відповідь на запитання</b>"
    await query.message.edit_reply_markup(None)
    await query.answer(text=text)
    # await AnswerState.text.set() # 移除这行代码
    await state.update_data(sender_id=callback_data["SenderId"], sender_name=callback_data["SenderName"])
    await AnswerState.text.set()

并修改 process_title 函数:

@dp.message_handler(state=AnswerState.text)
async def process_title(message: Message, state: FSMContext):
    print("text")
    if len(message.text) < 3:
        await message.answer("В пояснені напишіть більше 2 слів.")
    else:
        await state.update_data(text = message.text)
        data = await state.get_data()

        await message.answer(f"<b>{data['sender_name']} щиро вдячний за допомогу!</b>")
        await state.finish()
        await bot.send_message(chat_id=data["sender_id"], text=f"<b>? Відповідь отримана!</b>\n\n{message.text}")

注意事项:

  • 确保理解 Aiogram 的状态管理机制,避免滥用状态。
  • 仔细分析代码逻辑,明确每个状态的用途。
  • 在多聊天机器人开发中,要特别注意状态隔离,避免不同聊天室之间的状态冲突。

总结:

通过本文的分析和修改,可以解决在使用 Aiogram 构建多聊天 Telegram 机器人时,由于不恰当的状态管理导致后续聊天无法使用机器人功能的问题。理解状态管理的原理,并根据实际需求合理使用状态,是构建稳定可靠的 Telegram 机器人的关键。在调试过程中,可以利用 print 语句或日志记录来跟踪状态变化,帮助定位问题。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
python中print函数的用法
python中print函数的用法

python中print函数的语法是“print(value1, value2, ..., sep=' ', end=' ', file=sys.stdout, flush=False)”。本专题为大家提供print相关的文章、下载、课程内容,供大家免费下载体验。

193

2023.09.27

python print用法与作用
python print用法与作用

本专题整合了python print的用法、作用、函数功能相关内容,阅读专题下面的文章了解更多详细教程。

19

2026.02.03

bootstrap安装教程
bootstrap安装教程

本专题整合了bootstrap安装相关教程,阅读专题下面的文章了解更多详细操作教程。

22

2026.03.18

bootstrap框架介绍
bootstrap框架介绍

本专题整合了bootstrap框架相关介绍,阅读专题下面的文章了解更多详细内容。

137

2026.03.18

vscode 格式化
vscode 格式化

本专题整合了vscode格式化相关内容,阅读专题下面的文章了解更多详细内容。

13

2026.03.18

vscode设置中文教程
vscode设置中文教程

本专题整合了vscode设置中文相关内容,阅读专题下面的文章了解更多详细教程。

8

2026.03.18

vscode更新教程合集
vscode更新教程合集

本专题整合了vscode更新相关内容,阅读专题下面的文章了解更多详细教程。

8

2026.03.18

Gemini网页版零基础入门:5分钟上手Gemini聊天指南
Gemini网页版零基础入门:5分钟上手Gemini聊天指南

本专题专为零基础用户打造,5分钟快速掌握Gemini网页版核心用法。从账号登录到界面布局,详解如何发起对话、优化提示词及利用多模态功能。通过实战案例,教你高效获取信息、创作内容与分析数据。无论学习还是工作,轻松开启AI辅助新时代,让Gemini成为你的得力智能助手。

51

2026.03.18

Python WebSocket实时通信与异步服务开发实践
Python WebSocket实时通信与异步服务开发实践

本专题聚焦 Python 在实时通信场景中的开发实践,系统讲解 WebSocket 协议原理、长连接管理、消息推送机制以及异步服务架构设计。内容包括客户端与服务端通信实现、连接稳定性优化、消息队列集成及高并发处理策略。通过完整案例,帮助开发者构建高效稳定的实时通信系统,适用于聊天应用、实时数据推送等场景。

33

2026.03.18

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Sass 教程
Sass 教程

共14课时 | 1.0万人学习

PHP入门速学(台湾同胞版)
PHP入门速学(台湾同胞版)

共10课时 | 1.3万人学习

韩顺平 2016年 最新PHP基础视频教程
韩顺平 2016年 最新PHP基础视频教程

共47课时 | 10.7万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号