本文档介绍如何实现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"
}