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

Tweepy开发Twitter机器人时如何过滤@用户名解决WolframAlpha查询报错

Twitter数学答疑机器人@前缀过滤问题修复

场景说明

  • 基于Tweepy开发对接WolframAlpha API的Twitter数学答疑机器人
  • 触发规则:用户@机器人账号并附带数学表达式(示例:@Saketltd01 2+2),机器人自动返回计算结果
  • 现存问题:代码直接将包含@用户名的完整推文内容作为查询参数传入WolframAlpha接口,无效的账号前缀会导致接口查询报错,需要自动过滤@提及内容,仅提取有效数学表达式传入接口。

问题根因

原代码中查询参数直接取完整推文内容,未做内容清洗:

# 原问题代码:直接传入带@用户名的全文
query = mention.full_text.lower()

非数学语义的@账号内容传入计算接口后,会触发参数校验错误,同时原代码还存在冗余请求、回复内容未携带计算结果的隐性问题。

修复逻辑

  • 通过正则匹配剔除推文中所有@用户名格式的提及内容,去除多余空白字符得到纯数学查询表达式
  • 增加空查询校验,用户仅@机器人未输入数学题时直接跳过,避免无效接口请求
  • 移除冗余的重复拉取推文状态的代码
  • 修复回复逻辑,将计算结果放入回复内容中对用户可见

修复后完整代码

import re
# 其余原有导入(tweepy、wolframalpha、日志相关、Wallpaper工具类等)保持不变

def respondToTweet(file='tweet_ID.txt'):
    last_id = get_last_tweet(file)
    mentions = api.mentions_timeline(last_id, tweet_mode='extended')
    if len(mentions) == 0:
        return

    new_id = 0
    logger.info("someone mentioned me...")

    for mention in reversed(mentions):
        logger.info(str(mention.id) + '-' + mention.full_text)
        new_id = mention.id

        if '@saketltd01' in mention.full_text.lower():
            logger.info("Responding back with QOD to -{}".format(mention.id))
            # 清洗查询内容:剔除所有@用户名,去除前后空白
            query = re.sub(r'@\w+\s*', '', mention.full_text.lower()).strip()
            # 空查询直接跳过
            if not query:
                logger.info(f"Skip mention {mention.id}: no valid math expression provided")
                continue
            
            client = wolframalpha.Client(app_id)
            rest = client.query(query)
            answer = next(rest.results).text
            Wallpaper.get_wallpaper(answer)

            media = api.media_upload("created_image.png")

            logger.info("liking and replying to tweet")
            api.create_favorite(mention.id)
            # 修复原回复内容缺失计算结果的问题
            reply_content = f"@{mention.user.screen_name} 计算结果:{answer}"
            api.update_status(reply_content, mention.id, media_ids=[media.media_id])

    put_last_tweet(file, new_id)


def main():
    respondToTweet()

关键代码说明

  • 核心清洗逻辑re.sub(r'@\w+\s*', '', mention.full_text.lower()).strip():正则@\w+会匹配所有@开头的Twitter用户名,\s*会同步匹配用户名后跟随的空格,避免剔除用户名后残留多余空白,最后用strip()清理首尾的换行、空格字符。
  • 该逻辑可兼容推文中多个@用户的场景(比如用户同时@其他好友+@机器人发题),所有@提及都会被过滤,不会影响数学表达式的提取。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 17:03:24