微信对话开放平台对接自定义服务

1,321 阅读3分钟

本文档介绍如何实现qabot对接任意第三方api服务

一、概述

首先这不是qabot的能力,而是微信开放对话平台的功能,在这里只是提供一个对接方案,实现思路:
1. 使用云平台提供的函数计算提供的http触发器来实现一个连接器(接口转换)
2. 将连接器的https地址注册到简单问答或高级问答的的hook中

1.1 业务实现流程方案

1. 接收对话平台推送的消息
2. 解析消息中的用户唯一标识和原始问题
3. 调用第三方api服务返回内容
4. 将内容重新打包后返回给微信对话开放平台

1.2 会话对接样例

机器人对接回复消息的标准消息格式

1.2.1 H5请求

{

"ans_node_id":25875176,

"ans_node_name":"Moments",

"answer":"打印一张你的照片放在口袋,今天我就是身藏巨款的人,你最珍贵",

"answer_open":1,

"answer_type":"text",

"confidence":1,

"create_time":"1670173803685",

"from_user_name":"o9U-85gMu2xUm5B5G2sA0WRxn9b0",

"msg_id":"8650151a",

"request_id":1530536540,

"skill_id":"",

"skill_name":"Moments",

"status":"FAQ",

"title":"说句情话",

"to_user_name":"157787",

"msgtype":"callback"

}

1.2.2 机器人请求

{

"ans_node_id":25875186,

"ans_node_name":"通用问题",

"answer":"说不清为什么爱你,但你就是我不爱别人的理由。",

"answer_open":1,

"answer_type":"text",

"confidence":1,

"create_time":"1670174749822",

"from_user_name":"tyutluyc/5854608913@chatroom",

"msg_id":"62643ff8",

"request_id":50529027,

"skill_id":"",

"skill_name":"通用问题",

"status":"FAQ",

"title":"来呀情话",

"to_user_name":"5jr7aQC0iN3m97szkMcmAsdyae4u8B",

"msgtype":"callback"

}

1.3 核心逻辑

基于node.js的实现,其他语言实现可参考逻辑


const nlu = body.nlu

const text = nlu.query

const userid = nul.from_user


const res = 调用api

const answer = res.xxx

nul.anwser = anwser

三、示例代码

对话平台简单问答对接自定义API

3.1 微信对话平台推送到自定义服务消息的body

{

"touser":"",

"nlu":{

"ans_node_id":25875176,

"ans_node_name":"Moments",

"answer":"打印一张你的照片放在口袋,今天我就是身藏巨款的人,你最珍贵",

"answer_open":1,

"answer_type":"text",

"article":"",

"bid_stat":{

"curr_time":"20221205-01:07:24",

"err_msg":"",

"latest_time":"20221205-01:07:24",

"latest_valid":true,

"up_ret":0

},

"confidence":1,

"create_time":"1670173803685",

"dialog_session_status":"NONE",

"dialog_status":"NONE",

"event":"",

"from_user_name":"o9U-85gMu2xUm5B5G2sA0WRxn9b0",

"intent_confirm_status":"",

"is_default_answer":false,

"list_options":false,

"msg":[

{

"ans_node_id":25875176,

"ans_node_name":"Moments",

"article":"",

"confidence":1,

"content":"",

"debug_info":"",

"event":"",

"list_options":false,

"msg_type":"text",

"opening":"",

"request_id":1530536540,

"resp_title":"说句情话",

"scene_status":"",

"session_id":"b86dbb39f1b644b48157f566710563e2",

"status":"FAQ",

"take_options_only":false

}

],

"msg_id":"8650151a",

"opening":"",

"request_id":1530536540,

"ret":0,

"scene_status":"",

"session_id":"b86dbb39f1b644b48157f566710563e2",

"skill_id":"",

"skill_name":"Moments",

"slot_info":[

  


],

"slots_info":[

  


],

"status":"FAQ",

"take_options_only":false,

"title":"说句情话",

"to_user_name":"157787",

"msgtype":"callback"

},

"query":"说句情话"

}

3.2 自定义接口返回消息时只需要将赋值 body.answer 改变原始消息的answer



exports.handler = async (event, context, callback) => {

const ctx = event

console.debug(ctx)

  


const params = ctx.pathParameters

console.debug(params)

const queryStringParameters = ctx.queryStringParameters || {}

  


const HOST = 'api.vvhan.com'

const qs = queryStringParameters

const body = {}

const method = 'GET'

const path = `/api/love`

let headers = {}

  


var uri = 'http://' + HOST + path

  


let opt = {

method,

uri,

qs,

body,

headers,

json: true

}

console.debug(opt)

try {

let res = await rp(opt)

console.debug(res)

let body = JSON.parse(ctx.body)

body.nlu.answer = res

const nlu = body.nlu

console.debug(nlu)

  


const msg = {

"isBase64Encoded": false,

"statusCode": 200,

"headers": {},

"body": JSON.stringify(nlu)

}

callback(null, msg);

}

catch (err) {

callback(null, err);

}

  


};



3.3 返回的消息body到微信


"ans_node_id":25875176,

"ans_node_name":"Moments",

"answer":"打印一张你的照片放在口袋,今天我就是身藏巨款的人,你最珍贵",

"answer_open":1,

"answer_type":"text",

"article":"",

"bid_stat":{

"curr_time":"20221205-01:07:24",

"err_msg":"",

"latest_time":"20221205-01:07:24",

"latest_valid":true,

"up_ret":0

},

"confidence":1,

"create_time":"1670173803685",

"dialog_session_status":"NONE",

"dialog_status":"NONE",

"event":"",

"from_user_name":"o9U-85gMu2xUm5B5G2sA0WRxn9b0",

"intent_confirm_status":"",

"is_default_answer":false,

"list_options":false,

"msg":[

{

"ans_node_id":25875176,

"ans_node_name":"Moments",

"article":"",

"confidence":1,

"content":"",

"debug_info":"",

"event":"",

"list_options":false,

"msg_type":"text",

"opening":"",

"request_id":1530536540,

"resp_title":"说句情话",

"scene_status":"",

"session_id":"b86dbb39f1b644b48157f566710563e2",

"status":"FAQ",

"take_options_only":false

}

],

"msg_id":"8650151a",

"opening":"",

"request_id":1530536540,

"ret":0,

"scene_status":"",

"session_id":"b86dbb39f1b644b48157f566710563e2",

"skill_id":"",

"skill_name":"Moments",

"slot_info":[

  


],

"slots_info":[

  


],

"status":"FAQ",

"take_options_only":false,

"title":"说句情话",

"to_user_name":"157787",

"msgtype":"callback"

}