首页 > 解决方案 > 无法在 Azure 机器人框架中拦截机器人响应

问题描述

我想拦截用户和机器人之间交换的所有消息。我用来拦截的PFB代码。我正在使用 Bot Dialoglog 框架进行网络聊天。这里的问题是我无法从包含从机器人发送给用户的消息的活动对象中提取值。

adapter.use(async (turnContext, next) => {
// pre-processing of the current incoming activity
console.log("adapture use::turnContext::" + turnContext.activity.text);


// hook up a handler to process any outgoing activities sent during this turn
turnContext.onSendActivities(async (sendContext, activities, nextSend) => {
    // pre-processing of outgoing activities
    await nextSend();
    console.log("adapture use::activities::POST##::" + flat.stringify(activities));
    // post-processing outgoing activities
});

await next();

// post-processing of the current incoming activity 
console.log(`Processing activity ${turnContext.activity.id} finishing. `);

});

标签: node.jsazurebotframeworkchatbot

解决方案


要访问机器人的响应,您可以将 bot.js 文件(即定义了活动处理程序的文件)更新为如下所示的内容。

简而言之,该onSendActivities()方法保留了已传入的活动数组。您可以循环遍历将它们推入数组的活动,然后对特定的活动进行操作。或者,在每个到达时做出反应。下面是每个输出的示例。

const { ActivityHandler, MessageFactory } = require('botbuilder');

class EchoBot extends ActivityHandler {
    constructor() {
        super();

        [...]

        const transcript = [];
        this.onTurn(async (context, next1) => {
            let responses = {};

            logActivity(transcript, cloneActivity(context.activity));

            context.onSendActivities(async (ctx, activities, next2) => {
                responses = await next2();
                activities.forEach((a) => logActivity(transcript, cloneActivity(a)));
                console.log('TRANSCRIPT ', activities);
                return responses;
            });

            await next1();
        });
    }
}

const logActivity = (transcript, activity) => {
    if (!activity.timestamp) {
        activity.timestamp = new Date();
    }
    transcript.push(activity);
};

const cloneActivity = (activity) => {
    return Object.assign({}, activity);
};

module.exports.EchoBot = EchoBot;

记录transcript数组:显示活动列表。

[
  {
    type: 'conversationUpdate',
    id: '1hEUP37Da8S',
    timestamp: 2021-09-07T23:01:04.910Z,
    serviceUrl: 'https://directline.botframework.com/',
    channelId: 'directline',
    from: { id: 'dl_16310556645490.nc93iu9jr1' },
    conversation: { id: '5JgOxxxxxxxxxxxxv6sw-g' },
    recipient: { id: 'somebot@QaeuoeEamLg', name: 'Some Bot' },
    membersAdded: [ [Object], [Object] ],
    rawTimestamp: '2021-09-07T23:01:04.9109865Z',
    callerId: 'urn:botframework:azure'
  },
  {
    type: 'message',
    text: 'Hello and welcome!',
    inputHint: 'acceptingInput',
    speak: 'Hello and welcome!',
    channelId: 'directline',
    locale: undefined,
    serviceUrl: 'https://directline.botframework.com/',
    conversation: { id: '5JgOxxxxxxxxxxxxv6sw-g' },
    from: { id: 'somebot@QaeuoeEamLg', name: 'Some Bot' },
    recipient: { id: 'dl_16310556645490.nc93iu9jr1' },
    timestamp: 2021-09-07T23:01:06.547Z
  },
  {
    type: 'message',
    id: '5JgOxxxxxxxxxxxxv6sw-g|0000001',
    timestamp: 2021-09-07T23:01:08.704Z,
    localTimestamp: 2021-09-07T23:01:08.527Z,
    localTimezone: 'America/Los_Angeles',
    serviceUrl: 'https://directline.botframework.com/',
    channelId: 'directline',
    from: { id: 'dl_16310556645490.nc93iu9jr1', name: '' },
    conversation: { id: '5JgOxxxxxxxxxxxxv6sw-g' },
    recipient: { id: 'somebot@QaeuoeEamLg', name: 'Some Bot' },
    textFormat: 'plain',
    locale: 'en-US',
    text: 'Hi',
    entities: [ [Object] ],
    channelData: {
      clientActivityID: '1631055668527tzwhm47a4qd',
      clientTimestamp: '2021-09-07T23:01:08.527Z'
    },
    rawTimestamp: '2021-09-07T23:01:08.704318Z',
    rawLocalTimestamp: '2021-09-07T16:01:08.527-07:00',
    callerId: 'urn:botframework:azure'
  },
  {
    type: 'message',
    text: 'Echo: Hi',
    inputHint: 'acceptingInput',
    speak: 'Echo: Hi',
    channelId: 'directline',
    locale: 'en-US',
    serviceUrl: 'https://directline.botframework.com/',
    conversation: { id: '5JgOxxxxxxxxxxxxv6sw-g' },
    from: { id: 'somebot@QaeuoeEamLg', name: 'Some Bot' },
    recipient: { id: 'dl_16310556645490.nc93iu9jr1', name: '' },
    replyToId: '5JgOxxxxxxxxxxxxv6sw-g|0000001',
    timestamp: 2021-09-07T23:01:09.147Z
  }
]

仅记录activities显示从机器人或用户通过的最后一项。

[
  {
    type: 'message',
    text: 'Echo: Hi',
    inputHint: 'acceptingInput',
    speak: 'Echo: Hi',
    channelId: 'directline',
    locale: 'en-US',
    serviceUrl: 'https://directline.botframework.com/',
    conversation: { id: 'AURKxxxxxxxxxJHpO-f' },
    from: { id: 'somebot@QaeuoeEamLg', name: 'Some Bot' },
    recipient: { id: 'dl_16310605730140.3nrm4evq6um', name: '' },
    replyToId: 'AURKxxxxxxxxxJHpO-f|0000001'
  }
]

推荐阅读