imcys.com
遵从中二的召唤,来吧少年!
2019-nCoV疫情监控接口的制作教程

前言

不久前,我在哔哩哔哩更新了一则制作疫情监控接口的视频,当然,那期视频说的东西比较简单,如果想了解可以去看。 点击前往

当然,因为我之前没给大家教一些基础的东西,大家看着表示很迷,这期视频也不理想,所以,我把自己进阶接口源码发到这里吧。【我都怕自己忘了怎么写】

爬取准备

做一个这样的接口,我们肯定不能去自己产生这样的数据然后发布,这样显然是不合适的,但是,我们可以去爬取一些权威的网站,来给自己做接口。

接口选择

这里,我们选择的是搜狗的,因为他不仅仅可以返回疫情的信息,还可以返回疫情地图,这是非常棒的。另外,搜狗的数据更新也是很快,为了让大家能以最快速度获取到信息,这次我们选搜狗接口

这些是对搜狗疫情页面源码的分析,下面源码会提到怎么样去获取这个json

源代码解释

全国疫情数据返回接口

本代码又其改进 新增市区精确
最初代码作者 https://imwcr.cn/

<?php
//函数部分 类似正则表达式但更精确的取中间字符串
//因为搜狗的json在网页源码当中,所有需要找个函数把不必要的东西去掉,只留下json
function getSubstr($str, $leftStr, $rightStr)
{
    $left = strpos($str, $leftStr);
    //echo '左边:'.$left;
    $right = strpos($str, $rightStr,$left);
    //echo '<br>右边:'.$right;
    if($left < 0 or $right < $left) return '';
    return substr($str, $left + strlen($leftStr), $right-$left-strlen($leftStr));
}
//ssl获取网页源码
function curl_get_https($url)
	{
		$curl = curl_init();
		curl_setopt($curl, CURLOPT_URL, $url);
		curl_setopt($curl, CURLOPT_HEADER, 0);
		curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
		curl_setopt($curl, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.186 Safari/537.36');
		curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);  
		curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false); 
		$tmpInfo = curl_exec($curl); 
		curl_close($curl);
		return $tmpInfo;
	}

//搜狗接口地址
$url="http://sa.sogou.com/new-weball/page/sgs/epidemic";
$data=curl_get_https($url);//获取数据
$data=getSubstr($data,"window.__INITIAL_STATE__ =","</script>");
//解析分析
$data = json_decode($data, true);
//返回时间数据
echo $data["data"]["domesticStats"]["times"]."\r\n";
//对腾讯接口处理
$json_string = file_get_contents("https://view.inews.qq.com/g2/getOnsInfo?name=disease_h5");
$json = json_decode($json_string, true);
$json =  $json['data'];
$json = json_decode($json, true);
$json_time = $json['lastUpdateTime'];
//将腾讯和搜狗的数据结合,弥补搜狗数据片面不足
//输出所有数据

//这个是图片地址输出
echo "±img=".$data["data"]["mapStats"]["mapUrl"]."±";
//信息输出
echo "全国累计确".$data["data"]["domesticStats"]["diagnosed"];
echo " (较昨日+".$data["data"]["domesticStats"]["yesterdayIncreased"]["diagnosed"].")\r\n";
echo "当前疑似".$data["data"]["domesticStats"]["suspect"];
echo " (较昨日+".$data["data"]["domesticStats"]["yesterdayIncreased"]["suspect"].")\r\n";
echo "全国累计死亡".$data["data"]["domesticStats"]["death"];
echo " (较昨日+".$data["data"]["domesticStats"]["yesterdayIncreased"]["death"].")\r\n";
echo "全国累计救治".$data["data"]["domesticStats"]["cured"];
echo " (较昨日+".$data["data"]["domesticStats"]["yesterdayIncreased"]["cured"].")\r\n";
echo "境外输入:".$json['chinaTotal']['importedCase'].
"\n无症状感染者:".$json['chinaTotal']['noInfect'].
"\n疫情防控靠大家,联防联控 构筑群防群治抵御疫情的严密防线。";

如你看到的,我们可以对这个接口进行一个简单的json,就能获取到我们需要的值/

省区数据接口

$data=curl_get_https($url);//获取数据
$data=getSubstr($data,"window.__INITIAL_STATE__ =","</script>");
$data = json_decode($data, true);
$area=array();
$area=$data["data"]["area"];
$so = $_GET["type"];
$dq = $_GET["dq"]; 
//地区划分
//这里是在做什么?这里,我们把数据给一个临时的遍历函数,让它去匹配['provinceName']的值在哪些子项里会满足用户搜索的省区$_GET["type"]的参数值

$data = array_filter($area, function($t) use ($so) { return $t['provinceName'] == $so; });
//提取第一个数据
$data=array_shift($data);
//将这个数组的值输出
echo $catdir_so."信息\n";
echo "现存确诊".$data["currentConfirmedCount"]."\r\n";
echo "累计确诊".$data["confirmedCount"];
echo " (较昨日+".$data["yesterdayIncreased"]["confirmedCount"].")\r\n";
echo "累计死亡".$data["deadCount"];
echo " (较昨日+".$data["yesterdayIncreased"]["deadCount"].")\r\n";
echo "累计救助".$data["curedCount"];
echo " (较昨日+".$data["yesterdayIncreased"]["curedCount"].")\r\n";
echo "\n疫情防控靠大家,联防联控 构筑群防群治抵御疫情的严密防线。";

这个实际上我们使用了一个至关重要的函数array_filter(),回调函数过滤数组中的元素,这就为我们省去了很多功夫,你不必再去对数据截取分析,而是直接用函数来返回这些值,这样能大幅提高开发效率和接口的处理速度。

我们的思想是,先把数据抽出来,然后去写一个函数,这个函数来把每个列表子项的一个元素,去对比你设计传入函数的元素,直到全部筛选出来,然后返回这些素组,这时,我们只需要利用返回的数组,去解析返回数据,等于我们直接拿到了需要的数据文件。

市区精确 改进新增

//大区查询
$area = array();
$area = $data["data"]["area"];
$so = $_GET["type"];
$data = array_filter($area, function ($t) use ($so) {
return $t['provinceName'] == $so;
});
$data = array_shift($data);
if (!empty($data)) {
echo $catdir_so . "信息\n";
echo "现存确诊" . $data["currentConfirmedCount"] . "\r\n";
echo "累计确诊" . $data["confirmedCount"];
echo " (较昨日+" . $data["yesterdayIncreased"]["confirmedCount"] . ")\r\n";
echo "累计死亡" . $data["deadCount"];
echo " (较昨日+" . $data["yesterdayIncreased"]["deadCount"] . ")\r\n";
echo "累计救助" . $data["curedCount"];
echo " (较昨日+" . $data["yesterdayIncreased"]["curedCount"] . ")\r\n";
echo "\n疫情防控靠大家,联防联控 构筑群防群治抵御疫情的严密防线。";
} else {
echo "请输入省名 市区查询";
}

文末

这个教程就到这里了,因为我php懂的太浅,没办法细说,大家就多看源码,去理解,那么这篇文章就到这里啦!!!

萌新杰少

文章作者

I im CYS,一个热爱二次元的高中生开发者

发表评论

textsms
account_circle
email

萌新杰少の秘密基地

2019-nCoV疫情监控接口的制作教程
不久前,我在哔哩哔哩更新了一则制作疫情监控接口的视频,当然,那期视频说的东西比较简单,如果想了解可以去看。当然,因为我之前没给大家教一些基础的东西,大家看着表示很迷,这期视频也不理想,所以,我把自己进阶接口源码发到这里吧。
扫描二维码继续阅读
2020-07-01