亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

nodejs微信開(kāi)發(fā)---自動(dòng)回復(fù)的實(shí)現(xiàn)

LeoHsiun / 3048人閱讀

摘要:上一篇接入指南這部分是實(shí)現(xiàn)簡(jiǎn)單的自動(dòng)回復(fù),當(dāng)然也是很大一部分功能的實(shí)現(xiàn)基礎(chǔ),這里使用了圖靈機(jī)器人的接口。的微信一年沒(méi)更新了如上圖,發(fā)送消息則會(huì)回復(fù)一個(gè)內(nèi)容一樣的消息,一個(gè)簡(jiǎn)單的自動(dòng)回復(fù)就實(shí)現(xiàn)了。

上一篇:接入指南
這部分是實(shí)現(xiàn)簡(jiǎn)單的自動(dòng)回復(fù),當(dāng)然也是很大一部分功能的實(shí)現(xiàn)基礎(chǔ),這里使用了圖靈機(jī)器人的接口。
效果圖如下:

當(dāng)然,這個(gè)機(jī)器人的效果如何不是我能管得了的事情了,類似圖靈機(jī)器人,我們還可以實(shí)現(xiàn)段子推送,快遞查詢等一系列功能,這里不一一實(shí)現(xiàn)了。

微信的消息處理

對(duì)于公眾平臺(tái),每一次發(fā)消息相當(dāng)于發(fā)出一個(gè)post請(qǐng)求,但是需要注意的是不管是發(fā)出的請(qǐng)求還是收到的回復(fù),他的數(shù)據(jù)格式都是xml,但是nodejs本身無(wú)法處理xml,所以需要對(duì)xml數(shù)據(jù)進(jìn)行處理。
仍然使用的是body-parser這個(gè)庫(kù),但是需要引入body-parser-xml:

//解析xml
app.use(bodyParser.xml({
  limit: "1MB",   // Reject payload bigger than 1 MB
  xmlParseOptions: {
    normalize: true,     // Trim whitespace inside text nodes
    normalizeTags: true, // Transform tags to lowercase
    explicitArray: false // Only put nodes in array if >1
  }
}));

這樣req.body.xml就是處理好的數(shù)據(jù)了。
一般文本消息的格式如下所示:


 
 
 1348831860
 
 
 1234567890123456
 

其中ToUserName是接受者的openid,FromUserName是發(fā)送者的openid,CreateTime就是一個(gè)整型的時(shí)間戳。MsgType就是消息類型,一般有文本(text),圖片(image),語(yǔ)音(voice),視頻(video),小視頻(shortvideo),地理位置(location)以及鏈接消息(link)。下面就以文本消息為例進(jìn)行編碼。

router.post("/", function (req, res) {

  res.writeHead(200, {"Content-Type": "application/xml"});

  var data = req.body.xml;
  var resMsg = "" +
    "" +
    "" +
    "" + parseInt(new Date().valueOf() / 1000) + "" +
    "" +
    "" +
    "";
  res.end(resMsg);
});

只需要將header的content-type設(shè)置為xml,返回一個(gè)xml的響應(yīng),那么公眾號(hào)就會(huì)相應(yīng)的回復(fù)一個(gè)消息,這里回復(fù)的消息是文本格式。(mac的微信一年沒(méi)更新了--)

如上圖,發(fā)送消息則會(huì)回復(fù)一個(gè)內(nèi)容一樣的消息,一個(gè)簡(jiǎn)單的自動(dòng)回復(fù)就實(shí)現(xiàn)了。

圖靈機(jī)器人

這個(gè)接口的使用十分簡(jiǎn)單,get請(qǐng)求鏈接,記得帶上apikey的頭,然后就會(huì)返回響應(yīng)的內(nèi)容。我這里請(qǐng)求使用的是nodejs request庫(kù)。

const request = require("request");
const config = require("../../config");

function getTuringResponse(info) {
  if(typeof info !== "string") {
    info = info.toString();
  }
  var options = {
    method:"GET",
    url: "http://apis.baidu.com/turing/turing/turing?key=879a6cb3afb84dbf4fc84a1df2ab7319&info="+info,
    headers: {
      "apikey": config.turingKey
    }
  };
  return new Promise((resolve, reject) => {
    request(options, function (err, res, body) {
      if (res) {
        resolve(body);
      } else {
        reject(err);
      }
    });
  })
}

module.exports = getTuringResponse;

使用promise處理異步返回的結(jié)果,避免多次回調(diào),記得把a(bǔ)pikey設(shè)置為header內(nèi)容。

公眾號(hào)機(jī)器人

好了,上面是二者分開(kāi)的講的,如果看到這應(yīng)該知道一個(gè)聊天機(jī)器人的實(shí)現(xiàn)是非常簡(jiǎn)單的了。就是將接口響應(yīng)的內(nèi)容返回給用戶(?如果不是非要自己實(shí)現(xiàn)聊天機(jī)器人的話。。。),后臺(tái)這里也就相當(dāng)于一個(gè)跳板。
turingRobot.js

const request = require("request");
const config = require("../../config");

function getTuringResponse(info) {
  if(typeof info !== "string") {
    info = info.toString();
  }
  var options = {
    method:"GET",
    url: "http://apis.baidu.com/turing/turing/turing?key=879a6cb3afb84dbf4fc84a1df2ab7319&info="+info,
    headers: {
      "apikey": config.turingKey
    }
  };
  return new Promise((resolve, reject) => {
    request(options, function (err, res, body) {
      if (res) {
        resolve(body);
      } else {
        reject(err);
      }
    });
  })
}

module.exports = getTuringResponse;

這部分代碼很簡(jiǎn)單了,就是將圖靈機(jī)器人的接口響應(yīng)消息返回出來(lái)。下面要做的就是將消息返回給用戶,這里有一點(diǎn)需要注意的是對(duì)于發(fā)出的響應(yīng),該接口不能直接響應(yīng)中文字符串,需要進(jìn)行urlencode。

//autoReply.js
const request = require("request");

function autoReply(requestData, info) {
  switch (requestData.msgtype) {
    case "text":
      var resMsg = "" +
        "" +
        "" +
        "" + parseInt(new Date().valueOf() / 1000) + "" +
        "" +
        "" +
        "";
      break;
  }

  return resMsg;
}

module.exports = autoReply;

自動(dòng)回復(fù)的模塊,主要是返回一個(gè)xml字符串,方便發(fā)送給用戶。

//weixin.js

router.post("/", function (req, res) {

  res.writeHead(200, {"Content-Type": "application/xml"});

  var content = req.body.xml.content;

  turingRobot(encodeURI(content)).then(function (data) {
    var response = JSON.parse(data);
    var resMsg = autoReply(req.body.xml, response.text);
    res.end(resMsg);
  })
});

好,這下算是完成機(jī)器人聊天的功能了。只要將代碼部署到leancloud里,就算是成功了。
github地址奉上:https://github.com/xiadd/shorthand 歡迎star?

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/79874.html

相關(guān)文章

  • 微信程序開(kāi)發(fā)系列教程(二)使用JavaScript給微信用戶發(fā)送消息

    摘要:我之前的文章微信程序開(kāi)發(fā)系列教程一開(kāi)發(fā)環(huán)境搭建介紹了微信開(kāi)發(fā)環(huán)境的搭建,這篇文章我們就來(lái)一步步開(kāi)發(fā)一些具體的功能。下文將該應(yīng)用稱為消息服務(wù)器。我們首先用的獲得一個(gè)對(duì)象當(dāng)有微信用戶關(guān)注您的公眾號(hào)時(shí),微信平臺(tái)會(huì)發(fā)送一個(gè)請(qǐng)求到您的消息服務(wù)器。 我之前的文章?微信程序開(kāi)發(fā)系列教程(一)開(kāi)發(fā)環(huán)境搭建?介紹了微信開(kāi)發(fā)環(huán)境的搭建,這篇文章我們就來(lái)一步步開(kāi)發(fā)一些具體的功能。 功能需求:當(dāng)有微信用戶關(guān)注...

    Near_Li 評(píng)論0 收藏0
  • 全棧最后一公里 - Node.js 項(xiàng)目線上服務(wù)器部署與發(fā)布

    摘要:沒(méi)有耐心閱讀的同學(xué),可以直接前往學(xué)習(xí)全棧最后一公里。我下面會(huì)羅列一些,我自己錄制過(guò)的一些項(xiàng)目,或者其他的我覺(jué)得可以按照這個(gè)路線繼續(xù)深入學(xué)習(xí)的項(xiàng)目資源。 showImg(https://segmentfault.com/img/bVMlke?w=833&h=410); 本文技術(shù)軟文,閱讀需謹(jǐn)慎,長(zhǎng)約 7000 字,通讀需 5 分鐘 大家好,我是 Scott,本文通過(guò)提供給大家學(xué)習(xí)的方法,...

    Nosee 評(píng)論0 收藏0
  • 微信程序開(kāi)發(fā)系列教程(二)微信訂閱號(hào)+人工智能問(wèn)答服務(wù)

    摘要:我的前一篇文章微信程序開(kāi)發(fā)系列教程一開(kāi)發(fā)環(huán)境搭建已經(jīng)介紹了微信服務(wù)器的開(kāi)發(fā)環(huán)境搭建。本文作為開(kāi)發(fā)系列的第二篇文章,介紹如何給您的微信訂閱號(hào)開(kāi)發(fā)一個(gè)最簡(jiǎn)單的問(wèn)答服務(wù),非常好玩。 我的前一篇文章微信程序開(kāi)發(fā)系列教程(一)開(kāi)發(fā)環(huán)境搭建?已經(jīng)介紹了微信服務(wù)器的開(kāi)發(fā)環(huán)境搭建。本文作為開(kāi)發(fā)系列的第二篇文章,介紹如何給您的微信訂閱號(hào)開(kāi)發(fā)一個(gè)最簡(jiǎn)單的問(wèn)答服務(wù),非常好玩。 這個(gè)系列的完整代碼在我的git...

    lncwwn 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<