微信精选是一个常见的接口api。在此例中,将实现一个回复公众号关键字,实现“全网”文章查询功能。有兴趣的读者可关注本号自己试试。如图。
拥有回退功能
但是呢,免费找的接口大多数坑特别多。本文将采坑记录如右。
对于一般的API接口,接入微信的操作是:精读接口文档,组织数据,最后是接入微信。
申请地址 https://www.showapi.com/api/view/181
主要的请求字段为:
这个rand默认随机即可。page和size可以设定。
根据上一个SDK实现的框架,继续借用。
只要分消息类型text和default即可。
//响应消息
public function responseMsg(){
$postStr=$GLOBALS['HTTP_RAW_POST_DATA'];
if(!empty($postStr)){
// $this->logger("R \r\n.postStr");
$postObj=simplexml_load_string($postStr,'SimpleXMLElement',LIBXML_NOCDATA);
$RX_TYPE=trim($postObj->MsgType);
//消息类型分类
switch ($RX_TYPE) {
case 'text'://文本
$result=$this->receiveText($postObj);
break;
default:
$result='未知的消息类型。';
break;
}
echo $result;
}else{
echo '';
}
}
数据是通过在后端发送get请求到接口,实现的查询。这意味着你将要组装必须字段,必要时还需要加密。
在php方法中, $result=file_get_contents($targetUrl);
可实现GET请求。
json_decode($result,true)
就是转化JSON,第二个参数为true时返回全数组 。
//响应消息
public function responseMsg(){
$postStr=$GLOBALS['HTTP_RAW_POST_DATA'];
if(!empty($postStr)){
// $this->logger("R \r\n.postStr");
$postObj=simplexml_load_string($postStr,'SimpleXMLElement',LIBXML_NOCDATA);
$RX_TYPE=trim($postObj->MsgType);
//消息类型分类
switch ($RX_TYPE) {
case 'text'://文本
$result=$this->receiveText($postObj);
break;
default:
$result='未知的消息类型。';
break;
}
// $this->logger("T \r\n".$result);
echo $result;
}else{
echo '';
}
}
//文本消息
private function receiveText($object){
$url="http://route.showapi.com/181-1?showapi_appid=%s&showapi_sign=%s&num=%s&page=%s&src=%s&word=%s";
$showapi_appid="68609";
$showapi_sign="82b3adaa210d4c8aa907d98d3e888a1a";
$src="人民日报";
$page="1";
$num="5";
$word=trim($object->Content);
$targetUrl=sprintf($url,$showapi_appid,$showapi_sign,$num,$page,$src,$word);
$result = file_get_contents($targetUrl);
$result=json_decode($result,true);//第二个参数为true时返回全数组
$content=array();
if($result['showapi_res_body']['code']=='200'){
$content= $result['showapi_res_body']['newslist'];
$result=$this->transmitNews($object,$content);
}else{
$content=$result['showapi_res_body']['msg'];
$result=$this->transmitText($object,$content);
}
return $result;
}
对于查询不到的数据,应该告诉用户是什么原因。
用回之前的模板即可。
//回复图文消息
private function transmitNews($object,$content){
if(!is_array($content)){
return "";
}
$itemTpl="
<item>
<Title><![CDATA[%s]]></Title>
<Description><![CDATA[%s]]></Description>
<PicUrl><![CDATA[%s]]></PicUrl>
<Url><![CDATA[%s]]></Url>
</item>
";
$item_str="";
foreach ($content as $item){
$item_str.=sprintf($itemTpl, $item['title'], $item['description'], $item['picUrl'], $item['url']);
}
$xmlTpl = "<xml>
<ToUserName><![CDATA[%s]]></ToUserName>
<FromUserName><![CDATA[%s]]></FromUserName>
<CreateTime>%s</CreateTime>
<MsgType><![CDATA[news]]></MsgType>
<ArticleCount>%s</ArticleCount>
<Articles>
$item_str
</Articles>
</xml>";
$result=sprintf($xmlTpl,$object->FromUserName,$object->ToUserName,time(),count($content));
return $result;
}
private function transmitText($object,$content){
if(!isset($content)||empty($content)){
return "";
}
$xmlTpl="
<xml>
<ToUserName><![CDATA[%s]]></ToUserName>
<FromUserName><![CDATA[%s]]></FromUserName>
<CreateTime>%s</CreateTime>
<MsgType><![CDATA[text]]></MsgType>
<Content><![CDATA[%s]]></Content>
</xml>
";
$result=sprintf($xmlTpl,$object->FromUserName,$object->ToUserName,time(),$content);
return $result;
}
接口文档说默认来源是全网公众号最火的的人民日报。然而试了几次,根本就是全网随机。某种角度说,这个字段可有可无。
尽管微信实行信息流以来。最大发送数建议发送量到了2个。但现在显然还可以通过后台发最多8个的消息。
因此,设置默认的num为10,肯定会报错。
而且有些简单的关键字比如 普通女青年
都搜不到,可见这个接口检索能力是非常非常有限的的,
通过以上一段代码,就实现了需求所说的功能。