前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >微信公众号精选采坑记

微信公众号精选采坑记

作者头像
一粒小麦
发布2019-07-18 17:10:07
5070
发布2019-07-18 17:10:07
举报
文章被收录于专栏:一Li小麦一Li小麦

微信精选是一个常见的接口api。在此例中,将实现一个回复公众号关键字,实现“全网”文章查询功能。有兴趣的读者可关注本号自己试试。如图。

拥有回退功能

但是呢,免费找的接口大多数坑特别多。本文将采坑记录如右。

对于一般的API接口,接入微信的操作是:精读接口文档,组织数据,最后是接入微信。

申请地址 https://www.showapi.com/api/view/181

主要的请求字段为:

这个rand默认随机即可。page和size可以设定。

根据上一个SDK实现的框架,继续借用。

第一个坑:数据分型

只要分消息类型text和default即可。

代码语言:javascript
复制
//响应消息
        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时返回全数组 。

代码语言:javascript
复制
//响应消息
        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;

        }
第三个坑:优雅回退

对于查询不到的数据,应该告诉用户是什么原因。

用回之前的模板即可。

代码语言:javascript
复制
//回复图文消息
           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,肯定会报错

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

小结

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


本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-07-01,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 一Li小麦 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 第一个坑:数据分型
  • 第二个坑:数据组装和发送
  • 第三个坑:优雅回退
  • src无效
  • num值
  • 小结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档