0

0

如何在 Aiogram 中实现双用户配对与消息等待机制

花韻仙語

花韻仙語

发布时间:2026-02-19 20:14:07

|

535人浏览过

|

来源于php中文网

原创

如何在 Aiogram 中实现双用户配对与消息等待机制

本文介绍如何使用 aiogram 构建一个轻量级双用户配对系统:用户 a 启动会话后获得唯一配对码,用户 b 输入该码即完成绑定,双方随即建立单次通信通道,并支持状态持久化与自动清理。

本文介绍如何使用 aiogram 构建一个轻量级双用户配对系统:用户 a 启动会话后获得唯一配对码,用户 b 输入该码即完成绑定,双方随即建立单次通信通道,并支持状态持久化与自动清理。

在构建互动型 Telegram Bot(如双人问答、配对游戏或协作工具)时,常需让两个独立用户临时“连接”——例如用户 A 发起请求后,系统生成唯一配对码;用户 B 输入该码即触发事件,使 A 即时收到通知。这本质上是一个带状态的跨会话消息等待机制,不能依赖内存变量(易丢失),而应结合数据库实现可靠协调。

以下以 SQLite 为例,展示完整、健壮的实现方案(兼容 Aiogram 3.x):

塔猫ChatPPT
塔猫ChatPPT

塔猫官网提供AI一键生成 PPT的智能工具,帮助您快速制作出专业的PPT。塔猫ChatPPT让您的PPT制作更加简单高效。

下载

✅ 核心设计思路

  • 使用一张全局配对表 pairing_requests,存储待匹配的请求;
  • 每条记录包含:id(自增主键)、initiator_id(用户 A 的 user.id)、code(随机生成的唯一字符串)、status('pending' / 'matched')、created_at;
  • 不为每对用户动态建表(原文中 CREATE TABLE {user1_id + user2_id} 方案存在 SQL 注入风险、表名非法字符问题且难以维护),而是统一管理、索引优化。

? 示例代码(Aiogram 3 + SQLite)

import sqlite3
import random
from aiogram import Router, F
from aiogram.types import Message
from aiogram.filters import Command

router = Router()

# 初始化数据库(建议在 bot 启动时执行一次)
def init_db():
    conn = sqlite3.connect("bot.db")
    cur = conn.cursor()
    cur.execute("""
        CREATE TABLE IF NOT EXISTS pairing_requests (
            id INTEGER PRIMARY KEY AUTOINCREMENT,
            initiator_id INTEGER NOT NULL,
            code TEXT UNIQUE NOT NULL,
            status TEXT DEFAULT 'pending',
            created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
        )
    """)
    conn.commit()
    conn.close()

# 预定义词库(确保无重复、无敏感字符)
CODE_WORDS = ["loremipsum", "randomtext", "quantumflux", "nebulaforge", "stardustkey"]

@router.message(Command("start"))
async def cmd_start(message: Message):
    user_id = message.from_user.id
    code = random.choice(CODE_WORDS)

    # 存储配对请求
    conn = sqlite3.connect("bot.db")
    cur = conn.cursor()
    cur.execute(
        "INSERT INTO pairing_requests (initiator_id, code) VALUES (?, ?)",
        (user_id, code)
    )
    conn.commit()
    conn.close()

    await message.answer(
        f"✅ 已创建配对请求!\n请让另一位用户向本机器人发送以下指令:\n\n`/{code}`\n\n(注意:斜杠不可省略)",
        parse_mode="Markdown"
    )

@router.message(F.text.regexp(r"^/([a-zA-Z0-9]+)$"))
async def handle_code_command(message: Message):
    code = message.text[1:]  # 去掉开头的 '/'

    conn = sqlite3.connect("bot.db")
    cur = conn.cursor()
    cur.execute(
        "SELECT initiator_id FROM pairing_requests "
        "WHERE code = ? AND status = 'pending'",
        (code,)
    )
    row = cur.fetchone()

    if row:
        initiator_id = row[0]
        # 标记为已匹配(防止重复触发)
        cur.execute(
            "UPDATE pairing_requests SET status = 'matched' WHERE code = ?",
            (code,)
        )
        conn.commit()

        # 通知发起者
        await message.bot.send_message(
            chat_id=initiator_id,
            text=f"? 用户 `{message.from_user.id}` 已成功输入配对码 `{code}`!"
        )
        await message.answer("✅ 配对成功!对方已收到通知。")
    else:
        await message.answer("❌ 无效或已使用的配对码,请检查拼写或联系发起者。")

    conn.close()

⚠️ 关键注意事项

  • 安全性:避免直接拼接用户输入进 SQL(如原文 f'''CREATE TABLE {user1_id + user2_id}...);始终使用参数化查询。
  • 幂等性:通过 status 字段确保同一配对码仅触发一次响应,防止刷屏或重复通知。
  • 可扩展性:如需支持多轮配对或超时自动清理,可在表中增加 expires_at 字段,并配合后台任务定期清理过期记录。
  • 错误处理:生产环境应补充异常捕获(如数据库连接失败)、日志记录及用户友好提示。
  • 并发安全:SQLite 在多数 Bot 场景下足够,若并发极高,建议切换至 PostgreSQL 并加行级锁(SELECT ... FOR UPDATE)。

✅ 总结

该方案摒弃了动态建表等高风险做法,采用标准化关系模型,兼顾简洁性、可维护性与可靠性。通过 code 作为轻量级“握手凭证”,实现了跨用户、跨会话的状态同步——这是构建多人协作类 Bot 的基础能力。后续可基于此扩展为邀请链接、临时房间、双人投票等更复杂场景。

热门AI工具

更多
DeepSeek
DeepSeek

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

豆包大模型
豆包大模型

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

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

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

文心一言
文心一言

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

讯飞写作
讯飞写作

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

即梦AI
即梦AI

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

ChatGPT
ChatGPT

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

相关专题

更多
数据分析工具有哪些
数据分析工具有哪些

数据分析工具有Excel、SQL、Python、R、Tableau、Power BI、SAS、SPSS和MATLAB等。详细介绍:1、Excel,具有强大的计算和数据处理功能;2、SQL,可以进行数据查询、过滤、排序、聚合等操作;3、Python,拥有丰富的数据分析库;4、R,拥有丰富的统计分析库和图形库;5、Tableau,提供了直观易用的用户界面等等。

986

2023.10.12

SQL中distinct的用法
SQL中distinct的用法

SQL中distinct的语法是“SELECT DISTINCT column1, column2,...,FROM table_name;”。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

334

2023.10.27

SQL中months_between使用方法
SQL中months_between使用方法

在SQL中,MONTHS_BETWEEN 是一个常见的函数,用于计算两个日期之间的月份差。想了解更多SQL的相关内容,可以阅读本专题下面的文章。

377

2024.02.23

SQL出现5120错误解决方法
SQL出现5120错误解决方法

SQL Server错误5120是由于没有足够的权限来访问或操作指定的数据库或文件引起的。想了解更多sql错误的相关内容,可以阅读本专题下面的文章。

1739

2024.03.06

sql procedure语法错误解决方法
sql procedure语法错误解决方法

sql procedure语法错误解决办法:1、仔细检查错误消息;2、检查语法规则;3、检查括号和引号;4、检查变量和参数;5、检查关键字和函数;6、逐步调试;7、参考文档和示例。想了解更多语法错误的相关内容,可以阅读本专题下面的文章。

374

2024.03.06

oracle数据库运行sql方法
oracle数据库运行sql方法

运行sql步骤包括:打开sql plus工具并连接到数据库。在提示符下输入sql语句。按enter键运行该语句。查看结果,错误消息或退出sql plus。想了解更多oracle数据库的相关内容,可以阅读本专题下面的文章。

1292

2024.04.07

sql中where的含义
sql中where的含义

sql中where子句用于从表中过滤数据,它基于指定条件选择特定的行。想了解更多where的相关内容,可以阅读本专题下面的文章。

585

2024.04.29

sql中删除表的语句是什么
sql中删除表的语句是什么

sql中用于删除表的语句是drop table。语法为drop table table_name;该语句将永久删除指定表的表和数据。想了解更多sql的相关内容,可以阅读本专题下面的文章。

436

2024.04.29

pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法
pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法

本专题系统整理pixiv网页版官网入口及登录访问方式,涵盖官网登录页面直达路径、在线阅读入口及快速进入方法说明,帮助用户高效找到pixiv官方网站,实现便捷、安全的网页端浏览与账号登录体验。

660

2026.02.13

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
10分钟--Midjourney创作自己的漫画
10分钟--Midjourney创作自己的漫画

共1课时 | 0.1万人学习

Midjourney 关键词系列整合
Midjourney 关键词系列整合

共13课时 | 0.9万人学习

AI绘画教程
AI绘画教程

共2课时 | 0.2万人学习

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

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