Bot Framework v4 Node.js Местоположение - PullRequest
1 голос
/ 29 февраля 2020

Я нахожусь в процессе разработки бот-чата и пытаюсь найти пример кода Node.js и / или документацию о том, как реализовать сервис Azure Maps в составе Bot Framework V4. Есть много примеров того, как это достигается в V3, но, похоже, нет примеров решения V4 для Node.js. Я пытаюсь создать шаг в моем диалоге с бот-строителями, который запустил бы простой диалог определения местоположения «куда мы его отправляем», который бы направлял пользователя через диалоговое окно и сохранял результаты адреса как часть этого профиля пользователя. Буду признателен за любую помощь или совет по этому вопросу.

1 Ответ

0 голосов
/ 29 апреля 2020

Да, это выполнимо. Я создал класс (вероятно, излишний, но да ладно), в котором я делаю свой вызов API с предоставленными параметрами, чтобы получить карту. Я решил использовать Azure Карты (против Bing Maps ) только потому, что мне было интересно, чем они отличаются. Нет никаких причин, по которым вы не могли бы сделать это и с Bing Maps.

В боте я использую диалог компонента из-за того, что у меня есть остальная часть моего бот разработан. Когда диалоговое окно заканчивается, оно падает со стека и возвращается к родительскому диалоговому окну.

В моем сценарии бот предоставляет пользователю пару вариантов выбора. «Отправить мне карту» создает карту и отправляет ее в действии клиенту / пользователю. Все остальное отправляет пользователя дальше, заканчивая диалоговое окно.

Вам нужно будет решить, как вы получаете местоположение пользователя. Я разработал это с учетом Web Chat , поэтому я получаю геолокацию из браузера и возвращаю ее боту, который будет использоваться при вызове getMap().

const { ActivityTypes, InputHints } = require('botbuilder');
const fetch = require('node-fetch');

class MapHelper {
  async getMap(context, latitude, longitude) {
    var requestOptions = {
      method: 'GET',
      headers: {
        'Content-Type': 'application/json'
      },
      redirect: 'follow'
    };

    const result = await fetch(`https://atlas.microsoft.com/map/static/png?subscription-key=${ process.env.AZURE_MAPS_KEY }&api-version=1.0&layer=basic&zoom=13&center=${ longitude },${ latitude }&language=en-US&pins=default|al.67|la12 3|lc000000||'You!'${ longitude } ${ latitude }&format=png`, requestOptions)
      .then(response => response.arrayBuffer())
      .then(async result => {
        const bufferedData = Buffer.from(result, 'binary');
        const base64 = bufferedData.toString('base64');
        const reply = { type: ActivityTypes.Message };
        const attachment = {
          contentType: 'image/png',
          contentUrl: `data:image/png;base64,${ base64 }`
        };

        reply.attachments = [attachment];
        await context.sendActivity(reply, null, InputHints.IgnoringInput);
      })
      .catch(error => {
        if (error) throw new Error(error);
      });

    return result;
  };
};

module.exports.MapHelper = MapHelper;
const { ChoicePrompt, ChoiceFactory, ComponentDialog, ListStyle, WaterfallDialog } = require('botbuilder-dialogs');
const { MapHelper } = require('./mapHelper');

const CONFIRM_LOCALE_DIALOG = 'confirmLocaleDialog';
const CHOICE_PROMPT = 'confirmPrompt';

class ConfirmLocaleDialog extends ComponentDialog {
  constructor() {
    super(CONFIRM_LOCALE_DIALOG);

    this.addDialog(new ChoicePrompt(CHOICE_PROMPT))
      .addDialog(new WaterfallDialog(CONFIRM_LOCALE_DIALOG, [
        this.askLocationStep.bind(this),
        this.getMapStep.bind(this)
    ]));

    this.initialDialogId = CONFIRM_LOCALE_DIALOG;
  }

  async askLocationStep(stepContext) {
    const choices = ['Send me a map', "I'll have none of this nonsense!"];
    return await stepContext.prompt(CHOICE_PROMPT, {
      prompt: 'Good sir, may I pinpoint you on a map?',
      choices: ChoiceFactory.toChoices(choices),
      style: ListStyle.suggestedAction
    });
  }

  async getMapStep(stepContext) {
    const { context, context: { activity } } = stepContext;
    const text = activity.text.toLowerCase();
    if (text === 'send me a map') {
      const { latitude, longitude } = activity.channelData;
      const mapHelper = new MapHelper();
      await mapHelper.getMap(context, latitude, longitude);

      const message = 'Thanks for sharing!';
      await stepContext.context.sendActivity(message);
      return await stepContext.endDialog();
    } else {
      await stepContext.context.sendActivity('No map for you!');
      return await stepContext.endDialog();
    }
  }
}

module.exports.ConfirmLocaleDialog = ConfirmLocaleDialog;
module.exports.CONFIRM_LOCALE_DIALOG = CONFIRM_LOCALE_DIALOG;

enter image description here

Надежда на помощь!

...