微信公众号精选采坑记

微信精选是一个常见的接口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;
        }

src无效

接口文档说默认来源是全网公众号最火的的人民日报。然而试了几次,根本就是全网随机。某种角度说,这个字段可有可无。

num值

尽管微信实行信息流以来。最大发送数建议发送量到了2个。但现在显然还可以通过后台发最多8个的消息。

因此,设置默认的num为10,肯定会报错

而且有些简单的关键字比如 普通女青年都搜不到,可见这个接口检索能力是非常非常有限的的,

小结

通过以上一段代码,就实现了需求所说的功能。


原文发布于微信公众号 - 一Li小麦(gh_c88159ec1309)

原文发表时间:2018-07-01

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

扫码关注云+社区

领取腾讯云代金券