因此,我正在尝试将我的机器人迁移到v4,同时向其中添加实时聊天功能。
我的用例是这样:
我有一个二级非Azure机器人,其中包含我的所有知识库,触发器和响应。这个辅助机器人具有用于直接通信的API,它的一种方法是处理向机器人的直接消息,我们称其为“对话”。然后还有另一种从实时聊天中获取数据的方法,我们称此为“轮询”,您可以每秒对实时聊天进行“轮询”,如果那里有响应,您将得到它,如果没有,则返回API响应为空白,这是可以接受的,我已经准备好在我的代码中处理它了。
我遇到的困难:我可以使用“对话”向Bot发送和接收消息,甚至可以开始轮询实时聊天对话,然后查看其中的内容。但是我需要获取其中的内容并将其发送回用户。
我尝试将上下文声明为“全局”,但似乎我做错了,我收到: TypeError:无法对已被撤销的代理执行“设置” < / p>
这是我的Talk功能 它可以按预期工作,这意味着当用户向AzureBot v4键入内容时,它总是将信息发送到辅助bot。
当它收到特殊动作以启动实时聊天(由辅助机器人处理)时,也会触发 islivechat 为true。
async function Talk(context, next) {
var Talk_parameters = {
"type": "talk",
"parameters": {
"userUrl": "aHR0cHM6Ly9zdGF0aWw=",
"alreadyCame": true,
"os": "V2luZG93cyAxMC4w",
"browser": "RmlyZWZveCA2OA==",
"disableLanguageDetection": true,
"contextType": "V2Vi",
"mode": "U3luY2hyb24=",
"botId": "a3f3b9fb-********-5f6ba69bb9da",
"qualificationMode": true,
"language": "cHQ=",
"space": "Default",
"solutionUsed": "QVNTSVNUQU5U",
"clientId": "UEZIdDhrMXVVbGU5b0lw",
"useServerCookieForContext": false,
"saml2_info": "",
"pureLivechat": false,
"userInput": Buffer.from(VArequestData.parameters.userInput).toString('base64'),
"templateFormats": "",
"contextId": VArequestData.parameters.contextId,
"timestamp": new Date().valueOf()
}
}
console.log(Talk_parameters);
return new Promise(resolve => {
request({
url: "https://sma********.com/servlet/chatHttp",
method: "GET",
body: Talk_parameters,
headers: {},
json: true
}, async function (error, response, body) {
if(!error)
resolve(body);
})
}).then(response_values => {
console.log(response_values);
VAresponseData.text = Buffer.from(response_values.values.text,'base64')
VAresponseData.context = response_values.values.contextId
VArequestData.parameters.contextId = response_values.values.contextId
if (response_values.values.specialAction == "U3RhcnRQb2xsaW5n"){
islivechat = true;
}
})
}
SetInterval部分
setInterval(async function(){
if (islivechat == true){
Poll()
console.log("Polling data!")
msg();
}
}, 1000);
投票功能 当islivechat == true时,此人每秒运行一次,从与辅助bot的对话中获取数据。我可以在“ VAresponseData.livechatText = response_values.values.text”行中获得所需的确切值,但无法将其发送回用户。
async function Poll(context) {
// Setting URL and headers for request
var Polling_parameters = {
type:"poll",
parameters:{
lastPoll: VArequestData.parameters.lastPoll,
mode : "Polling",
contextId: VArequestData.parameters.contextId,
botId : VArequestData.parameters.botId,
qualificationMode : VArequestData.parameters.qualificationMode,
language : VArequestData.parameters.language,
space : VArequestData.parameters.space,
solutionUsed :"LIVECHAT",
timestamp : new Date().valueOf()
}
}
console.log(Polling_parameters);
return new Promise(resolve => {
request({
url: "https://sma**************.com/servlet/chatHttp",
method: "POST",
body: Polling_parameters,
headers: {},
json: true
}, async function (error, response, body) {
if(!error)
resolve(body);
})
}).then(async (response_values) => {
if(response_values.values.specialAction == "RW5kUG9sbGluZw=="){
islivechat = false;
}
console.log(response_values);
console.log("CONTEXT")
console.log(response_values.values.contextId);
console.log(Polling_parameters.parameters.contextId);
VArequestData.parameters.lastPoll = response_values.values.serverTime
VAresponseData.livechatText = response_values.values.text
console.log('xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx >>> ' + response_values.values.text)
sendLivechatMsg();
})
}
我的尝试失败: 此函数在主代码之外声明,这意味着任何其他函数都可以访问该函数,但是我收到 TypeError:在运行该代理时,无法对已撤销的代理执行“设置” 。我尝试为其运行console.log,而代码甚至都没有到达那一部分。
async function sendLivechatMsg(globalContext){
context = globalContext;
await msg(VAresponseData.livechatText, context)
.then(async function(){
context.sendActivity(VAresponseData.livechatText)
.then(
console.log('activity')
)
})
await next();
}
主要阶段 我使用了Bot v4的示例代码,仅更改了一些内容
class EchoBot extends ActivityHandler {
constructor() {
super();
// See https://aka.ms/about-bot-activity-message to learn more about the message and other activity types.
this.onMessage(async (context, next) => {
VArequestData.parameters.userInput = context.activity.text;
await Talk(context, next)
.then(async function(data){
context.sendActivity(`'${ VAresponseData.text }'`)
// context.sendActivity(`'${ VAresponseData.context }'`)
}, error => {
console.log('ERROR: ' + error)
})
await next();
}
);
// this.onMembersAdded(async (context, next) => {
// setTimeout(() => startPolling(context), 3000);
// const membersAdded = context.activity.membersAdded;
// for (let cnt = 0; cnt < membersAdded.length; ++cnt) {
// if (membersAdded[cnt].id !== context.activity.recipient.id) {
// // await context.sendActivity('Hello and welcome!');
// }
// }
// // By calling next() you ensure that the next BotHandler is run.
// await next();
// });
this.onTurn
}
}
预期的情况是:
如果用户处于实时聊天中,并且变量“ VAresponseData.livechatText”具有值,则需要立即将其发送给用户,而无需他“询问”。
但是我想不出一种将其发送回用户的方法。