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

基于MLB实时API开发本垒打Twitter Bot的技术问题求助

大都会本垒打自动发推机器人开发方案

不用完全重构现有逻辑,补充Python基础的集合操作、正则写法知识就能解决全部问题,不需要一开始就上复杂的JSON结构化解析。


问题1:避免重复触发已处理的历史得分事件

核心思路是加一层已处理事件的去重判断,不需要改API调用逻辑,实现步骤:

  • 先把接口返回的整段比赛日志,按固定格式的计分板行拆成单个独立的进攻事件,你拿到的日志里每个事件结束后都会跟着Top/Bottom X - 队伍名: 分数格式的计分板,用这个当分隔符拆分准确率最高,不要按空行拆分。
  • 初始化一个集合变量存储已经处理过的事件,每次轮询拿到新日志后,逐个检查拆分出来的事件:如果事件没在已处理集合里,才进入本垒打检测流程,检测完成后不管有没有触发发推,都把这个事件加入已处理集合。
  • 如果需要程序重启后也不重复触发,把已处理集合定期存到本地文件,启动时读回内存即可。

拆分事件的参考代码:

import re
# 存储已处理事件,程序启动时可从本地文件加载历史记录
processed_plays = set()

def split_game_to_plays(game_log: str) -> list:
    # 匹配计分板行作为分隔符拆分事件
    raw_splits = re.split(r'\n(?:Top|Bottom) \d+ - .*?\n', game_log)
    # 过滤空内容,返回清洗后的独立事件列表
    return [play.strip() for play in raw_splits if play.strip()]

问题2:仅匹配大都会球员打出的本垒打

你之前直接把球员列表和字符串拼接的写法是错误的,Python列表不能直接和字符串做加法,正确的正则写法如下:

  • 提前把大都会球员名单转义后拼接成正则的「或匹配」规则,注意对名字里的特殊字符(比如J.D. Davis里的.)做转义,避免正则误匹配。
  • 匹配规则限定为事件开头出现大都会球员名+后续内容包含homer关键词——因为每个进攻事件的开头第一个名字一定是当前的打者,后面提到的都是跑垒员、防守球员,这个规则可以100%过滤掉其他队伍的本垒打事件,不会出现误判。

正则初始化和检测逻辑参考代码:

# 提前编译正则,提升匹配效率
player_match_part = '|'.join(re.escape(name) for name in mets_players_saved)
homer_pattern = re.compile(rf'^({player_match_part}).*?\bhomer', re.IGNORECASE)

把两个逻辑整合后的完整检测函数:

def mets_homerun_finder(todays_game_log: str):
    all_plays = split_game_to_plays(todays_game_log)
    for play in all_plays:
        # 跳过已处理过的事件
        if play in processed_plays:
            continue
        # 标记为已处理
        processed_plays.add(play)
        # 检测是否为大都会球员本垒打
        if homer_pattern.search(play):
            # 可直接把事件内容拼入推文,比固定文案信息更全
            api.update_status(f"🚨大都会本垒打!\n{play}")

设计思路调整建议

不需要推翻当前基于格式化字符串的实现逻辑硬改JSON解析,你遇到的两个问题都属于Python基础语法的应用场景,补完对应知识点就能快速跑通最小可用版本。等后续需要加更多复杂功能(比如投手信息、打点统计、本垒打距离)的时候,再切换到结构化JSON数据解析也完全不迟。


内容的提问来源于stack exchange,提问作者roe-men

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 14:06:31