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
相关产品推荐
相关产品推荐

