搭建AI機器人(筆記)
公眾號申請
註冊一個公眾號
首先進入微信公眾號平臺,然後註冊一個賬號,型別選擇訂閱號,然後根據相應的提示完成資訊的填寫和驗證。具體操作可參考以下視訊。
後臺伺服器的搭建
安裝 NodeJS
首先執行以下命令
sudo su
下載最新的穩定版 v6.10.3 到本地
wgethttps://nodejs.org/dist/v6.10.3/node-v6.10.3-linux-x64.tar.xz
下載完成後, 將其解壓
tar xvJf node-v6.10.3-linux-x64.tar.xz
將解壓的 Node.js 目錄移動到 /usr/local 目錄下
mv node-v6.10.3-linux-x64 /usr/local/node-v6
配置 node 軟連結到 /bin 目錄
ln -s /usr/local/node-v6/bin/node /bin/node
配置 NPM
NPM 是 Node.js 的包管理和分發工具。它可以讓 Node.js 開發者能夠更加輕鬆的共享程式碼和共用程式碼片段
下載 node 的壓縮包中已經包含了 npm , 我們只需要將其軟連結到 bin 目錄下即可
ln -s /usr/local/node-v6/bin/npm /bin/npm
配置環境變數
將 /usr/local/node-v6/bin 目錄新增到 $PATH 環境變數中可以方便地使用通過 npm 全域性安裝的第三方工具
echo 'export PATH=/usr/local/node-v6/bin:$PATH' >>/etc/profile
生效環境變數
source /etc/profile
安裝 Express
安裝 Express 應用腳手架:
npm install express-generator -g
建立新的專案
執行
cd /data/
express yourApp
這時候會在 /data 生成應用目錄 /yourApp,繼續執行以下命令
cd yourApp
npm install
npm start
此時服務已經在 http://<您的 CVM IP 地址>:3000 上啟動,可以在瀏覽器中瀏覽測試。
進入開發者模式
配置伺服器資訊,進入開發者模式
微信平臺會去驗證你填寫的伺服器的有效性,所以配置伺服器前要先編寫伺服器有效性驗證的程式碼。
在終端使用 Ctrl + C 終止剛才啟動的服務,然後執行以下命令安裝依賴的檔案:
npm install xml2js sha1 querystring
- 編輯 app.js,參考下面的程式碼:
示例程式碼:/data/yourApp/app.js
var express = require('express');
var app = express();
var http = require('http');
var sha1 = require('sha1');
var xml2js = require('xml2js');
var querystring =require('querystring');
process.env.PORT = '80';
function checkSignature(req) {
// 獲取校驗引數
var signature =req.query.signature;
var timestamp =req.query.timestamp;
var nonce =req.query.nonce;
// 此處為實驗分配了一個 token,也可以修改為自己的 token
var token ='Password';
// 按照字典排序
var params =[token, timestamp, nonce];
params.sort();
// 連線
var str =sha1(params.join(""));
// 返回簽名是否一致
return str ==signature;
}
// 接入驗證
app.get('/', function(req, res) {
// 簽名成功
if(checkSignature(req)) {
res.send(200,req.query.echostr);
} else {
res.send(200,'fail');
}
});
module.exports = app;
啟動服務:
npm start
登入微信公眾號平臺,然後拉到頁面的最下面,點選基本配置選單。填寫以下資訊:
- 伺服器地址(URL):填寫 <您的 CVM IP 地址> [?]
- 令牌(Token):填寫上面程式碼中使用到的 Token,如無修改,直接使用 Password
- 訊息加解密金鑰(EncodingAESKey):隨機字串。可以讓平臺生成。
- 訊息加解密方式:選擇明文方式。
配置完畢後點擊提交,提交成功後,在基本配置選單頁面點選啟用。
此時,微信使用者給公眾號傳送的資訊,會由微信平臺轉發給您的伺服器,然後您的伺服器進行處理後返回給使用者。
在頁面點選提交,檢查是否可以提交成功。
這是您的伺服器地址,伺服器主要是用於實現機器人的邏輯。主機部分必須是公網 IP 或者可解析到公網 IP 的域名。
機器人的實現
實現機器人功能
首先在圖靈機器人官網註冊和申請一個機器人,具體步驟可以參考視訊。
申請之後,我們來呼叫 API 實現機器人的功能。
編輯 app.js,參考下面的程式碼 [?]:
示例程式碼:/data/yourApp/app.js
var express = require('express');
var app = express();
var http = require('http');
var sha1 = require('sha1');
var xml2js = require('xml2js');
var querystring =require('querystring');
process.env.PORT = '80';
function checkSignature(req) {
// 獲取校驗引數
var signature =req.query.signature;
var timestamp =req.query.timestamp;
var nonce =req.query.nonce;
// 此處為實驗分配了一個 token,也可以修改為自己的 token
var token ='Password';
// 按照字典排序
var params =[token, timestamp, nonce];
params.sort();
// 連線
var str =sha1(params.join(""));
// 返回簽名是否一致
return str ==signature;
}
// 接入驗證
app.get('/', function(req, res) {
// 簽名成功
if(checkSignature(req)) {
res.send(200,req.query.echostr);
} else {
res.send(200,'fail');
}
});
function handler(req, res) {
let buf = '';
// 獲取XML內容
req.setEncoding('utf8');
req.on('data',function(chunk) {
buf += chunk;
});
// 內容接收完畢
req.on('end',function() {
xml2js.parseString(buf, function(err, json) {
if (err) {
err.status= 400;
} else {
req.body =json;
}
});
let data =req.body.xml;
var msg = {
"toUserName" : data.FromUserName[0],
"fromUserName" : data.ToUserName[0],
"createTime" : data.CreateTime[0],
"msgType" : data.MsgType[0],
"content" : data.Content[0],
"msgId" : data.MsgId[0]
};
request(msg, req,res)
});
}
function request(data, req, res) {
var msg = {
"key":'6d76234cf7ee488d84aa1a54397ae866', // 可以填入自己申請的機器人的apiKey
"info": data.content,
"userid": ~~(Math.random() * 99999)
};
var text =querystring.stringify(msg);
var options ={
hostname:'www.tuling123.com',
path:'/openapi/api',
method:'POST',
headers:{
'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8'
}
};
var requestObj =http.request(options, function (response) {
var result ='';
response.setEncoding('utf8');
response.on('data', function (chunk) {
result+= chunk;
});
response.on('end',function() {
try{
var obj =JSON.parse(result);
}
catch(e){
data.content = e.message;
echo(data, res);
return;
}
data.content = obj.text;
echo(data,res);
})
});
requestObj.on('error', function (e) {
console.log('problem with request: ' + e.message);
data.content= e.message;
echo(data,res);
});
requestObj.write(text);
requestObj.end();
}
function echo(data, res) {
var time =Math.round(new Date().getTime() / 1000);
var output ="" +
"<xml>" +
"<ToUserName><![CDATA[" + data.toUserName +"]]></ToUserName>" +
"<FromUserName><![CDATA[" + data.fromUserName +"]]></FromUserName>" +
"<CreateTime>" + time + "</CreateTime>"+
"<MsgType><![CDATA[" + data.msgType +"]]></MsgType>" +
"<Content><![CDATA[" + data.content +"]]></Content>" +
"</xml>";
res.type('xml');
res.send(output);
}
// Start
app.post('/', function(req, res) {
handler(req,res);
});
module.exports = app;
操作鍵盤按下 Ctrl + C 終止之前的服務,然後重新啟動:
npm start
您可用對比模式檢視新增的部分
部署完成
訪問服務
在微信公眾號中關注自己的公眾號,然後傳送資訊給公眾號,測試是否有返回。在微信公眾號平臺可以對公眾號資訊進行管理。更復雜的邏輯可以參考微信公眾號平臺開發者文件和圖靈機器人開發文件。