登录
转载

微信公众号天气与聊天机器人小功能

专栏API的典型场景应用
发布于 2021-02-21 阅读 668
  • 程序员
  • 微信
  • 机器人
转载
<link rel="stylesheet" href="https://csdnimg.cn/release/blogv2/dist/mdeditor/css/editerView/ck_htmledit_views-b5506197d8.css">
<svg xmlns="http://www.w3.org/2000/svg" style="display: none;"> <path stroke-linecap="round" d="M5,0 0,2.5 5,5z" id="raphael-marker-block" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);"></path> </svg>

微信公众号小功能

以下都是借鉴的微信公众平台的文档加老师指点和自行的理解。

(1)微信公众号发送地区回复现在和未来五天天气情况
(2)发送语音和智能机器人聊天

一、调用天气预报接口

实现微信公众号发送地区回复现在和未来五天天气情况要去调用天气接口。
我使用的是聚合网的天气接口。
在这里插入图片描述
知道了接口的地址、返回格式、请求的方式那么接下来就好做了。
这里还要说一下向http发送请求的几种方式:
1.file_get_contents()
2.curl
3.fopen()
4.fsocket();
知道了发送请求的方式那么就可以写我们的代码了。

下面的是接收微信端消息的代码

 private function receiveMsg(){
        $xml = file_get_contents("php://input");//获取微信平台发来的消息
        //file_put_contents("data.txt",$xml);//讲发来的消息写入文件
        $obj = simplexml_load_string($xml,"SimpleXMLElement",LIBXML_NOCDATA);//将xml转为对象类型
        return $obj;
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

这里是接收消息代码

            //这里证明不是第一次接入了。  处理业务逻辑  接收消息
            $obj = $this->receiveMsg();
            //判断接收到的类型
            switch($obj->MsgType){
                case "text":
                    //城市
                    $city = str_replace('天气:',"",$obj->Content);
                    //key
                    $key = "ee9206e9a2c81fd162750d3321e072ea";
                    //接口地址  拼接接口地址
                    $url = "http://apis.juhe.cn/simpleWeather/query?city=".$city."&key=".$key;
                    //发送请求 默认为json格式将其转为数组类型
                    $data = json_decode(file_get_contents($url),true);
                    //file_put_contents('data.txt',$data);
                    //判断是否请求成功
                    if($data["error_code"]==0){
                        //当前的数据
                        $today = $data["result"]["realtime"];
                        //未来五天的空气状况
                        $future = $data["result"]["future"];
                        //返回的信息
                        $content = "您所查询的城市为:".$data["result"]["city"]."\n";
                        $content.= "当前温度为:".$today["temperature"]."℃"."\n当前湿度为:".$today["humidity"]."%\n";
                        $content.= "天气状况:".$today["info"]."\n"."风向:".$today["direct"]."\n"."风力:".$today["power"]."\n空气质量:".$today["aqi"]."\n";
                        $content.= "以下是未来五天的天气情况\n";
                        //返回未来五天的空气情况
                        foreach($future as $k=>$v){
                            $content.="--------------------------\n";
                            $content.= "日期:".$v["date"]."\n";
                            $content.="气温:".$v["temperature"]."\n";
                            $content.="天气情况:".$v["weather"]."\n";
                            $content.="风向:".$v["direct"]."\n";
                        }
                    }else{
                        $content="您所输入的城市有误,请正确填写。格式为'天气:地区名'";
                    }
                    break;
        <span class="token punctuation">}</span>
        <span class="token comment">//回复消息</span>
        <span class="token variable">$this</span><span class="token operator">-</span><span class="token operator">&gt;</span><span class="token function">responseText</span><span class="token punctuation">(</span><span class="token variable">$obj</span><span class="token punctuation">,</span><span class="token variable">$content</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token punctuation">}</span>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42

这里是回复消息代码

 //自动回复消息
    private function responseText($obj,$content){
        //占位符的内容
        $ToUserName = $obj->FromUserName;
        $FromUserName = $obj->ToUserName;
        $time = time();
        $msgType = "text";
        $contents = $content;
        //自动回复
        $xml = "<xml>
                      <ToUserName><![CDATA[%s]]></ToUserName>
                      <FromUserName><![CDATA[%s]]></FromUserName>
                      <CreateTime>%s</CreateTime>
                      <MsgType><![CDATA[%s]]></MsgType>
                      <Content><![CDATA[%s]]></Content>
                    </xml>";
        //把占位符改为消息
        echo sprintf($xml,$ToUserName,$FromUserName,$time,$msgType,$contents);
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

二、调用图灵机器人接口

首先我们是要语音和机器人交流需要去微信公众平台在这里插入图片描述

找到接受语音识别结果选择开启(开启后需要取消关注重新关注一下,否则要等24h)
然后去百度图灵机器人注册个账号获取到图灵机器人的接口和key

在这里插入图片描述

然后直接写我们的代码,因为图灵机器人用的是post请求所以要用curl,我们最好封装一个,如下

  public function http_get($url){
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $url);//向那个url地址上面发送
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);//设置发送http请求时需不需要证书
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);//设置发送成功后要不要输出1 不输出,0输出
        $output = curl_exec($ch);//执行
        curl_close($ch);    //关闭
        return $output;
    }
<span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function">http_post</span><span class="token punctuation">(</span><span class="token variable">$url</span><span class="token punctuation">,</span><span class="token variable">$data</span><span class="token punctuation">)</span><span class="token punctuation">{<!-- --></span>
    <span class="token variable">$curl</span> <span class="token operator">=</span> <span class="token function">curl_init</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//初始化</span>
    <span class="token function">curl_setopt</span><span class="token punctuation">(</span><span class="token variable">$curl</span><span class="token punctuation">,</span> <span class="token constant">CURLOPT_URL</span><span class="token punctuation">,</span> <span class="token variable">$url</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token comment">//向那个url地址上面发送</span>
    <span class="token function">curl_setopt</span><span class="token punctuation">(</span><span class="token variable">$curl</span><span class="token punctuation">,</span> <span class="token constant">CURLOPT_SSL_VERIFYPEER</span><span class="token punctuation">,</span> <span class="token constant">FALSE</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token function">curl_setopt</span><span class="token punctuation">(</span><span class="token variable">$curl</span><span class="token punctuation">,</span> <span class="token constant">CURLOPT_SSL_VERIFYHOST</span><span class="token punctuation">,</span><span class="token constant">FALSE</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token comment">//需不需要带证书</span>
    <span class="token function">curl_setopt</span><span class="token punctuation">(</span><span class="token variable">$curl</span><span class="token punctuation">,</span> <span class="token constant">CURLOPT_POST</span><span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//是否是post方式 1是,0不是</span>
    <span class="token function">curl_setopt</span><span class="token punctuation">(</span><span class="token variable">$curl</span><span class="token punctuation">,</span> <span class="token constant">CURLOPT_POSTFIELDS</span><span class="token punctuation">,</span> <span class="token variable">$data</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token function">curl_setopt</span><span class="token punctuation">(</span><span class="token variable">$curl</span><span class="token punctuation">,</span> <span class="token constant">CURLOPT_RETURNTRANSFER</span><span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token comment">//需不需要输出</span>
    <span class="token variable">$output</span> <span class="token operator">=</span> <span class="token function">curl_exec</span><span class="token punctuation">(</span><span class="token variable">$curl</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token comment">//执行</span>
    <span class="token function">curl_close</span><span class="token punctuation">(</span><span class="token variable">$curl</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//关闭</span>
    <span class="token keyword">return</span> <span class="token variable">$output</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23

以下是图灵机器人的用法

   case "voice":
                    //获取用户的消息转为文本
                    $text = urlencode($obj->Recognition);//转码
                    //调用机器人的接口
                    $url = "http://openapi.tuling123.com/openapi/api/v2";
                    //请求的消息
                    $msg = [
                        "reqType"=>0,
                        "perception"=>[
                                        "inputText"=> [
                                            "text"=>$text,
                                        ]
                        ],
                        "userInfo"=>[
                            "apiKey"=>"b7da94fa32c8487a846e981f8761370c",
                            "userId"=>"1",
                        ]
                    ];
                    $msg = urldecode(json_encode($msg));//转为json格式,并且解码
                    //向接口发送请求
                    $result = $this->http_post($url,$msg);
                    //将得到的请求转为数组
                    $result = json_decode($result,true);
                    //得到机器人的回复消息
                    $content = $result["results"][0]["values"]["text"];
                    $this->check($content);
                    break;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
<link href="https://csdnimg.cn/release/blogv2/dist/mdeditor/css/editerView/markdown_views-d7a94ec6ab.css" rel="stylesheet"> <link href="https://csdnimg.cn/release/blogv2/dist/mdeditor/css/style-80ad9b4f5b.css" rel="stylesheet">

评论区

励志做一条安静的鳄鱼。

0

0

0

举报