如何让Telegram Bot在板球比分更新时自动推送消息至群组
解决方案
核心问题原因
你之前用while+sleep的方案存在先天缺陷:PHP网页触发的脚本默认有最大执行时间限制,即便是CLI模式下的死循环也容易因为内存泄漏、网络波动导致进程崩溃,没有自动恢复机制,稳定性极差。
最优实现方案:定时任务+状态缓存
这个方案实现简单、稳定性高,完全没有超时问题,适配你的需求。
第一步:修改PHP业务脚本
核心逻辑是新增本地缓存存储上一次推送的比分,只有当新拉取的比分和缓存不一致时才推送消息,避免重复刷屏。
<?php $token = 'xyz'; $group_name = 'xyz'; // 定义缓存文件路径,用于存储上一次推送的比分 $cache_file = './last_score.txt'; // 读取上一次的比分 $last_score = ''; if (file_exists($cache_file)) { $last_score = trim(file_get_contents($cache_file)); } // 请求赛事API,加容错处理 $ipl = @file_get_contents('https://cricket-api.vercel.app/cri.php?url=https://www.cricbuzz.com/live-cricket-scores/37631/kkr-vs-srh-49th-match-indian-premier-league-2021'); if (!$ipl) { exit; // 请求失败直接退出,下次再跑 } $ipl_data = json_decode($ipl, true); if (!$ipl_data || !isset($ipl_data['livescore']['current'])) { exit; // 数据解析失败直接退出 } $current_score = $ipl_data['livescore']['current']; // 比分变化才推送 if ($current_score !== $last_score) { // 比分内容要url编码,避免特殊字符导致发送失败 $text = urlencode($current_score); $bot_url = "https://api.telegram.org/bot{$token}/sendMessage?chat_id={$group_name}&text={$text}"; @file_get_contents($bot_url); // 更新缓存 file_put_contents($cache_file, $current_score); } ?>
第二步:配置定时任务
Linux系统直接用crontab配置定时执行脚本即可,不需要手动跑死循环:
- 先获取你的PHP执行路径,执行命令
which php得到路径比如/usr/bin/php - 执行
crontab -e编辑定时任务 - 新增以下配置(示例为每分钟执行1次,可根据需求调整频率):
* * * * * /usr/bin/php /你的脚本完整路径/cricket_bot.php > /dev/null 2>&1
如果需要30秒执行一次,可以新增两条规则:
* * * * * /usr/bin/php /你的脚本完整路径/cricket_bot.php > /dev/null 2>&1 * * * * * sleep 30; /usr/bin/php /你的脚本完整路径/cricket_bot.php > /dev/null 2>&1
注意事项
- 要给缓存文件所在目录开读写权限,避免无法写入缓存
- 赛事结束后可以手动关闭定时任务,避免无效请求
- 如果需要更高的稳定性,可以增加日志记录,排查请求失败、发送失败的问题
内容的提问来源于stack exchange,提问作者Shakti Goyal
相关产品推荐
相关产品推荐

