专栏首页一Li小麦微信公众号精选采坑记

微信公众号精选采坑记

微信精选是一个常见的接口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),作者:一li小麦

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

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

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

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 接收发送消息与数据库交互

    线上的接口的坑太多了。不如自己写一个吧。实际的业务场景中,可以用户回复关键词,可获取系统中相关的消息。

    一粒小麦
  • js设计模式补白之 this/call和apply

    这里call(this)显然是把当前的作用域(window)绑定给了getName方法。

    一粒小麦
  • koa实践及其手撸

    Koa 是一个新的 web 框架,由 Express 幕后的原班人马打造, 致力于成为 web 应用和 API 开发领域中的一个更小、更富有表现力、更健壮的基石...

    一粒小麦
  • 微信公众号-开发者-自定义菜单-CLICK事件处理

    deepcc
  • Spring 源码第 9 篇,深入分析 FactoryBean

    松哥原创的 Spring Boot 视频教程已经杀青,感兴趣的小伙伴戳这里-->Spring Boot+Vue+微人事视频教程

    江南一点雨
  • 最强 Java 核心知识点整理

    又到了求职的金三银四的黄金月份,我相信有不少小伙伴已经摩拳擦掌的准备寻找下一份工作。

    纯洁的微笑
  • JVM-6.内存分配和回收策略

    JDK6之后,只要老年代的连续空间大于新生代的总对象或者历次晋升的平均大小就会进行Minor GC,否则进行Full GC

    悠扬前奏
  • 一张图大神带你了解游戏程序员的学习之路

    想要成为游戏开发却不知从何着手?本文为腾讯 T4 专家为游戏程序员想要进行学习进阶推荐的系列书单,包括为小朋友编程学习的“编程学前班”、“大朋友”的从“编程语言...

    Milo Yip
  • shell编程-交互 脚本菜单

    上面的脚本基本上是用echo打印的时间都花在写菜单,为此bash shell提供了一个命令select。

    用户3599907
  • JAVA中SaveOrUpdate的代码优化

    上述代码是先查询存不存在,如果存在,就更新,不存在则插入. 很多项目都有这种代码,按普通逻辑来说,这个没毛病。 但实际想想,那三行代码其实有优化的空间. ...

    星痕

扫码关注云+社区

领取腾讯云代金券