微信公众平台智能机器人PHP开发示例
最近在做微信公众平台开发,一口气写了二十几个功能,挺有意思的~
今天来分享一下开发经验~
微信公众平台提供的接口很简单,先看看消息交互流程:
说的通俗一些,用户使用微信发送消息 -> 微信将数据发送给开发者 -> 开发者处理消息并返回数据至微信 -> 微信把返回数据发送给用户,期间数据交互通过XML完成,就这么简单。
下面写个实例,开发微信智能聊天机器人:
1. 注册微信公众平台账号
https://mp.weixin.qq.com/
注: 目前一张身份证只能注册两个账号,账号名称关乎加V认证,请慎重注册。
2. 申请服务器/虚拟主机
没有服务器/虚拟主机的童鞋可以使用BAE和SAE,不多介绍。
3. 开启开发者模式
微信公众平台有两个模式,一个是编辑模式(傻瓜模式),简单但功能单一。另一个是开发者模式,可以通过开发实现复杂功能。两个模式互斥,显而易见,登录微信公众平台并通过“高级功能”菜单开启开发者模式。
4. 填写接口配置信息
同样是在“高级功能”菜单中配置,需要配置两项参数:
URL: 开发者应用访问地址,目前仅支持80端口,以“http://www.你的域名.com/weixin/index.php”为例。
TOKEN: 随意填写,用于生成签名,以“你的域名”为例。
填写完把下面代码保存为index.php并上传至http://www.你的域名.com/weixin/目录,最后点击“提交”完成验证。
代码如下 | 复制代码 |
<?php private function checkSignature() { |
这玩意儿就是微信公众平台校验URL是否正确接入,研究代码没有实质性意义,验证完即可删除文件,就不详细说明了,有兴趣的童鞋可以查看官方文档。
http://mp.weixin.qq.com/wiki/index.php
5. 开发微信公众平台功能
OK,上面提到了,微信公众平台与开发者之间的数据交互是通过XML完成的,既然用到XML,当然得遵循规范,所以在着手开发之前先看看官方接口文档提供的XML规范,以文本消息为例:
当用户向微信公众账号发送消息时,微信服务器会POST给开发者一些数据:
代码如下 | 复制代码 |
<xml> <!--开发者微信号--> <ToUserName><![CDATA[toUser]]></ToUserName> <!--发送方帐号(OpenID)--> <FromUserName><![CDATA[fromUser]]></FromUserName> <!--消息创建时间 (整型)--> <CreateTime>12345678</CreateTime> <!--消息类别 (text文本消息)--> <MsgType><![CDATA1]></MsgType> <!--消息内容--> <Content><![CDATA[content]]></Content> <!--消息ID (64位整型)--> <MsgId>1234567890123456</MsgId> </xml> |
开发者在处理完消息后需要返回数据给微信服务器:
代码如下 | 复制代码 |
<xml> <!--接收方帐号(OpenID)--> <ToUserName><![CDATA[toUser]]></ToUserName> <!--开发者微信号--> <FromUserName><![CDATA[fromUser]]></FromUserName> <!--消息创建时间 (整型)--> <CreateTime>12345678</CreateTime> <!--消息类别 (text文本消息)--> <MsgType><![CDATA1]></MsgType> <!--回复消息内容--> <Content><![CDATA[content]]></Content> <!--星标操作(位0x0001被标志时 星标刚收到的消息)--> <FuncFlag>0</FuncFlag> </xml> |
除文本消息外,微信公众平台还支持用户发送图片消息、地理位置消息、链接消息、事件推送,而开发者还可以向微信公众平台回复音乐消息和图文消息,各类消息XML规范也可以参见官方文档。
来看看官方提供的一个PHP示例,我做了一些精简:
代码如下 | 复制代码 |
<?php //---------- 接 收 数 据 ---------- // $postStr = $GLOBALS["HTTP_RAW_POST_DATA"]; //获取POST数据 //用SimpleXML解析POST过来的XML数据 $fromUsername = $postObj->FromUserName; //获取发送方帐号(OpenID)
//返回消息模板 $msgType = "text"; //消息类型 //格式化消息模板 |
把代码保存为index.php并上传至http://www.你的域名.com/weixin/目录,如果刚才没删除该文件,则直接覆盖。
现在用户通过微信公众平台发送任何消息公众账号均会返回一条内容为“http://www.你的域名.com”的消息。
接下来需要做的就是根据用户消息动态返回结果~
SimSimi(小黄鸡)是目前比较火的聊天机器人,我用CURL开发了一个免费的SimSimi(小黄鸡)接口,传入关键词会返回文本回复,这部分不是本文重点,就不多说明,直接上代码:
代码如下 | 复制代码 |
<?php //---------- 接 收 数 据 ---------- // $postStr = $GLOBALS["HTTP_RAW_POST_DATA"]; //获取POST数据 //用SimpleXML解析POST过来的XML数据 $fromUsername = $postObj->FromUserName; //获取发送方帐号(OpenID)
//返回消息模板 $msgType = "text"; //消息类型 //格式化消息模板 |
把上面两段代码整合在一起就大功告成了,需要说明一点,微信服务器在5秒内收不到响应会断掉连接,通过此接口有可能会超时,且SimSimi已经屏蔽了BAE和SAE上的抓取请求,推荐使用SimSimi官方收费API,速度比较快~
其实模拟登录就那点事,无法就是获得相应的参数,然后模拟发送,把获得的COOKIE 带入下一步操作中去
discuzx 系列为防止灌水,一直在用 formhash() 这个函数:
1、下面来看下formhash 这个函数:
代码如下 | 复制代码 |
function formhash($specialadd = '') { |
注:生成方式:
1、截取的时间戳
2、用户名
3、用户ID
4、authkey
5、hashadd(定值)
6、specialadd(定值)
因为存在用户名和用户id ,所以 在登录前跟登录后的 产生的值是不同的,即:在登录前跟登录后你要2次来获得fromhash;
那么authkey又是个什么东西呢 ?
2、关于authkey
//代码位置:/source/class/discuz/discuz_application.php
代码如下 | 复制代码 |
if(empty($this->var['cookie']['saltkey'])) { $this->var['cookie']['saltkey'] = random(8);//这一步不要去管 dsetcookie('saltkey', $this->var['cookie']['saltkey'], 86400 * 30, 1, 1); } $this->var['authkey'] = md5($this->var['config']['security']['authkey'].$this->var['cookie']['saltkey']); |
在这里可以看到:authkey是根据配置文件的authkey 和cookie 里面的saltkey 来生成的
其实在这里就可以看出来了, 只要网站的$this->var['cookie']['saltkey'] 这个值始终保存在cookie里面就这样就可以保证 formhash 那里生成的值永远是一样的(永远是相对的)
这里还要说一点:
3 cookie系列
discuz 的cookie的前缀是随机生成的
代码位置:/source/class/discuz/discuz_application.php
代码如下 | 复制代码 |
$this->var['config']['cookie']['cookiepre'] = $this->var['config']['cookie']['cookiepre'].substr(md5($this->;var['config']['cookie']['cookiepath'].'|'.$this->;var['config']['cookie']['cookiedomain']), 0, 4).'_'; |
只要你登录下网站看看cookie 的设置这里就可以了,他的前缀确实hi一直不变的,当然改了配置文件那肯定会变
到底该怎么写呢:说下我实现的思路
1、登录下访问网站一下抓取网页返回的 saltkey(cookie),formhash(值) 这两个值(saltkey在下面一定要带上,而且上下文要一致)
2、构造登录的内容然后模拟post 提交 (一定要带上第一步抓取到的cookie跟formhash 这一个值)
3、如果登录成功,接着获取一个页面的 formhash 跟设置的cookie(这次获得到的formhash 就是你可以一直使用的了)
4、构造发帖还有顶帖的post 提交到页面 (cookie 跟formhash 还是重点 )
关于php 使用 crul 模拟 post 部分代码
代码如下 | 复制代码 |
$ch = curl_init($url); //初始化 |
代码就不共享了,有能力的朋友自己写把; 这东西容易引起混乱
本程序可以实现批量替换目录中所有文件中的内容或用于打量给挂了木马文件批量替换与更新了,希望文章对各位同学有所帮助。代码如下 | 复制代码 |
/***************************************************************************
//分析shortname
//把末尾的/去掉 //罗列所有目录 } exit();
function hx_dealdir($dir){ $ext=substr(strrchr($file,"."), 1); echo "<li>$file "; }
</body> |
服务器端
为实现截图的程序必须借助服务器端程序:http://code.google.com/p/wkhtmltopdf/
可将网页转换为pdf或者图片,32和64位有区别,找个适合自己服务器的版本。
安装
安装过程十分简单:解压 -> 找个合适的路径放下…
执行
命令行调用1
代码如下 | 复制代码 |
/servers/app/qtwebkit/wkHtmlToImage 111cn.net www.111cn.net.png |
默认的清晰度比较高,图片会很大,生成图片需要一定的时间。
php
代码如下 | 复制代码 |
exec('/servers/app/qtwebkit/wkHtmlToImage 111cn.net www.111cn.net.png'); |
具体的使用方法
代码如下 | 复制代码 |
<?php |
中文乱码问题
主要看服务器是否支持中文语言,如果截图中出现乱码,直接装个中文包就好了。
代码如下 | 复制代码 |
yum install fonts-chinese |
以前有同事需要我清除memcache缓存,我总是直接使用kill命令结束掉这个进程,后来才知道有更简单的方法,来清除memcachd的缓存,记录一下,以备不时之需:
1.首先使用ssh命令登录到memcached所在服务器,命令如下:
代码如下 | 复制代码 |
#ssh root@192.168.1.1 |
输入root密码后可登录对应的服务器;
2.使用telnet命令后接tomcat服务配置文件中指定的memcached启动端口:
代码如下 | 复制代码 |
#telnet localhost 11211 |
之后显示:
Trying 127.0.0.1…
Connected to localhost.localdomain (127.0.0.1).
Escape character is ‘^]’.
3.此时输入如下内容并回车即可清除缓存内容:
代码如下 | 复制代码 |
flush_all |
4.最后退出telnet使用quit命令,再exit退出远程主机。
清除过期缓存
代码如下 | 复制代码 |
/** * Memcached的过期内存回收 */ class mem_dtor extends Memcache { private $server_id; public function __construct($host,$port) { $this->server_id = "$host:$port"; $this->connect($host,$port); } // 回收所有过期的内存 public function gc() { $t = time(); $_this = $this; $func = function($key,$info) use ($t,$_this) { if($info[1] - $t delete($key); } }; $this->lists($func); } // 查看所有缓存内容的信息 public function info() { $t = time(); $func = function($key,$info) use ($t) { echo $key,' => Exp:',$info[1] - $t,"n"; //查看缓存对象的剩余过期时间 }; $this->lists($func); } private function lists($func) { $sid = $this->server_id; $items = $this->getExtendedStats('items'); //获取memcached状态 foreach($items[$sid]['items'] as $slab_id => $slab) //获取指定server id 的 所有Slab { $item = $this->getExtendedStats('cachedump',$slab_id,0); //遍历所有Slab foreach($item[$sid] as $key => $info) //获取Slab中缓存对象信息 { $func($key,$info); } } } } $mem = new mem_dtor('127.0.0.1',11211); $mem->info();//查看状态 $mem->gc(); //回收 |
memcache缓存的批量删除方案
memcache默认只支持使用delete(key)和 flush_all,这两种方法都太极端了,不能满足用户的特定需求,如:批量删除‘aaaaaaaa_'开头的所有缓存,这个时候该怎么办?
1 getExtendStats 遍历所有item,删除指定的key(不推荐)
网上有对应的php代码和perl程序,感兴趣的可以看看,在本地测试时可以使用,但是在真是服务器上请不要使用。
2 memcache结合DB
方法:每次set缓存时,将key值存入数据库,在要删除缓存时查询数据库,查询出对应的信息,在memcache中将其删除
缺点:浪费数据裤磁盘
3 memcache伪命名空间(推荐)
memcache默认不提供命名空间,但可以设置一个全局变量,来模拟命名空间,代码如下:
代码如下 | 复制代码 |
<?php
|
以上是个人见解,欢迎拍板
相关文章
- 这篇文章主要为大家详细介绍了C#图像识别,微信跳一跳机器人,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-06-25
- 这篇文章主要介绍了简单用VBS调用企业微信机器人发定时消息的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-12-08
- 这篇文章主要介绍了vue.js实现h5机器人聊天测试版,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-07-16
- 微信公众平台实现微信网页登陆授权开发其实是非常的简单了,因为官方的参考程序了,下面小编就看了一站长根据官方参考做的一个网页登陆授权例子,大家可看看。 文件1:in...2016-11-25
- 这篇文章主要为大家详细介绍了Java简单实现聊天机器人,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2021-07-04
- 本文主要介绍了Go语言使用钉钉机器人推送消息的实现示例,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2021-09-23
- 这篇文章主要为大家详细介绍了python实现Nao机器人的单目测距,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2021-09-04
- 网易科技讯6月21日消息,据每日邮报报道,日本丰田汽车公司下属丰田研究院负责人吉尔·普拉特(Gill Pratt)宣称,丰田公司将来会利用机器人和人工智能技术量产机器人,以便帮助照顾老人、病人以及残疾人。此外,丰田公司计划利用当前大量生产汽车的同样方式,令机器人的制造变得更加廉价。...2016-07-04
- 这篇文章主要介绍了PHP Curl模拟登录微信公众平台、新浪微博实例代码的相关资料,涉及到php curl模拟登录相关知识,需要的朋友可以参考下...2016-02-01
- 微信公众平开发时碰到回复中文乱码了,这个问题小编发现是编码问题,其实只要把编码转成utf8就可以解决了,具体来看看。 很多微信公众平台的自动回复程序都是 ThinkWec...2016-11-25
- 自定义菜单可以在后台设置但如果你使用了开发者之后那么后台的自定义菜单功能就失效了,必须通过程序来创建了,下面一起来看一个简单的通过php创建自定义菜单的例子。...2016-11-25
- 微信公众平台服务号可申请自定义菜单了,其它的号暂时不支持自定义菜单了,这个不但可以使用api来操作,还可以直接在后台定义菜单与参数哦。 申请自定义菜单 服务号可...2016-11-25
- 科沃斯机器人作为目前市场上普及率最高的家庭服务机器人,扫地机器人越来越多的走进普通消费者家庭。目前,市面上的扫地机器人大都是随机碰撞式,时间长、效率低,易遗漏。...2017-07-06
- 这篇文章主要给大家介绍了关于Asp.Net Core对接钉钉群机器人的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧...2021-09-22
- 这篇文章主要为大家详细介绍了基于树莓派的语音机器人,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-04-25
- 微信公众平台开发我们现在做得比较多了,下面给各位介绍的是一个入门级别的微信公众平台验证基础知识了,有兴趣的和小编来看看。 开发微信的时候 需要验证一下 。...2016-11-25
- 最近在模拟登录的时候愈发的出现登录失败的情况,原因是:微信公众平台登录如果时不时的会对一些异常帐号要求输入验证码才可以登录 这个时候平台首页的登录逻辑就会...2016-11-25
- 要对微信公众平台进行开发,首先需要成为开发者,可以到https://mp.weixin.qq.com/注册一个帐号,然后按要求填写相关信息即可。 有了公众号后,在公众平台的高级功能里选...2016-11-25
- 微信公众平台服务号开放了自定义菜单API,本案例介绍C#开发微信公众号自定义菜单功能。在此基础上可以开发更完善的自定义菜单管理功能...2020-06-25
- 其实这种发送邮件是非常的简单了我们只要接受由用户提交过来的邮箱地址然后再由php的邮件控制进行邮件发送了,下面看一个综合开发例子。 首先yyuc框架是支持发送em...2016-11-25