微信API开发自动回复
微信自动回复与自定义菜单操作流程

第三十二页,共五十九页。
6章
乐享接口配置
第三十三页,共五十九页。
目前微信平台内的基础功能已经远远不能满足用户的需求,因此第三方平台的使用就显得尤为重要。目前主要 讲的第三方平台为“乐享”。
第四十二页,共五十九页。
(3)选中【回复文字】,即可进入编辑界面,在“自动回复内容”编辑框里可以添加文字与表情,对关注用户的一些 欢迎与引导。
第四十三页,共五十九页。
必须提出的是,第三方平台关注时可回复超链接,超链接能够使关注用户能够快速的到达所指定的界面,如活动界面, 方面快捷体验好。具体设置如下。
(默认插件均为关闭状态)
第四页,共五十九页。
插件功能介绍
群发功能:点击开通后可以向关注公众平台的用户群发消息。 自动回复:点击开通后可以使用用户关注自动回复、用户默认回复和用户关键 字回复功能。 自定义菜单:点击开通后可以使用自定义菜单,利用自定义菜单给用户更好体验。 卡卷功能:点击开通后,你可以通过卡券功能进行卡券的生成、投放和运营。
信公众平台接口就与第三方平台接口连接起来了。(无论使 用哪一种第三方平台,只需要将你使用的第三方平台的服务 器配置即URL和TOKEN连接到微信公众平台,则可使用第三方平台功
能。)
第三十七页,共五十九页。
温馨提示
提交成功后,会提示“提交成功”,若URL或TOKEN输入错误,则会提示“提交失败”,须重新输入。若
第二十七页,共五十九页。
(3)添加子菜单(二级菜单)成功后,再选中子菜单,即可在右边看到发送消息,和跳转到网址选 项。选中后即可添加菜单相应的内容。可以选择文字,图片,语音,同时也可以选择素材里面编辑好的图文信息。
微信开发步骤(一)

1.注册微信公众平台账号(推荐服务号,服务号可开发功能比订阅号多。
)服务号订阅号2.下载微信官方API(wx_sample.php文件),建议使用Dreamweaver打开。
3.进入微信公众号,点击“功能-> 高级功能”。
使用开发模式。
4.注册“百度开发者”账号(不要使用中文)。
注册完成之后,在右上角“开发者服务管理中”创建工程点击左侧菜单“应用引擎”选项,来添加环境配置。
部署类型选择php-web。
点击扩展服务,添加mysql 服务。
5.Svn设同步代码置。
先下载svn,可直接安装。
在任意位置新建文件夹(如:E:\\weixin)。
复制svn地址。
在E:\\weixin 文件夹右击,选择” SVN Checkout” ,将复制的svn地址粘贴到红框内提交,用户名和密码就是百度账号的用户名/密码。
将步骤2下载的wx_sample.php拉到weixin 目录下,右击选择“Add”再右击wx_sample.php,选择svn Commit ,填写提交信息后提交回到百度开发中心,工程状态会提示有新版(不显示刷新页面),点击快捷发布即可。
6.接口验证,需要url和Token的值。
打开wx_sample.php文件,第七行中的weixin为Token的值(可修改为你喜欢的值)。
url 的值为步骤4中域名/wx_sample.php,即/wx_sample.php。
7.关键词回复开发。
用Dreamweaver打开步骤2下载的wx_sample.php,在46行插入以下代码。
$msgType = "text";//回复信息类型为文本信息switch ( $keyword ){case "1"; //用户回复1,显示”公司简介”$contentStr = "公司简介";break;case "2";//用户回复1,显示”最新套餐”$contentStr = "最新套餐";break;default; //用户回复1、2以外的信息,显示”感谢您……”$contentStr = "感谢您关注川臂网络科技!回复“1”公司简介;回复“1”最新套餐";}选择Dreamweaver 修改---页面属性,将编码改为UTF-8保存,避免出现中文乱码。
微信公众号开发之文本消息自动回复php代码

微信公众号开发之⽂本消息⾃动回复php代码本⽂实例为⼤家分享了php微信⽂本消息⾃动回复别代码,供⼤家参考,具体内容如下2.wx_sample.php初始代码<?php/*** wechat php test*///define your tokendefine("TOKEN", "weixin");$wechatObj = new wechatCallbackapiTest();$wechatObj->valid();class wechatCallbackapiTest{public function valid(){$echoStr = $_GET["echostr"];//valid signature , optionif($this->checkSignature()){echo $echoStr;exit;}}public function responseMsg(){//get post data, May be due to the different environments$postStr = $GLOBALS["HTTP_RAW_POST_DATA"];//extract post dataif (!empty($postStr)){/* libxml_disable_entity_loader is to prevent XML eXternal Entity Injection,the best way is to check the validity of xml by yourself */libxml_disable_entity_loader(true);$postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);$fromUsername = $postObj->FromUserName;$toUsername = $postObj->ToUserName;$keyword = trim($postObj->Content);$time = time();$textTpl = "<xml><ToUserName><![CDATA[%s]]></ToUserName><FromUserName><![CDATA[%s]]></FromUserName><CreateTime>%s</CreateTime><MsgType><![CDATA[%s]]></MsgType><Content><![CDATA[%s]]></Content><FuncFlag>0</FuncFlag></xml>";if(!empty( $keyword )){$msgType = "text";$contentStr = "Welcome to wechat world!";$resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr);echo $resultStr;}else{echo "Input something...";}}else {echo "";exit;}}private function checkSignature(){// you must define TOKEN by yourselfif (!defined("TOKEN")) {throw new Exception('TOKEN is not defined!');}$signature = $_GET["signature"];$timestamp = $_GET["timestamp"];$nonce = $_GET["nonce"];$token = TOKEN;$tmpArr = array($token, $timestamp, $nonce);// use SORT_STRING rulesort($tmpArr, SORT_STRING);$tmpStr = implode( $tmpArr );$tmpStr = sha1( $tmpStr );if( $tmpStr == $signature ){return true;}else{return false;}}}>3.调⽤回复信息⽅法在wx_sample.php⽂件中注释掉$wechatObj->valid();,在其下增加⼀句“$wechatObj->responseMsg();”。
使用nodeJs开发微信公众号(设置自动回复消息)

使⽤nodeJs开发微信公众号(设置⾃动回复消息)微信向第三⽅服务器发送请求时会降 signature 、timestamp、 nonce 、 openid(⽤户标识),发送内容会以 xml 的形式附加在请求中想要获取⽤户发送信息,需要从请求中获得 xml ,因此需要⽤到 raw-body(获得原⽣请求体)npm install raw-body --save接下来需要将xml从请求中分离并且格式化成jsonvar getRawBody = require('raw-body')var contentType = require('content-type')var data = getRawBody(req, {length: req.headers['content-length'],limit: '1mb',encoding: contentType.parse(req).parameters.charset}, function(err, buf) {utils.formatMessage(buf.toString()).then(message => {//判断消息,做出回应})})我将格式化 xml 的操作封装在 formatMessagevar xml2js = require('xml2js')exports.formatMessage = function(xml) {return new Promise((resolve, reject) => {// 接收⽂本信息格式// <xml> <ToUserName><![CDATA[toUser]]></ToUserName>// <FromUserName><![CDATA[fromUser]]></FromUserName>// <CreateTime>1348831860</CreateTime>// <MsgType><![CDATA[text]]></MsgType>// <Content><![CDATA[this is a test]]></Content>// <MsgId>1234567890123456</MsgId></xml>xml2js.parseString(xml, function(err, content) {var result = content.xmlvar message = {};if (typeof result === 'object') {var keys = Object.keys(result);for (var i = 0; i < keys.length; i++) {var key = keys[i];var item = result[key];if (!(item instanceof Array) || item.length === 0) continue;if (item.length === 1) {var val = item[0];if (typeof val === 'object') message[key] = formatMessage(val);else message[key] = (val || '').trim();} else {message[key] = [];for (var j = 0, k = item.length; j < k; j++) message[key].push(formatMessage(item[j]));}}}resolve(message)})})}解析完成后我们可以拿到 FromUserName、MsgType 和 ContentMsgType可能是 event(事件)或者是 text (⽂本)event类型有:subscribe,unsubscribe,LOCATION,CLICK,SCAN根据 content中发送的内容,我们可以进⾏判断,返回⾃定义消息回复因此在返回信息前需要拼接内容成指定xml格式,我将拼接⽅法封装在 template.js ⽂件中,使⽤时只要直接调⽤即可lib/template.js:exports.textMessage = function(message){var createTime = new Date().getTime()return `<xml><ToUserName><![CDATA[${message.FromUserName}]]></ToUserName><FromUserName><![CDATA[${message.ToUserName}]]></FromUserName><CreateTime>${createTime}</CreateTime><MsgType><![CDATA[text]]></MsgType><Content><![CDATA[${message.reply}]]></Content></xml>`}exports.imageMessage = function(message){var createTime = new Date().getTime()return `<xml><ToUserName><![CDATA[${message.FromUserName}]]></ToUserName><FromUserName><![CDATA[${message.ToUserName}]]></FromUserName><CreateTime>${createTime}</CreateTime><MsgType><![CDATA[image]]></MsgType><Image><MediaId><![CDATA[${message.mediaId}]]></MediaId></Image></xml>`}exports.voiceMessage = function(message){var createTime = new Date().getTime()return `<xml><ToUserName><![CDATA[${message.FromUserName}]]></ToUserName><FromUserName><![CDATA[${message.ToUserName}]]></FromUserName><CreateTime>${createTime}</CreateTime><MsgType><![CDATA[voice]]></MsgType><Voice><MediaId><![CDATA[${message.mediaId}]]></MediaId></Voice></xml>`}exports.videoMessage = function(message){var createTime = new Date().getTime()return `<xml><ToUserName><![CDATA[${message.FromUserName}]]></ToUserName><FromUserName><![CDATA[${message.ToUserName}]]></FromUserName><CreateTime>${createTime}</CreateTime><MsgType><![CDATA[video]]></MsgType><Video><MediaId><![CDATA[${message.mediaId}]]></MediaId><Title><![CDATA[${message.title}]]></Title><Description><![CDATA[${message.description}]]></Description></Video></xml>`}exports.articleMessage = function(message){var createTime = new Date().getTime()return `<xml><ToUserName><![CDATA[${message.FromUserName}]]></ToUserName><FromUserName><![CDATA[${message.ToUserName}]]></FromUserName><CreateTime>${createTime}</CreateTime><MsgType><![CDATA[news]]></MsgType><ArticleCount>${message.articles.length}</ArticleCount><Articles>${message.articles.map(article =>`<item><Title><![CDATA[${article.title}]]></Title><Description><![CDATA[${article.description}]]></Description><PicUrl><![CDATA[${article.img}]]></PicUrl><Url><![CDATA[${article.url}]]></Url></item>`).join('')}</Articles></xml>`}⾃动回复整体流程:收到微信请求->校验是否来⾃微信->获取access_token->解析请求体xml->根据类型以及内容作出相应回复代码:var express = require('express')var router = express.Router()var getRawBody = require('raw-body')var contentType = require('content-type')var utils = require('../lib/utils.js')var template = require('../lib/template.js')// 微信官⽅请求回调接⼝router.all('/', function(req, res, next) {var data = getRawBody(req, {length: req.headers['content-length'],limit: '1mb',encoding: contentType.parse(req).parameters.charset}, function(err, buf) {if (err) return next(err)utils.formatMessage(buf.toString()).then(message => {if (message.MsgType == 'event') {if (message.Event === 'subscribe') {if (message.EventKey) {console.log('扫描⼆维码关注:' + message.EventKey + ' ' + message.ticket);}message.reply = '终于等到你,还好我没放弃';} else if (message.Event === 'unsubscribe') {message.reply = '';console.log(message.FromUserName + ' 悄悄地⾛了...');} else if (message.Event === 'LOCATION') {message.reply = '您上报的地理位置是:' + titude + ',' + message.Longitude; } else if (message.Event === 'CLICK') {message.reply = '您点击了菜单:' + message.EventKey;} else if (message.Event === 'SCAN') {message.reply = '关注后扫描⼆维码:' + message.Ticket;}res.send(template.textMessage(message))} else if (message.MsgType === 'text') {var content = message.Contentif (content === '1') {message.reply = '终于等到你'res.send(template.textMessage(message))} else if (content === '2') {message.mediaId = '需要发送图⽚的媒体id'res.send(template.imageMessage(message))} else if (content === '3') {message.articles = [{title: '标题',description: '描述',picUrl: '图⽚路径,不需要事先上传',url: '素材路径,素材需要事先上传'}]res.send(template.articleMessage(message))} else {message.reply = '你说的话:“' + content + '”,我听不懂呀'res.send(template.textMessage(message))}}})})});module.exports = router;。
python实现微信自动回复(自动聊天)

python实现微信⾃动回复(⾃动聊天)原⽂地址(本⼈):介绍微信⾃动回复其实主要就是登录,接收消息,回复消息三个功能,微信没有提供公开的API,但是可以分析⽹页版微信通信原理,通过模拟浏览器来实现需要的功能。
下⾯将给出微信⽹页版通信原理以及Python代码。
分析-获取uuid:GETParam _ (13位时间戳)Response window.QRLogin.code = 200; window.QRLogin.uuid = "4YyQFP2Daw==";-获取⼆维码:GET ==Param 4YyQFP2Daw== 即上⾯的uuidResponse ⼆维码图⽚-监听是否扫描⼆维码以及是否确认登录:GET https:///cgi-bin/mmwebwx-bin/login?loginicon=true&uuid=4YyQFP2Daw==Param uuid 同上Responsewindow.code=200;window.redirect_uri="https:///cgi-bin/mmwebwx-bin/webwxnewloginpage?ticket=ARxD7GSdBYtNHOxhK0BF0ek-@qrticket_0&uuid=4YyQFP2Daw==&lang=zh_CN&scan=1486743186";code:408 ⽆响应201 扫描⼆维码但没有登录(此时响应数据中还包含⽤户头像图⽚base64编码的字符串,UserAvatar)200 登录redirect_uri 为接下来需要请求的地址-获取后续访问所需要的key等GETParam URL为上次返回的redirect_uri 参数已经带上了Response<error><ret>0</ret><message/><skey>@crypt_828c27e0_e98d62f6954235194f2b1252943f25ad</skey><wxsid>0zEvAdWKm9ZZgYVn</wxsid><wxuin>1564527827</wxuin><pass_ticket>OLxGHwqL%2BWNArxvXaqjDy06qzdrSojq6DJwiBF19sgw2CibZSJBv1WwOXAfKnLIg</pass_ticket><isgrayscale>1</isgrayscale>< /error>-初始化POST https:///cgi-bin/mmwebwx-bin/webwxinit?r=-485039295&lang=zh_CN&pass_ticket=OLxGHwqL%2BWNArxvXaqjDy06qzdrSojq6DJwiBF19sgw2CibZSJBv1WwOXAfKnLIgParam r ( - + 9位随机数),pass_ticket,{"BaseRequest": {"Uin": "1564527827", "Skey": "@crypt_828c27e0_e98d62f6954235194f2b1252943f25ad", "DeviceID": "e924318232435460", "Sid": "0zEvAdWKm9ZZgYVn"}} 第三个参数其中为json数据,DeviceID为(e + 15位随机数)Response 返回json,包含⽤户⾃⼰的信息,最近联系⼈,订阅的公众号消息等等;这⾥只需要关注UserName=@821c154488cdddbfb04141aa8f681174305d21d67a24cfd6eca3e77a152e52ff 每位⽤户都有⼀个UserName,但是每次登陆UserName都是重新分配的,SyncKey 为⼀组key ,后⾯接收消息需要将其作为参数,同时每次接收接收消息时,也会返回⼀组SyncKey作为在下⼀次请求的参数,以此类推-状态检查这⾥会建⽴⼀个长连接,每次连接⼤约20秒左右,若新消息,⼿机端发出退出⽹页登录指令,或者状态异常会返回特定的状态码GET https:///cgi-bin/mmwebwx-bin/synccheck?r=1486743215000&skey=@crypt_828c27e0_e98d62f6954235194f2b1252943f25ad&sid=0zEvAdWKm9Z ZgYVn&uin=1564527827&deviceid=e891796429.95749&synckey=1_660530221%7C2_660530488%7C3_660530485%7C1000_1486721341&_=1486740215000 Paramr(时间戳),skey,sid,uin,deviceid,synckey(将SyncKey中的多组key 以 key1_value1|key2_value2 的形式拼接成字符串如:3_660530485|1000_1486721341),_ (时间戳) Responsewindow.synccheck={retcode:"0",selector:"2"}retcode=0 正常,1101 退出登录,1102 会话异常, selector= 0 ⽆变化 2or6 有消息-接收消息若状态检查到有新消息,则请求消息POST https:///cgi-bin/mmwebwx-bin/webwxsync?sid=0zEvAdWKm9ZZgYVn&skey=@crypt_828c27e0_e98d62f6954235194f2b1252943f25ad&lang=zh_CN&pass_ticket=OLxGHwqL%2BWNArxvXaqjDy06qzdrSojq6DJwiBF19sgw2CibZSJBv1 Paramsid,skey,pass_ticket 以及 json数据 {"SyncKey": {"Count": 4, "List": [{"Key": 1, "Val": 660530221}, {"Key": 2, "Val": 660530488}, {"Key": 3, "Val": 660530485}, {"Key":1000, "Val": 1486721341}]}, "BaseRequest": {"Sid": "0zEvAdWKm9ZZgYVn", "Skey": "@crypt_828c27e0_e98d62f6954235194f2b1252943f25ad", "DeviceID":"e141257009.76972", "Uin": "1564527827"}, "rr": "-888098293"} 其中rr (- + 9位随机数)Responsejson数据包含消息的所有信息,其中关注 FromUserName=@821c154488cdddbfb04141aa8f681174305d21d67a24cfd6eca3e77a152e52ff 消息发送者以及 Content消息内容-发送消息POST https:///cgi-bin/mmwebwx-bin/webwxsendmsg?lang=zh_CN&pass_ticket=0%2BoUqOWdYEen6oDVFEIv5ncIIaJcWs1LeSi69C8tUTgcp36azGAl6a8uT02PiaHuParam pass_ticket, json数据{"Msg": {"FromUserName": "@9e718026650771acd6d759922e000fafceaa1a5fda83aea7b3b70bc1bd6c3774", "LocalID":"14867488199507670", "ClientMsgId": "14867488199507670", "ToUserName": "@9e718026650771acd6d759922e000fafceaa1a5fda83aea7b3b70bc1bd6c3774","Content": "消息内容", "Type": "1"}, "BaseRequest": {"Sid": "5Qn7rswOtPRHFw92", "Skey": "@crypt_828c27e0_ad386b3d4d68a282eda03d7d5b2d3104","DeviceID": "e397471984070243", "Uin": "1564527827"}, "Scene": "0"} 其中LocalID,ClientMsgId 为13位时间戳加上5位随机数Response 返回响应的状态码,发送成功会返回 LocalID 和 ClientMsgID以上就是我们需要的知道的,当然其他⽐如读取所有联系⼈等都是⼤同⼩异,这⾥就不多赘述了。
6实现微信公众号自动回复功能

6实现微信公众号⾃动回复功能⼀实先⾃动回复功能的逻辑步骤 1 处理POST类型的控制逻辑,接收XML的数据包; 2 解析XML数据包(获得数据包的消息类型或者是事件类型); 3 拼装我们定义好的消息; 4 包装成XML格式; 5 在5秒内返回回去⼆代码实操--实现关注公众号⾃动回复功能 本节代码参照上节课继续修改和完善,⽬录结构跟之前相同,新引⼊的模块raw-body使⽤npm install安装⼀下即可,app.js启动⽂件和util.js不做变动,主要修改⼀下generator.js⽂件,以及在generator.js同级⽬录下新建wechat.js⽂件和tools.js⽂件。
wechat.js⽂件是将前⼀节generator.js⽂件中票据部分的代码抽离出来单独放在⼀个⽂件中,具体代码如下:'use strict';// 引⼊模块var Promise = require('bluebird');var request = Promise.promisify(require('request'));//增加url配置项var prefix = 'https:///cgi-bin/';var api = {accessToken: prefix + 'token?grant_type=client_credential'};//利⽤构造函数⽣成实例完成票据存储逻辑function weChat(opts) {var that = this;this.appID = opts.appID;this.appSecret = opts.appSecret;this.getAccessToken = opts.getAccessToken;this.saveAccessToken = opts.saveAccessToken;//获取票据的⽅法this.getAccessToken().then(function(data) {//从静态⽂件获取票据,JSON化数据,如果有异常,则尝试更新票据try {data = JSON.parse(data);} catch (e) {return that.updateAccessToken();}//判断票据是否在有效期内,如果合法,向下传递票据,如果不合法,更新票据if (that.isValidAccessToken(data)) {Promise.resolve(data);} else {return that.updateAccessToken();}})//将拿到的票据信息和有效期信息存储起来.then(function(data) {//console.log(data);that.access_token = data.access_token;that.expires_in = data.expires_in;that.saveAccessToken(data);})};//在weChat的原型链上增加验证有效期的⽅法weChat.prototype.isValidAccessToken = function(data) {//进⾏判断,如果票据不合法,返回falseif (!data || !data.access_token || !data.expires_in) {return false;}//拿到票据和过期时间的数据var access_token = data.access_token;var expires_in = data.expires_in;//获取当前时间var now = (new Date().getTime());//如果当前时间⼩于票据过期时间,返回true,否则返回falseif (now < expires_in) {return true;} else {return false;};};//在weChat的原型链上增加更新票据的⽅法weChat.prototype.updateAccessToken = function() {var appID = this.appID;var appSecret = this.appSecret;var url = api.accessToken + '&appid=' + appID + '&secret=' + appSecret;return new Promise(function(resolve, reject) {//使⽤request发起请求request({url: url,json: true}).then(function(response) {var data = response.body;var now = (new Date().getTime());var expires_in = now + (data.expires_in - 20) * 1000;//把新票据的有效时间赋值给datadata.expires_in = expires_in;resolve(data);})})};//向外暴露weChatmodule.exports = weChat; generator.js⽂件进⾏精简后,添加判断对xml数据的格式化⽅法以及判断事件,添加关注事件测试信息,具体代码如下:'use strict';// 引⼊模块var sha1 = require('sha1');var getRawBody = require('raw-body');var weChat = require('./wechat');var tools = require('./tools');// 建⽴中间件函数并暴露出去module.exports = function(opts, handler) {//实例化weChat()函数//var wechat = new weChat(opts);return function*(next) {//console.log(this.query);var that = this;var token = opts.token;var signature = this.query.signature;var nonce = this.query.nonce;var timestamp = this.query.timestamp;var echostr = this.query.echostr;// 进⾏字典排序var str = [token, timestamp, nonce].sort().join('');// 进⾏加密var sha = sha1(str);//使⽤this.method对请求⽅法进⾏判断if (this.method === 'GET') {// 如果是get请求判断加密后的值是否等于签名值if (sha === signature) {this.body = echostr + '';} else {this.body = 'wrong';};} else if (this.method === 'POST') {//如果是post请求也是先判断签名是否合法如果不合法直接返回wrongif (sha !== signature) {this.body = 'wrong';return false;};//通过raw-body模块可以把把this上的request对象也就是http模块中的request对象去拼装它的数据最终拿到⼀个buffer的xml数据//通过yield关键字获取到post过来的原始的XML数据var data = yield getRawBody(this.req, {length: this.length,limit: '1mb',encoding: this.charset});//console.log(data.toString());打印XML数据(当微信公众号有操作的时候终端可以看到返回的XML数据)//tools为处理XML数据的⼯具包使⽤tools⼯具包的parseXMLAsync⽅法把XML数据转化成数组对象var content = yield tools.parseXMLAsync(data);//console.log(content);打印转化后的数组对象//格式化content数据为json对象var message = tools.formatMessage(content.xml);console.log(message);//打印message//判断message的MsgType 如果是event 则是⼀个事件if (message.MsgType === 'event') {//如果是订阅事件if (message.Event === 'subscribe') {//获取当前时间戳var now = new Date().getTime();//设置回复状态是200that.status = 200;//设置回复的类型是xml格式that.type = 'application/xml';//设置回复的主体that.body = '<xml>' +'<ToUserName><![CDATA[' + message.FromUserName + ']]></ToUserName>' + '<FromUserName><![CDATA[' + message.ToUserName + ']]></FromUserName>' + '<CreateTime>' + now + '</CreateTime>' +'<MsgType><![CDATA[text]]></MsgType>' +'<Content><![CDATA[你好,同学!]]></Content>' +'</xml>';return;}}}}}; tools.js是处理XML数据的⼯具⽂件:'use strict';//引⼊模块var xml2js = require('xml2js');var Promise = require('bluebird');//导出解析XML的⽅法exports.parseXMLAsync = function(xml) {return new Promise(function(resolve, reject) {xml2js.parseString(xml, { trim: true }, function(err, content) {if (err) {reject(err);} else {resolve(content);};});});};//因为value值可能是嵌套多层的所以先对value值进⾏遍历function formatMessage(result) {//声明空对象messagevar message = {};//对result类型进⾏判断if (typeof result === 'object') {//如果是object类型通过Object.keys()⽅法拿到result所有的key 并存⼊keys变量中var keys = Object.keys(result);//对keys进⾏循环遍历for (var i = 0; i < keys.length; i++) {//拿到每个key对应的value值var item = result[keys[i]];//拿到keyvar key = keys[i];//判断item是否为数组或者长度是否为0if (!(item instanceof Array) || item.length === 0) {//如果item不是数组或者长度为0 则跳过继续向下解析continue;}//如果长度为1if (item.length === 1) {//拿到value值存⼊val变量var val = item[0];//判断val是否为对象if (typeof val === 'object') {//如果val为对象则进⼀步进⾏遍历message[key] = formatMessage(val);} else {//如果不是对象就把值赋给当前的key放⼊message⾥并去除收尾空格message[key] = (val || '').trim();}}//如果item的长度既不是0也不是1 则说明它是⼀个数组else {//把message的key设置为空数组message[key] = [];//对数组进⾏遍历for (var j = 0, k = item.length; j < k; j++) {message[key].push(formatMessage(item[j]));}}}}return message;}exports.formatMessage = function(xml) {return new Promise(function(resolve, reject) {xml2js.parseString(xml, { trim: true }, function(err, content) {if (err) {reject(err);} else {resolve(content);};});});};exports.formatMessage = formatMessage; 以上代码完成后,当关注微信测试公众号的时候,会⾃动回复『你好,同学!』的提⽰信息。
微信自动回复与自定义菜单操作流程(PPT 57张)

(1)首先,登陆第三方平台,找到已添加 好的账号,点击“编辑”,即可查看对应接 口地址(URL)与TOKEN。
(2)然后回到微信公众平台,点击主页面开 发者中心按钮,进入配置项,点击修改配置。
(3)将第三方平台的URL和Token粘贴复制进去,点 击提交,微信公众平台接口就与第三方平台接口连接 起来了。(无论使用哪一种第三方平台,只需要将你 使用的第三方平台的服务器配置即URL和TOKEN连接 到微信公众平台,则可使用第三方平台功能。)
激励学生学习的名言格言 220、每一个成功者都有一个开始。勇于开始,才能找到成功的路。 221、世界会向那些有目标和远见的人让路(冯两努——香港著名推销商) 222、绊脚石乃是进身之阶。 223、销售世界上第一号的产品——不是汽车,而是自己。在你成功地把自己推销给别人之前,你必须百分之百的把自己推销给自己。 224、即使爬到最高的山上,一次也只能脚踏实地地迈一步。 225、积极思考造成积极人生,消极思考造成消极人生。 226、人之所以有一张嘴,而有两只耳朵,原因是听的要比说的多一倍。 227、别想一下造出大海,必须先由小河川开始。 228、有事者,事竟成;破釜沉舟,百二秦关终归楚;苦心人,天不负;卧薪尝胆,三千越甲可吞吴。 229、以诚感人者,人亦诚而应。 230、积极的人在每一次忧患中都看到一个机会,而消极的人则在每个机会都看到某种忧患。 231、出门走好路,出口说好话,出手做好事。 232、旁观者的姓名永远爬不到比赛的计分板上。 233、怠惰是贫穷的制造厂。 234、莫找借口失败,只找理由成功。(不为失败找理由,要为成功找方法) 235、如果我们想要更多的玫瑰花,就必须种植更多的玫瑰树。 236、伟人之所以伟大,是因为他与别人共处逆境时,别人失去了信心,他却下决心实现自己的目标。 237、世上没有绝望的处境,只有对处境绝望的人。 238、回避现实的人,未来将更不理想。 239、当你感到悲哀痛苦时,最好是去学些什么东西。学习会使你永远立于不败之地。 240、伟人所达到并保持着的高处,并不是一飞就到的,而是他们在同伴们都睡着的时候,一步步艰辛地向上爬 241、世界上那些最容易的事情中,拖延时间最不费力。 242、坚韧是成功的一大要素,只要在门上敲得够久、够大声,终会把人唤醒的。 243、人之所以能,是相信能。 244、没有口水与汗水,就没有成功的泪水。 245、一个有信念者所开发出的力量,大于99个只有兴趣者。 246、环境不会改变,解决之道在于改变自己。 247、两粒种子,一片森林。 248、每一发奋努力的背后,必有加倍的赏赐。 249、如果你希望成功,以恒心为良友,以经验为参谋,以小心为兄弟,以希望为哨兵。 250、大多数人想要改造这个世界,但却罕有人想改造自己。
【易语言】开发微信群AI人工智能机器人,实现自动对话,智能回复聊天的功能

【易语⾔】开发微信群AI⼈⼯智能机器⼈,实现⾃动对话,智能回复聊天的功能⼯具我们已经打包好了,关注公众号“花花爱软件”回复“博客园”下载哈。
⽀持⼀下,码字不易需要的⼯具:l 易语⾔l 精易模块V8l 精易助⼿,朋友们⼤家好,我是今天的讲师,花花爱⼈,今天教⼤家⽤易语⾔开发⼀款属于你⾃⼰的,微信AI对话机器⼈,可以实现⾃动对话,群聊回复,⾃动监控微信消息,⾃动创建拉群的功能,废话不多讲,我们进⼊正题。
咋们先设计下软件的界⾯吧。
界⾯咋们已经设计好了主要就两⼤功能⼀键拉群和消息回复然后写核⼼代码我们双击⼀键启动按钮然后打开微信,获取窗⼝句柄,坐标等数据、建议⽤精易助⼿去获取,⽐较准确两个值都获取好了相对窗⼝:408 ,558微信窗⼝句柄:459122然后就把这些数据整合到我们的代码⾥⾯这就是代码,功能⾃⼰脑补继续写这个命令的功能是,⾃动向微信编辑框输⼊消息,来实现⾃动回复消息的功能我们先测试下效果吧,点击按钮后,会不会⾃动输⼊⽂字。
看来是可以的,点击按钮后⾃动向编辑框内输⼊了hello的字样接下来就是写发送的代码了此命令就可以实现模拟回车的效果,也就是发送消息了那这样就基本实现了,微信⾃动发消息回消息的功能了还有就是⾃动拉群的效果,其实这个⽐较简单我们下期在讲吧,时间有限。
直接分享拉群部分的代码:.版本 2.⽀持库 spec.⽀持库 eAPI.⽀持库 shellEx.程序集窗⼝程序集_启动窗⼝.⼦程序 _按钮1_被单击.判断开始 (单选框1.选中=真)指定⼿机号拉群 ().默认加群操作 ().判断结束.⼦程序指定⼿机号拉群.局部变量⼿机号, ⽂本型, , "0".局部变量 i, 整数型⼿机号=分割⽂本 (编辑框1.内容, #换⾏符, ).计次循环⾸ (取数组成员数 (⼿机号), i)⿏标_单击 (到整数 (编辑框_句柄.内容), 283, 34, 1)延迟 (2000)⿏标_单击 (到整数 (编辑框_句柄.内容), 137, 33, 1)置剪辑板⽂本 (⼿机号 [i])延迟 (1000)模拟按键 (#Ctrl键, #V键, ).计次循环尾 ().⼦程序 __启动窗⼝_创建完毕注册热键 (_启动窗⼝.取窗⼝句柄 (), 标签3.取窗⼝句柄 (), 0, #F1键)注册热键 (_启动窗⼝.取窗⼝句柄 (), 标签4.取窗⼝句柄 (), 0, #F2键).⼦程序加群操作.局部变量 i, 整数型⿏标_单击 (到整数 (编辑框_句柄.内容), 282, 34, 1)延时 (3000).计次循环⾸ (到整数 (编辑框_⼈数.内容), i)⿏标_单击 (到整数 (编辑框_句柄.内容), 151, 500, 1)延时 (2000)模拟按键 (40, , ).计次循环尾 ()信息框 (“准确⽣成群”, 0, , )延迟 (3000)⿏标_单击 (到整数 (编辑框_句柄.内容), 418, 452, 1).⼦程序 _按钮2_被单击.判断开始 (编辑框2.内容= “554480179”)信息框 (“临时注册成功”, 0, , ).默认按钮1.禁⽌=假单选框1.禁⽌=假.判断结束.⼦程序 _标签3_反馈事件, 整数型.参数参数⼀, 整数型.参数参数⼆, 整数型暂停 ().⼦程序 _标签4_反馈事件, 整数型.参数参数⼀, 整数型.参数参数⼆, 整数型编辑框_句柄.内容=到⽂本 (取⿏标所在窗⼝句柄 ())。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
参数说明:
$format:要格式化的字符串(微信中就是我们的xml数据)
$args:要格式化的变量列表,变量与变量之间通过逗号隔开,顺序不能颠倒
格式化类型:%d(格式化为整型)%s(格式化为字符串类型)
④把格式化后的xml数据返回到客户端,完成回复功能
案例
项目需求:用户在平台中输入?,系统自动弹出自定义回复文本信息如下:
$msgType==’video’ || $msgType==’shortvideo’视频消息
$msgType==’location’地理位置消息
$msgType==’link’链接消息(朋友圈分享的链接、我的收藏)
测试结果:
六
1
①组装XML格式的数据
②定义相关变量
③格式化XML格式的数据
要用到的知识点:sprintf函数
①分析文本消息接口XML模板
通过以上图解分析可知,如果MsgType节点为text,代表用户发送给微信公众平台的就是文本消息。
②定义一个$msgType变量,用于接收MsgType节点信息
③在回复接口中,判断$msgType这个变量并执行相关程序
编写完成后,通过SVN上传到BAE服务器,测试结果:
2
银行服务号码
建设银行:95533
工商银行:99588
农业银行:95599
当用户输入4,系统会自动弹出如下语句:
尊敬的用户,为了更好的为您服务,请将系统的不足之处反馈给我们。
反馈格式:@+建议内容
例如:@希望增加***号码
如果用户以@希望这种形式向平台输入信息,则返回如下语句:
感谢您的宝贵建议,我们会努力为您提供更好的服务!
4)通过属性来访问xml节点信息
5)根据接收的消息,设置返回值
以上代码代表当用户发送的关键词不为空时,系统会自动返回Welcome to wechat world!
五
虽然以上显示一共有7中消息类型,但是第4、第5种都是指视频消息,所以综合所述:只有6大类消息类型。
1
由于所有的信息都是以XML形式发送的,所以我们在分析消息类型时,第一点就应该读懂XML结构体。
②单击配置按钮,如下图所示:
③填写数据(三个表单)
④下载官方的api即可
如果想让微信公众平台与第三方BAE服务器进行交互,必须需要一个中间文件(微信api即可),我们可以在帮助中心找到该文件:
找到如下图所示代码,下载api接口:
下载解压后,如下图所示:
⑤复制wx_sample.php文件到BAE目录中并改名为api.php
平台地址:https:///
3
微信是基于点对点关系
微信公众平台是基于一对多关系
4
2013年6月速途研究院发布调查报告,22%的微信用户在使用订阅公众帐号功能,而只算微信有3亿用户,就约有6600多万用户在使用微信公众平台功能。
5
二
1
个人用户注册:
准备彩色手持身份证址:
高德地图、腾讯地址
八
1
在实际项目开发中,如果我们设定的关键词与用户输入的关键词不匹配时,系统默认没有任何响应,这样的体验度非常不好,为了解决这个问题,可以使用第三方机器人接口来实现对语言的对接。
2
1)微信小黄鸡(小贱鸡)
2)小九机器人
【1】特种服务号码
Байду номын сангаас【2】通讯服务号码
【3】银行服务号码
【4】用户反馈
当用户输入1,系统会自动弹出如下语句:
常用特种服务号码:
匪警:110
火警:119
急救中心:120
当用户输入2,系统会自动弹出如下语句:
常用通讯服务号码:
中移动:10086
中电信:10000
中联通:10010
当用户输入3,系统会自动弹出如下语句:
2
注册地址:,打开页面后,选择BAE基础版,效果如下图所示:
1)单击添加部署
2)设置完成后如下图所示:
等待状态改变为正常,代表已经创建成功。
3)使用SVN软件检出在线的BAE代码
然后使用SVN软件,检出该地址,如下图所示:检出过程中,需要提供账号和密码,作为检出密码,谨记!!!
服务号:企业注册的微信类型,适合企业平台,每月可以群发四条信息,另外如果服务器没有通过微信认证其也是具有微信自定义菜单的。
3
•编辑模式与开发模式
•两种是互斥的
•编辑模式是平台内置的web系统
•开发模式可以通过腾讯的API接口进行二次开发
1)编辑模式
2)开发者平台
4
①被添加自动回复(订阅回复或关注回复):当用户关注我们的微信公众平台时,系统会默认返回预先设定的内容,我们把这个回复就称之为”被添加自动回复“。
3)微软小冰机器人
4)图灵机器人
3
①注册图灵账号,注册完成后,官方会发送一个使用密钥,进入后单击左侧进入机器人接入链接:
②根据官方的API文档,定义一个tuling.php页面,编写代码如下:
③对接图灵机器人与微信公众平台
编写完成后,上传到服务器端,测试结果如下:
示例代码:
问号的判断形式:
运行结果:
输出1234返回结果,示例代码:
运行结果:
2
分析音乐回复接口的XML模板
①定义音乐回复接口的xml模板
②定义相关变量
③格式化XML数据
④输出返回数据到客户端
测试结果:
3
分析图文消息接口XML模板
①定义图文消息接口XML模板
②设置相关变量
③对XML数据进行格式化操作
3
•$longitude经度
•$latitude纬度
4
5
6
测试bAPI,如下图所示:
分析API接口:
①定义一个lbs.php页面,编写相关代码
②编写代码,如下图所示:
③整合lbs代码到微信api接口中
价值
一
1
1)2011年1月21日,腾讯推出微信(张小龙)
2)2012年8月20日,腾讯推出微信公众平台功能,同年11月开放第三方接口
3)2013年1月微信突破3亿,海外版wechat用户也达到7000万,以前和韩国客户沟通也是通过微信,可见微信已随处不在
2
微信公众平台是腾讯为了让用户申请和管理微信公众账号而推出的一个Web平台,而微信公众账号的操作管理在这个平台下进行。所有用户都在腾讯提供的统一微信公众平台下进行相关操作:
企业用户准备:
营业执照注册号、所在地、成立日期、营业期限、经营范围
微信公众帐号名称(中文名)一经注册,不得修改,一定要体现帐号特色又容易记忆的名称。功能介绍每月1次
注册成功后,需要7个工作日进行审核。
2
订阅号:个人用户注册的微信类型,适合自媒体类型的平台,每天可以群发一条信息,但是如果没有进行微信认证其是没有微信自定义菜单的。
①分析XML结构体
分析以上图解可知,如果用户发送的是图片消息,则MsgType节点为image
②定义$msgType节点(已定义)
③判断与执行
测试结果如下图所示:
3
在微信开发中,所有的接收接口都非常简单,只需要判断$msgType这个节点就可以实现对用户发送数据类型的判断,完整代码如下:
$msgType==’voice’语音消息
打开api.php文件,然后设置如下代码,代表开启自动回复功能:
编写成功后,通过SVN上传到服务器端,通过微信测试如下图所示:
四
1
2
3
4
默认情况下,自动回复接口是关闭的,必须通过以下代码开启回复功能:
分析responseMsg接口:
1)接收XML格式的数据
2)防止XXE攻击
3)使用SimpleXML解析xml数据
②关键词自动回复:当用户输入的关键词与我们设定的关键词相匹配时,系统会自动回复预先设定的内容,我们把这个回复就称之为”关键词自动回复“。
③消息自动回复:当用户输入的关键词与我们设定的关键词不匹配时,系统会自动回复预先设定的内容,我们把这个回复就称之为”消息自动回复“。
三
1
1)编辑模式
2)开发者模式
由上图分析可知,如果想实现微信开发,必须要具有BAE服务器与客户端SVN软件
④返回数据到客户端
测试结果:
在单图文的基础上实现多图文
测试结果:
说明:相对于单图文而言,多图文没有文章描述的显示,谨记!!!
七
1
LBS全称(Location Based Service),基于地理位置的服务
2
手机端相对于PC端,具有便于携带等优势,而且其内置的GPS芯片可以实时捕获到我们的地理位置信息。
4)修改代码后,通过SVN上传到服如下图所示:
但是这样非常麻烦,每次都需要手工更新,我们还可以单击weixin这个项目名称进入如下设置:
更改自动发布为On,如下图所示:
这样以后就不需要手工发布代码了。
3
①打开微信公众平台,进入基本配置选项:
⑥打开api.php文件,设置”接头暗号Token“
设置完成后,通过SVN进行上传
⑦对接微信公众平台与BAE服务器
打开基本配置选项,填写信息如下:
设置完成后,单击启用即可
到此,整个连接过程配置完毕!
4
默认情况下,api.php文件中,只开启了验证接口,但是其并没有开启自动回复接口,所以微信无任何响应。