根据Bot v4的setInterval数据发送主动消息

时间:2019-07-23 15:13:11

标签: javascript node.js botframework azure-bot-service

因此,我正在尝试将我的机器人迁移到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”具有值,则需要立即将其发送给用户,而无需他“询问”。

但是我想不出一种将其发送回用户的方法。

0 个答案:

没有答案