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

Telegram数据库机器人信息展示故障及多词参数匹配问题

解决Telegram机器人多词产品名称提取与查询无响应问题

问题根源

  1. 参数提取失败:原代码用re.match(" .*", event.message.text)提取产品名,但re.match仅从字符串开头匹配,而用户输入格式为/mostra 产品名称,开头是命令前缀,导致匹配返回None,传入SQL后触发异常,机器人无响应。
  2. 多词参数丢失:改用split取list_of_words[1]仅能获取首个单词,无法处理带空格的多词产品名称(如「无线蓝牙耳机」),导致查询匹配失效。

修复方案

1. 正确提取完整参数

推荐使用正则捕获组在事件触发时直接获取命令后的完整内容,这是最可靠的方式:

  • 修改事件匹配规则为(?i)/mostra\s+(.*),其中(.*)会捕获命令后的所有字符(即完整产品名称)。
  • 通过event.pattern_match.group(1)提取捕获的参数,再去除前后空格。

2. 修复SQL查询逻辑

  • 替换REGEXP为LIKE(更适合模糊匹配产品名称,避免正则特殊字符干扰),如需精确匹配可改用=。
  • 移除不必要的conn.commit()(SELECT操作无需提交事务)。
  • 用查询结果的长度判断是否存在匹配项,而非依赖execute返回值。

3. 添加参数校验

防止用户仅输入命令前缀而未提供产品名称,提前提示用户补全信息。

完整修复代码

def create_message_select_query(ans):
    text = ""
    for i in ans:
        id = i[0]
        name = i[1]
        icon = i[2]
        # 修复原代码字符串拼接的语法错误
        text += f"id: <b>{str(id)}</b> | <b>{str(name)}</b> | <b>{str(icon)}</b>\n"
    message = "<b>Received 📖 </b> Information about orders:\n\n" + text
    return message

@client.on(events.NewMessage(pattern=r"(?i)/mostra\s+(.*)"))
async def show_product(event):
    try:
        sender = await event.get_sender()
        SENDER = sender.id
        # 提取完整产品名称并去除前后空格
        name = event.pattern_match.group(1).strip()
        
        # 校验是否输入产品名称
        if not name:
            await client.send_message(SENDER, "请输入要查询的产品名称", parse_mode='html')
            return
        
        # 模糊匹配产品名称(如需精确匹配,将f"%{name}%"改为name,SQL用=)
        sql_command = "SELECT * FROM unitsprova WHERE name LIKE %s LIMIT 1;"
        crsr.execute(sql_command, (f"%{name}%",))
        res = crsr.fetchall()
        
        if not res:
            text = f"未找到名称包含「{name}」的产品"
            await client.send_message(SENDER, text, parse_mode='html')
        else:
            text = create_message_select_query(res)
            await client.send_message(SENDER, text, parse_mode='html')
            
    except Exception as e:
        print(f"调试错误: {e}")
        await client.send_message(SENDER, "查询出错,请稍后重试", parse_mode='html')
        return

额外说明

  • 如果必须使用split方法提取参数,可使用split(maxsplit=1)仅分割一次,再合并后续内容:
    parts = event.message.text.split(maxsplit=1)
    if len(parts) < 2:
        await client.send_message(SENDER, "请输入要查询的产品名称", parse_mode='html')
        return
    name = parts[1].strip()
    
  • 若需使用REGEXP进行正则匹配,需确保产品名称中的特殊字符已转义,避免SQL语法错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 00:01:28