心知天气api PHP,php调用心知天气API,实现微信自动回复
一:
1.定义一个专门用于发送api请求和处理api接收数据的类
2.类中定义两个方法:1个用于生成连接api所用的url,一个用于连接api并且处理返回数据
5.容易出问题的地方:
1)在连接api和处理消息方法中,用cURL进行连接,tips:curl连接的时候不要使用服务器验证!!!,不设置hedding,不设置host,否则连接不了api,正确示范如官方提供的demo参考。
2)api返回的是json格式,用php提供的json转数组函数可以转数组,这个数组是一个多维的数组,注意取值的时候不要出错,数组为索引数组+关联数组混合,如下面代码所示
$output['results'][0]['location']['name']
这里取到的就是城市名字。
6.整体思路:在回复文本消息方法中调用生成URL链接函数,将用户发送的城市名字传过来;URL链接函数调用连接方法,在连接方法中返回处理完成的字符串,可供被动回复文本消息方法直接回复。
7.实例code demo :wether.php
/*调用心知天气api demo
*/
//自动转数组并返回查询结果字符串
class wetherReplay{
function httpGet($url){
$ch = curl_init();//c初始化一个cURL会话
curl_setopt($ch, CURLOPT_URL, $url);//将URL设置为我们需要的URL
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
$output = curl_exec($ch);//获取json返回数据
curl_close($ch);
$output = json_decode($output, true);//将获取到的json转化成php数组
$retStr = "您查询的城市:" .$output['results'][0]['location']['name'] . "\n" . "今日天气:" .$output['results'][0]['now']['text']
. "\n" . "温度:" .$output['results'][0]['now']['temperature'] ."摄氏度";
return $retStr;
}
// 心知天气接口调用凭据
public function wetherCallBackTest($pos){
$key = '6wd17nam8wcitv0f'; // 测试用 key,请更换成您自己的 Key
$uid = 'U270B81E1D'; // 测试用 用户 ID,请更换成您自己的用户 ID
// 参数
$api = 'https://api.seniverse.com/v3/weather/now.json'; // 接口地址
$location = $pos; // 城市名称。除拼音外,还可以使用 v3 id、汉语等形式
// 生成签名。文档:https://www.seniverse.com/doc#sign
$param = [
'ts' => time(),
'ttl' => 300,
'uid' => $uid,
];
$sig_data = http_build_query($param); // http_build_query 会自动进行 url 编码
// 使用 HMAC-SHA1 方式,以 API 密钥(key)对上一步生成的参数字符串(raw)进行加密,然后 base64 编码
$sig = base64_encode(hash_hmac('sha1', $sig_data, $key, TRUE));
// 拼接 url 中的 get 参数。文档:https://www.seniverse.com/doc#daily
$param['sig'] = $sig; // 签名
$param['location'] = $location;
$param['start'] = 0; // 开始日期。0 = 今天天气
$param['days'] = 1; // 查询天数,1 = 只查一天
// 构造 url
$url = $api . '?' . http_build_query($param);
return $this->httpGet($url);
}
}
二:被动回复消息类:
1.在文本消息中分辨出用户是否发送询问天气消息,自定义判断规则 eg:用户发送南阳天气时,strstr()识别出字符串是否有天气两字,若有,进入到回复天气模块,没有,正常进入回复模块;
2.城市名字是不一定两个字的,所以使用mb_strlen()来判断用户输入的字符个数,然后减去2就是城市名字的字符个数,再使用mb_substr()来截取这个字符长度的城市名字
3.code demo replay.php
require 'wether.php';//包含文件,以使可以调用该文件的方法
//$wetherReplay = new wetherReplay();
//回复消息类
class ReplyMsageUntion{
//回复消息选择器
public function messageSwitch(){
$postStr = $GLOBALS["HTTP_RAW_POST_DATA"];
if (!empty($postStr)) {
$postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);
switch ($postObj->MsgType) {
case 'text':
$this->replayText($postObj);
break;
case 'image':
$this->replayImage($postObj);
break;
case 'voice':
$this->replayAudio($postObj);
case 'video';
$this->replayVideo($postObj);
}
}else
echo "";
}
//文本消息回复函数
private function replayText($postObj){
$wetherReplay = new wetherReplay();//new一个对象才可以调用生成URL方法
$fromUser = $postObj->FromUserName;
$toUser = $postObj->ToUserName;
$mType = $postObj->MsgType;
$keyWord = trim($postObj->Content);
$time = date("Y:m:d H:i:s", time());
//如果消息中包含天气,则回复天气预报
if(strstr($keyWord,"天气")){//strstr()用来检测是否有固定字符串出现
$lenthContent = mb_strlen($keyWord,'utf-8');//判断用户输入的字符串长度
$pos = mb_substr($keyWord,0,$lenthContent-2,'utf-8');//截取城市名字
$wetherRet = $wetherReplay->wetherCallBackTest($pos);//调用天气生成URL方法
$textStr = "
%s
0
";
$resultStr = sprintf($textStr,$fromUser,$toUser, $time, $mType,$wetherRet);
echo $resultStr;
}else{
// $time = date("Y:m:d H:i:s", time());
$textStr = "
%s
0
";
// if (!empty($keyWord)){
$contentStr = "已收到您的消息:".$postObj->Content ."\n" ."发送时间" .$time;
$resultStr = sprintf($textStr,$fromUser,$toUser, $time, $mType,$contentStr);
echo $resultStr;
}
}
//图片消息回复函数
private function replayImage($postObj){
$fromUser = $postObj->FromUserName;
$toUser = $postObj->ToUserName;
$mType = $postObj->MsgType;
$time = date("Y:m:d H:i:s", time());
$imageStr = "
%s
";
// $contentStr = "您发送的是一张图片,点击以下链接查看:"."\n" .$postObj->MediaId;
$resultStr = sprintf($imageStr,$fromUser,$toUser,$time,$mType,$postObj->MediaId);
echo $resultStr;
}
//回复语音消息
private function replayAudio($postObj){
$fromUser = $postObj->FromUserName;
$toUser = $postObj->ToUserName;
$mType = $postObj->MsgType;
$time = date("Y:m:d H:i:s", time());
$audeoStr = "
%s
";
$resultStr = sprintf($audeoStr,$fromUser,$toUser,$time,$mType,$postObj->MediaId);
echo $resultStr;
}
//回复视频消息
private function replayVideo(){
$fromUser = $postObj->FromUserName;
$toUser = $postObj->ToUserName;
$mType = $postObj->MsgType;
$time = time();
$videoStr = "
%s
//
//
";
// $contentTitle = "视频消息";
// $contentDesc = "点击即可观看";
$resultStr = sprintf($videoStr,$fromUser,$toUser,$time,$mType,$postObj->MediaId);
echo $resultStr;
}
}
三 入口文件
1.服务器绑定校验签名 tips:签名不用每次请求都绑定,所以要加一个判断条件
2.code demo api.php
require 'replay.php';
define("TOKEN","flyingman");
$wechatObj = new wechatCallBackTest();
$replayMseeg = new ReplyMsageUntion();
if (!(isset($_GET["echostr"]))){
$replayMseeg->messageSwitch();
}else{
$wechatObj->valid();
}
class wechatCallBackTest{
//校验签名
public function valid(){
$signature = $_GET["signature"];//微信返回的加密字符串
$timestamp = $_GET["timestamp"];
$nonce = $_GET["nonce"];
$token = TOKEN;
$tmpArr = array($token, $timestamp, $nonce);
sort($tmpArr, SORT_STRING);
$tmpStr = implode($tmpArr);
$tmpStr = sha1($tmpStr);
if ($tmpStr == $signature) {
echo $_GET["echostr"];
}
}
}
四 总结
1.以上code可以实现微信被动回复文本,语音,图片,天气查询
2. 天气查询限定格式:城市名+天气
心知天气api PHP,php调用心知天气API,实现微信自动回复相关推荐
- python powerbi知乎_利用Python调用Power BI REST API
本文是D-BI之Power BI REST API系列第三篇,讲解如何利用一段简单的Python脚本实现Power BI REST API的调用,将使用与上文完全不同的方法 前述 上文<Powe ...
- php抓取搜狗图片,搜狗美图 API 接口请求调用
原标题:搜狗美图 API 接口请求调用 搜狗美图 API 接口在网上已经很多且大都封装成了 API 供别人调用.支持前台跨域请求,以POST方式提交图片即可.搜狗美图 API 接口每日都会更新一张美图 ...
- 微博API接口的调用
本人大学狗一枚,学识尚浅,只为做笔记用,愿求大神们多多指教.楼主我就买了本社交网站数据挖掘与分析的书(python语言),==装逼的..言归正传,由于书中设计到的社交网站是twitter,脸book, ...
- 调用腾讯地图API、高德地图API 获取当前地理位置、经纬度
调用腾讯地图API.高德地图API 获取当前地理位置.经纬度 web开发中,很多情况下都会需要获取当前位置的经纬度,在网上找了几个不同的地图,最终找到兼容比较好的腾讯地图API 1.调用腾讯地图API ...
- Android调用新版百度天气api,解决地理编码问题
我在学习制作天气预报app的时候,先调用新版百度地图api时发现,百度取消了原有api链接的city参数,反倒是改为了district_id,看到这个的时候我一脸蒙蔽,全国那么多地区,我要怎么一一获取 ...
- android往天气接口里面传城市,Android使用中国天气网API数据通过城市名称获取天气情况...
项目要求在应用首页面展示本地当日天气的概况,首先想到的是google和雅虎,前者很久之前接触过,听说后来用不了了,后者由于邮箱事件的缘故个人不喜欢(虽然貌似苹果也用雅虎的天气预报),之后又想到了前段时 ...
- html调用腾讯地图定位当前位置,vue web项目中调用腾讯地图API获取当前位置的经纬度...
vue web项目中调用腾讯地图API获取当前位置的经纬度 vue web项目中调用腾讯地图API获取当前位置的经纬度 在main.js 中添加一下代码 import axios from 'axio ...
- 【Twitter API开发者账户协议必知】
Twitter API协议必知 中文 英文 中文 开发商协议 生效日期:2022年10月10日 本Twitter开发者协议(以下简称"协议")由您(个人或实体,以下简称" ...
- php天气api接口,PHP博客_天气API接口的实现代码,实况天气,生活指数等
城市查询API接口说明 功能强大的城市搜索服务,支持中英文模糊搜索,支持IP.经纬度坐标和中国行政区域编码(AD Code)查询城市的详细信息,可指定搜索范围,设置返回结果数量,查询全球热门城市列表等 ...
- 百度地图简单调用js及天气获取
这是一个简单的小例子,获取天气过程可能有点繁琐,本次通过获取所在的城市,根据城市获取城市编码,再根据编码获取当前城市的天气情况.当然网上有很多关于天气获取的,如知心天气.中国气象局.和风天气.free ...
最新文章
- ABAP源码--当前及可用库存查询
- 标签传播算法(Label Propagation)及Python实现
- 读取和修改caffemodel文件
- 调整姿势!登顶 MacBook高效工作环境配置!
- 游戏修改服务器数据,修改游戏服务器数据的教程
- MyBatis可视化代码生成工具
- Kubernetes查看日志命令
- linux常见通配符的含义,linux通配符含义
- flash发布html快捷键,Flash菜单操作之快捷键
- NES APU Replayer
- 关于Render在不同情况的用法
- 学会Python好找工作吗?这就告诉你答案
- 根文件系统与文件系统的区别
- layui管理后台模板
- excel 作图-- 主次纵坐标轴 横坐标名称太长
- GMap.net在winform中调用高德地图
- 转贴汪应果先生的“全球华人应该向大陆中国人学什么?”
- 微信商城开源版二次开发(二)
- python怎么消除警告_Python-警告处理
- 卸载或删除 Office 2010