上一节我们学习了如何设置开发环境,这一节武汉微信开发者将带您学习使用nodejs开发Q&A服务。武汉微信开发行业竞争非常的激烈,只有学好这些知识,我们才能够更好的去工作,去发展。
问答服务通常具有以下活动流程:
1.您的微信订阅账户的用户将一些文本发送到您的订阅账户,
2.微信平台将用户发送的消息委托给订阅账户中维护的给定网址。看下面的例子:
3.现在轮到你了:解析从微信平台发送的委托文本,并将答案发送回请求的HTTP响应。一旦完成,您的最终用户将在微信平台的帮助下得到答案。
在这个博客中,我将介绍两种实施的问答服务。
1.回声服务:您的订阅帐户用户将收到与发送的文本完全相同的文本。为了证明文本已经真正到达了nodejs服务器,我在echo字符串的前面添加了一个前缀“Add by Jerry:”。
看下面的例子:
2.调整服务:这个服务比echo服务更聪明:它会调用调整API来尝试与你的订阅账户用户聊天:
以下是实施这两种问答服务的具体步骤。
回声服务
1.实现server.js,这是您的nodejs服务器逻辑的入口点:
var express = require('express');
var routesEngine = require('./jerryapp/routes/index.js');
var app = express();
routesEngine(app);
app.listen(process.env.PORT || 3000, function () {
console.log('Listening on port, process.cwd(): ' + process.cwd() );
});
2.实现server.js中使用的index.js:
var request = require('request');
var echoService = require("../service/echo.js");
module.exports = function (app) {
app.route('/').post(function(req,res){
echoService(req, res);
});
};
上面的代码显示,当你的用户发送一个文本到你的订阅账户时,一个包含这个文本的HTTP post请求将被微信平台委托给你的nodejs服务器,因此你有责任从HTTP post解析文本,你自己的逻辑(简单的回声或调整处理),并发回响应。这个博客中的echo服务在模块echo.js中实现。
3.实现echo.js:
var getXMLNodeValue = require("../tool/xmlparse.js");
var replyMessage = require("../tool/replyMessage.js");
const content_pattern = /<!\[CDATA\[(.*)\]\]>/;
module.exports = function(req, res){
var _da;
req.on("data",function(data){
_da = data.toString("utf-8");
});
req.on("end",function(){
var Content = getXMLNodeValue('Content',_da);
var body = content_pattern.exec(Content);
if( body.length === 2) {
Content = "Add by Jerry: " + body[1];
}
var xml = replyMessage(_da, Content);
res.send(xml);
});
};
在这里,我只是简单地将硬编码的前缀“Jerry添加:”添加到原始文本并发回。
公用程序模块xmlparse.js的源代码:
module.exports = function(node_name, xml){
var tmp = xml.split("<"+node_name+">");
var _tmp = tmp[1].split("</"+node_name+">");
return _tmp[0];
};
replyMessage.js:
var getXMLNodeValue = require("./xmlparse.js");
module.exports = function(originalBody, contentToReply){
var ToUserName = getXMLNodeValue('ToUserName', originalBody);
var FromUserName = getXMLNodeValue('FromUserName',originalBody);
var CreateTime = getXMLNodeValue('CreateTime',originalBody);
var MsgType = getXMLNodeValue('MsgType',originalBody);
var Content = contentToReply;
var MsgId = getXMLNodeValue('MsgId', originalBody);
var xml = '<xml><ToUserName>'+FromUserName+'</ToUserName><FromUserName>'+ToUserName+'</FromUserName><CreateTime>'+CreateTime+'</CreateTime><MsgType>'+MsgType+'</MsgType><Content>'+Content+'</Content></xml>';
console.log("xml to be sent: " + xml);
return xml;
};
调谐服务
除了一些小的改进之外,它几乎和Echo服务一样。
在index.js中,只需使用tuningService替换echoService调用即可。
调谐服务模块的实施:
var request = require('request');
var getXMLNodeValue = require("../tool/xmlparse.js");
var replyMessage = require("../tool/replyMessage.js");
const content_pattern = /<!\[CDATA\[(.*)\]\]>/;
const url = "http://www.tuling123.com/openapi/api?key=de4ae9269c7438c33de5806562a35cac&info=";
module.exports = function(req, res){
var _da;
req.on("data",function(data){
_da = data.toString("utf-8");
});
req.on("end",function(){
console.log("original text: " + _da);
var Content = getXMLNodeValue('Content',_da);
console.log("content: " + Content);
var body = content_pattern.exec(Content);
console.log("result size: " + body.length);
var requesturl = "";
if( body.length === 2){
requesturl = url + encodeURI(body[1]);
}
var options = {
url: requesturl,
method: "GET"
};
request(options,function(error,response,data){
if(data){
var text = JSON.parse(data).text;
var xml = replyMessage(_da, text);
res.send(xml);
}else {
res.send("Error when calling Tuning API: " + error);
console.log(error);
}
});
});
};
在这个模块中,我只使用http://www.tulin123.com提供的免费调优服务,通过Restful API调用非常方便。