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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 03:36:00