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

