PHP开发Telegram板球比分推送bot 新旧API比分对比逻辑失效排查
问题原因分析
- PHP的
session机制默认针对单次HTTP请求设计,依赖Cookie或请求参数传递session ID,在CLI模式下运行该常驻死循环脚本时,$_SESSION数组无法实现跨循环轮次的持久化存储,新旧比分对比逻辑自然无法生效。 - 首次运行脚本时
$_SESSION['old_score']未初始化,会抛出未定义索引的警告,干扰判断逻辑执行。 - 直接拼接比分内容调用Telegram接口没有做URL编码,若比分包含特殊字符(空格、&、?等)会导致接口请求失败,消息无法正常推送。
修复方案
将session存储替换为本地文件持久化存储,同时补充异常判断和URL编码逻辑,修复后代码如下:
<?php set_time_limit(0); $token = 'xyz'; $group_name = 'xyz'; // 定义存储旧比分的本地文件路径 $old_score_path = __DIR__ . '/last_score.txt'; while(true){ $ipl = @file_get_contents('https://cricket-api.vercel.app/cri.php?url=https://www.cricbuzz.com/live-cricket-scores/37632/dc-vs-csk-50th-match-indian-premier-league-2021'); $ipl_data = json_decode($ipl, true); $current_score = $ipl_data['livescore']['current'] ?? ''; // API返回异常时跳过本次循环 if (empty($current_score)) { sleep(10); continue; } // 读取本地存储的旧比分,文件不存在则默认值为空 $old_score = file_exists($old_score_path) ? trim(file_get_contents($old_score_path)) : ''; if($current_score != $old_score){ // 比分内容URL编码,避免特殊字符导致请求异常 $text = urlencode($current_score); $bot_api = "https://api.telegram.org/bot{$token}/sendMessage?chat_id={$group_name}&text={$text}"; @file_get_contents($bot_api); // 推送成功后更新本地存储的旧比分 file_put_contents($old_score_path, $current_score); } sleep(10); } ?>
补充注意事项
- 运行脚本前请确保PHP对脚本所在目录拥有写入权限,否则无法创建旧比分存储文件。
- 如果有多实例部署需求,可以替换为Redis这类内存数据库存储旧比分,性能更优。
- 可根据需要添加日志记录逻辑,方便排查接口请求、消息推送的异常问题。
内容的提问来源于stack exchange,提问作者Shakti Goyal
相关产品推荐
相关产品推荐

