PHP實現(xiàn)推送NBA賽事結(jié)果的方法:1、創(chuàng)建PHP文件并設置時區(qū);2、采用PHP發(fā)起請求聚合數(shù)據(jù)提供的NBA賽事API;3、通過解析接口返回到JSON;4、提取關注的NBA比賽結(jié)果;5、將結(jié)果信息通過聚合云推服務推送至我需要接收的終端即可。
php入門到就業(yè)線上直播課:進入學習
Apipost = Postman + Swagger + Mock + Jmeter 超好用的API調(diào)試工具:點擊使用
本教程操作環(huán)境:Windows7系統(tǒng)、PHP8.1版、DELL G3電腦
PHP實現(xiàn)NBA賽事結(jié)果即時推送
對于平時不能看NBA直播,但又希望第一時間知道喜歡的湖人隊的比賽結(jié)果。動動小手,簡單實現(xiàn)監(jiān)測湖人隊的比賽結(jié)果,發(fā)送到自己微信、郵箱、釘釘上面。
原理
采用PHP發(fā)起請求聚合數(shù)據(jù)提供的NBA賽事API,通過解析接口返回到JSON,提取我關注的湖人隊比賽結(jié)果,并將結(jié)果信息通過聚合云推服務推送至我需要接收的終端。
使用的服務
NBA賽事查詢接口: https://www.juhe.cn/docs/api/id/92?s=cpphpcn
消息推送服務: tui.juhe.cn
消息效果
如果監(jiān)測到關注的比賽結(jié)果,你在聚合云推配置的接收終端將會收到通知,類似如下:
釘釘機器人:
微信公眾號:
郵箱:
PHP代碼
<?php/** * PHP實現(xiàn)NBA賽事結(jié)果通知即時推送 *///設置時區(qū)if (PHP_VERSION >= '5.1') date_default_timezone_set('PRC'); $nba = new Nba(); $nba->run();class Nba{ // 關注的球隊列表 // private $teams = ['洛杉磯湖人', '布魯克林籃網(wǎng)']; private $teams = ['洛杉磯湖人']; // 開始執(zhí)行 public function run() { echo "開始監(jiān)測NBA今日賽程 - ". date("Y-m-d H:i:s") . PHP_EOL; // 查詢今日NBA比賽清單 $todayMatchsResult = $this->getMatchResult(); if ($todayMatchsResult['code'] == '1') { // 解析比賽結(jié)果,提取需要推送的比賽結(jié)果 $parseMatchsResult = $this->parseMatchs($todayMatchsResult['matchs']); if ($parseMatchsResult) { $this->pushMsg($parseMatchsResult); } else { echo "暫無比賽結(jié)果需要推送"; } } else { // 查詢失敗 echo $todayMatchsResult['msg']; } } /** * 將需要推送的比賽結(jié)果, 通過 聚合云推 推送至郵件、釘釘、微信等 * 聚合云推官網(wǎng): https://tui.juhe.cn/?f=nba * @param null $msgs */ private function pushMsg($msgs = null) { // 記錄已經(jīng)推送過的msg文件 $logFile = dirname(__FILE__).DIRECTORY_SEPARATOR."notify_log.txt"; $logContent = file_get_contents($logFile); $logList = explode("n", $logContent); // 在聚合云推個人中心獲取到的token $token = "cd513bd*******b7261e566a3"; // 在聚合云推創(chuàng)建的ServiceID $service_id = "1O***Ho"; // 自定義標題 $title = "NBA賽事結(jié)果"; $doc_type = "text"; foreach ($msgs as $m) { // 消息內(nèi)容MD5,簡單記錄本地文件,用于判斷是否已經(jīng)推送,避免重復 (當然也可以使用數(shù)據(jù)庫、緩存等手段) $mHash = md5($m); if (in_array($mHash, $logList)) { // 重復推送 echo "{$m},推送結(jié)果:999 - 已經(jīng)推送過,無需重復推送" . PHP_EOL; } else { // 開始推送 $params = [ 'token' => $token, 'service_id' => $service_id, 'title' => $title, 'doc_type' => $doc_type, 'content' => $m ]; $pushResContent = $this->juheHttpRequest('https://tui.juhe.cn/api/plus/pushApi', http_build_query($params), 1); $pushRes = json_decode($pushResContent, true); echo "{$m},推送結(jié)果:{$pushRes['code']} - {$pushRes['reason']}" . PHP_EOL; // 記錄log file_put_contents($logFile, $mHash, FILE_APPEND); } } } /** * 解析NBA比賽結(jié)果,提取關注的球隊比賽結(jié)果 * @param null $matchs */ private function parseMatchs($matchs = null) { $matchText = null; if ($matchs) { foreach ($matchs as $m) { if (in_array($m['team1'], $this->teams) || in_array($m['team2'], $this->teams)) { // 有關注的球隊且完賽 if ($m['status'] == '3') { // 整合比賽球隊和結(jié)果信息 $matchText[] = "{$m['team1']} {$m['team1_score']} - {$m['team2_score']} {$m['team2']}"; } } } } return $matchText; } /** * 查詢NBA今日比賽狀態(tài) * 通過聚合提供的接口,接口詳情:https://www.juhe.cn/docs/api/id/92?f=nba */ private function getMatchResult() { // NBA賽事接口地址 $apiUrl = 'http://apis.juhe.cn/fapig/nba/query'; // 接口地址請求Key, 自行替換 $apiKey = '69e76b5*********4b87690c8'; $params = [ 'key' => $apiKey ]; $requestContent = $this->juheHttpRequest($apiUrl, http_build_query($params)); $requestResult = json_decode($requestContent, true); if ($requestResult) { $errorCode = $requestResult['error_code']; if ($errorCode == 0) { // 請求成功 $matchs = isset($requestResult['result']['matchs']) ? $requestResult['result']['matchs'] : null; if ($matchs) { $todayMatchs = null; foreach ($matchs as $key => $match) { $matchDate = $match['date']; if ($matchDate == date("Y-m-d")) { // 今日比賽列表 $todayMatchs = $match['list']; break; } } // 返回比賽列表 return ['code' => '1', 'msg' => '請求成功', 'matchs' => $todayMatchs]; } else { // 無比賽記錄 return ['code' => '1', 'msg' => '請求成功', 'matchs' => null]; } } else { // 請求異常 return ['code' => '2', 'msg' => '請求異常:' . $errorCode, 'matchs' => null]; } } else { // 請求異常,可能網(wǎng)絡異常 return ['code' => '2', 'msg' => '請求異常:網(wǎng)絡異常', 'matchs' => null]; } } /** * 發(fā)起網(wǎng)絡請求函數(shù) * @param string $url 請求的URL * @param bool $params 請求的參數(shù)內(nèi)容 * @param int $ispost 是否POST請求 * @return bool|string 返回內(nèi)容 */ private function juheHttpRequest($url, $params = false, $ispost = 0) { // $httpInfo = []; $ch = curl_init(); curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1); curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.118 Safari/537.36'); curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 3); curl_setopt($ch, CURLOPT_TIMEOUT, 12); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); if ($ispost) { curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_POSTFIELDS, $params); curl_setopt($ch, CURLOPT_URL, $url); } else { if ($params) { curl_setopt($ch, CURLOPT_URL, $url . '?' . $params); } else { curl_setopt($ch, CURLOPT_URL, $url); } } $response = curl_exec($ch); if ($response === FALSE) { // echo "cURL Error: ".curl_error($ch); return false; } // $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); // $httpInfo = array_merge($httpInfo, curl_getinfo($ch)); curl_close($ch); return $response; } }
計劃任務配置
您可以通過crontab等方式定時(每分鐘)去執(zhí)行代碼監(jiān)測。
比如crontab配置方式:
命令行輸入crontab -e進入計劃任務配置
# 每分鐘執(zhí)行一次*/1 * * * * /usr/bin/php nba.php >> /data/log.txt
cat /data/log.txt
洛杉磯湖人 102 - 109 密爾沃基雄鹿,推送結(jié)果:200 - success 開始監(jiān)測NBA今日賽程 - 2021-11-18 18:41:00洛杉磯湖人 102 - 109 密爾沃基雄鹿,推送結(jié)果:999 - 已經(jīng)推送過,無需重復推送 開始監(jiān)測NBA今日賽程 - 2021-11-18 18:42:01洛杉磯湖人 102 - 109 密爾沃基雄鹿,推送結(jié)果:999 - 已經(jīng)推送過,無需重復推送 開始監(jiān)測NBA今日賽程 - 2021-11-18 18:42:39洛杉磯湖人 102 - 109 密爾沃基雄鹿,推送結(jié)果:999 - 已經(jīng)推送過,無需重復推送 開始監(jiān)測NBA今日賽程 - 2021-11-18 18:43:00洛杉磯湖人 102 - 109 密爾沃基雄鹿,推送結(jié)果:999 - 已經(jīng)推送過,無需重復推送
推薦學習:《PHP視頻教程》