最近写了一个微信的翻译机器人。用户只要关注该公众号,发送英文的消息,就能收到中文翻译的回复。有兴趣的读者可以扫描下面的二维码关注该公众号,尝试发送英文单词试试看。(有时候第一次发送单词会收到“该公众号暂时无法提供服务,请稍后再试”的消息。这种情况下不要紧,等一会再试就可以了)

服务的后台是用Node.js写的,托管在OpenShift的Paas平台上。翻译过程实际上是调用微软的Bing translation API做的,代码中用到了alexu84的bing-translate和JacksonTian的wechat这两个npm模块。下面把做的过程详细说一下。

1. 微信公众号开发

首先是要到https://mp.weixin.qq.com 申请一个公众号,并申请成为开发者。目前个人只能申请订阅号,不过订阅号也可以和用户进行消息的交互,这对我们的应用来说足够了。

成为开发者后,微信会给你一个AppID和一个AppSecret,都是一长串的字符串。在开发我们这个应用时,只要用到AppID。

微信客户端会接受用户输入的消息,并把它们转给我们的Web服务。所以微信会要求我们填写我们Web服务的URL地址,Token(令牌),EncodingAESKey(消息加解密密钥)。页面如下图所示:

大致上,填写好信息并提交后,微信服务器会发送一个GET请求到我们的Web服务,携带上Token和一个随机字符串。我们的Web服务必须按照微信开发者文档规定的方式处理这个请求,原样返回这个随机字符串,这样微信服务器才认为我们的Web服务是符合它的接入要求的。微信服务器转发消息给我们自己的Web服务时,是以一个POST消息携带上一个XML数据包,我们的web服务必须解析这个XML数据包才能取得用户发的消息。同样,当我们回复消息给微信服务器时,也要满足其规定的要求。所有这些,在微信的开发者文档中都有详细的描述。

我们当然可以仔细阅读微信的开发者文档,并自己按要求一一实现对应的接口,不过这样太麻烦了:-)。更方便的方式是使用JacksonTian的微信开发Node.js模块。使用这个模块,我们只需要填入我们的Token,APPID以及EncodingAESKey,它自动就帮我们处理好微信服务器的验证请求,并允许我们直接获取/回复用户的字符串消息,使我们不用处理XML数据解析等细节问题。在下文我会详细介绍如何使用这个模块。

2. 利用OpenShift托管Node.js Web服务

首先,我们要知道如何用Node.js开发一个Web服务。基本上,利用express模块,只需几行代码就可以搭起一个Web服务,像这样:

var express = require('express');

var app = express();
app.listen(80); app.get('/', function (req, res) {
res.send("hello world');
});

搭建好web服务后,我们需要一个拥有公有IP的服务器来运行这些代码。在这里我使用免费的OpenShift应用托管服务。

Youtube上有一个很好的视频介绍如何利用OpenShift建立和发布一个Node.js应用,step by step级别的,非常的详细。我们只需要看前30分钟就行了。基本上,OpenShift使用git来管理代码开发以及发布的过程。你建立一个应用,OpenShift就在云端为你创建了一个Git仓库,包含一个示例的Node.js应用,并把它在云端运行起来了。我们只要把这个Git仓库的代码Clone到本地,修改其中的server.js,并把修改好的代码push到云端,OpenShift就会自动帮我们停掉当前的示例服务,重新编译代码,重新发布并把我们修改过后的服务运行起来。超级的简单,是不是?

下面是稍微详细一点的步骤:

1)安装OpenShift的客户端工具rhc,我们需要利用这个工具创建、发布Node.js应用

2)在命令行窗口运行:

$ rhc app create <my app name> nodejs-0.10

这个命令为我们在云端创建了一个Git仓库,把内含的示例应用运行起来,并把代码帮我们clone到了本地。

3)修改server.js,运行:

$ git commit -am <some comment>

$ git push

我们自己的web服务就在云端运行起来了!

3. 使用bing-translate 和wechat NPM module

这一部分稍微详细介绍一下如何修改server.js,也就是如何使用bing-translate和wechat这两个NPM模块的。

还是直接上代码吧,因为总共就不到40行。其中第18行展示了如何使用wechat,第23行展示了如何使用bing-translate。

var express = require('express');
var kutil = require('./util/kutil.js');
var wechat = require('wechat'); var server_port = process.env.OPENSHIFT_NODEJS_PORT || 8080
var server_ip_address = process.env.OPENSHIFT_NODEJS_IP || '127.0.0.1' var client_id_secret = kutil.readJsonFromFile('./res/client_id_secret.json');
var wechat_app_config = kutil.readJsonFromFile('./res/wechat_app_config.json'); var bt = require('./util/bing-translate.js').init(client_id_secret); var app = express();
app.listen(server_port, server_ip_address); // wechat API
app.use(express.query());
app.use('/wechat', wechat(wechat_app_config, function (req, res, next) {
var message = req.weixin;
if (message.MsgType == 'text') {
var input_word = message.Content; bt.translate(input_word, 'en', 'zh-CHS', function (translate_err, translate_res) {
if (translate_err) {
res.reply({
content: 'translation error',
type: 'text'
});
return;
} var translate_result = translate_res["translated_text"];
res.reply({
content: translate_result,
type: 'text'
});
});
}
}));

因为不想在开源的代码中明文写上APPID等敏感信息,我又写了一个util从Json文件中读取这些信息。第8行是读Bing translation app的ID和secret,第9行是读微信的APPID。这些信息分别写在两个Json文件中,格式如下:

{
"client_id": "your-Bing-translator-app-client_id",
"client_secret": "your-Bing-translator-app-client_secret"
}
{
"token": "your_wechat_app_token",
"appid": "your_wechat_app_appid",
"encodingAESKey": "your_wechat_app_AESKey"
}

另外,有人可能会注意到我没有直接使用bing-translate模块,而是引用了一个本地的bing-translate.js文件。这是因为我对该模块的源文件做了少量的改动,主要是在本地cache了一个Bing translation API的token,这样就不用每次翻译的时候都去调微软的Web API重新拿token了,翻译响应的速度会大大提高。有空的时候我会把这个改动push给alexu84试试看。

4. 关于Microsoft Bing Translation API

大家都注意到在上一部分我们要填入Bing Translation的client ID和client secret。这是因为Bing Translation API也是一个Web服务,我们需要到这个页面去申请一个Bing Translation的app,申请好后,就有了我们自己的client ID 和 secret。当然这里可能涉及到要注册微软的账号什么的,在此就不赘述了。

最后,我的代码都放到了GitHub上,除了把APPID和secret什么的替换成示例的字符串,其他的就和我在OpenShift上发布的代码一模一样了。

参考资源

1. Jose Annunziato: 如何利用OpenShift 发布 Node.js应用的视频 https://www.youtube.com/watch?v=wnRtA7a0ST0

2. alexu84: Bing translation API 的Node.js wrapper https://github.com/alexu84/bing-translatehttps://github.com/alexu84/bing-translate

3. JacksonTian: 微信API的Node.js wrapper https://github.com/node-webot/wechat

4. Bing Translation API: http://blogs.msdn.com/b/translation/p/gettingstarted1.aspx

5. 我的代码示例:https://github.com/kaige/KDict/tree/master/openshift_host_code/kdict

利用OpenShift托管Node.js Web服务进行微信公众号开发的更多相关文章

  1. ASP.NET Web API实现微信公众平台开发(一)服务器验证

    最近朋友的微信公众号准备做活动,靠固定的微信公众平台模版搞定不了,于是请我代为开发微信后台.鉴于我也是第一次尝试开发微信后台,所以也踩了不少坑,此系列博客将会描述微信公众号各项功能的实现. 先决条件 ...

  2. 利用NATAPP隧道解决微信公众号开发之本地调试难题

    一.问题 众所周知,微信公众号开发需要公网的有效域名和80端口,本机当然互联网是访问不了的.那么我们难道去一个公网的服务器去开发吗?那样是不是太土了. 答案当然是,NO 当然我们在做微信支付的时候,有 ...

  3. 带领技术小白入门——基于java的微信公众号开发(包括服务器配置、java web项目搭建、tomcat手动发布web项目、微信开发所需的url和token验证)

    微信公众号对于每个人来说都不陌生,但是许多人都不清楚是怎么开发的.身为技术小白的我,在闲暇之余研究了一下基于java的微信公众号开发.下面就是我的实现步骤,写的略显粗糙,希望大家多多提议! 一.申请服 ...

  4. Serverless Web Function 实践教程(一):快速部署 Node.js Web 服务

    作为目前广受欢迎的 Web 服务开发语言,Node.js 提供了众多支持 HTTP 场景的相关功能,可以说是为 Web 构建而生.因此,基于 Node.js,也诞生了多种 Web 服务框架,它们对 N ...

  5. 微信公众号开发总结(Node.js + express + winston)

    关于订阅号.服务号.企业号 官方定位 订阅号:主要偏于为用户传达资讯(类似报纸杂志),认证后每天可以群发一条消息,可达到宣传效果,构建与读者之间更好的沟通和管理模式. 服务号:主要偏于服务交互(类似银 ...

  6. 微信支付配置信息,JSAPI接口,H5调用微信js接口支付,微信公众号支付

    微信支付已经做完了,没接触过微信的我,经历了非常艰难的3天,才把微信支付给做出来,对于专业的人来说,估计就是一小时就搞定的事情了,虽然说做了很长时间,但是确实也学到东西了,也收获了不少,下面跟大家分享 ...

  7. ASP.NET Web API实现微信公众平台开发(三)自定义菜单

    承接之前的流程,在完成服务器绑定和获取access_token之后,本文主要讲述如何实现微信自定义菜单. 官方示例效果 开始之前 .自定义菜单最多包括3个一级菜单,每个一级菜单最多包含5个二级菜单. ...

  8. [资料分享]7天搞定Node.js微信公众号开发

  9. 微信公众号开发之被逼学web服务端1-----使用SecureCRT连接Linux服务器

    做Android的进新公司后安排做微信公众号开发,这基本是后台和前端的活都要由小白的我来做,这两天基本成鸭子了,被填的满满的,却还是不够,博文仅作记录,希望能给后来的小白一点参考吧 今天做的是如何配置 ...

随机推荐

  1. Markdown写博客

    一级目录 我接下来是不是该写二级目录了 二级目录 如果我用桌面端的Markdown会不会好很多,这个我看不到效果 听说插入表格很麻烦? 列表是这样的? 我还看不出样子 *这个是什么样子啊 引用是这样用 ...

  2. CA签发工具

    #!/bin/bash #author Sun Ying #date:2015-12-17 if [ $# -lt 1 ];then echo -e "\033[34mUsage: `bas ...

  3. java笔试面试二

    http://www.cnblogs.com/lanxuezaipiao/p/3371224.html

  4. mysql卸载(转)

    按以下步骤卸载mysql server 主要步骤: 1. 停止服务MySQL 2. 卸载mysql相关的程序 3. 删除注册表(运行->regedit),machine->system-& ...

  5. CubieTruck上安装mjpg_streamer

    最近手头项目需要用到一个上位机,需要在上位机上实现远程访问及视频监控.其中视频监控采用了网上资料较多的mjpg_streamer进行视频处理.在使用中遇到许多坑也一并记录下来. 首先安装依赖环境和检测 ...

  6. Nginx系列一:信号与配置

    一.Nginx与信号 Nginx支持平滑重启,相比于Apache,修改了配置文件后可以不需要先停止程序,再重新启动. 1.启动 nginx –c nginx.conf 其中,-c nginx.conf ...

  7. nodejs安装心得

    首先下载nodejs,http://nodejs.org/download/ 配置系统环境变量 管理员运行cmd, 输入命令 node -v 查看版本 安装npm Npm安装命令 npm-1.3.15 ...

  8. scala-类

    ---恢复内容开始--- 随笔记录scala中,有哪些类,如何定义一个类,有哪些注意点. 一,scala中有哪些类? 1,简单类 class 2,单例模式 object 3,伴生类 4,case cl ...

  9. c#判断闰年

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  10. favicon.ico应用与正则表达式验证邮箱(可自动删除前后的空格)

    1.favicon.ico制作:favicon.ico可以ps制作;“shortcut icon”中间有一个空格 <head> <link rel="shortcut ic ...