Получение текстового ответа бота Wit.ai с использованием HTTP API через междоменный доступ

В настоящее время я работаю с Wit.ai над веб-страницей в CodePen.io. Мне было интересно, можно ли получить текстовый ответ бота Wit.ai («Бот говорит») с помощью HTTP API.

Например: если пользователь должен был запросить бота с помощью:

Как это работает?

Я хотел бы после вызова API с этим сообщением получить типичный ответ бота:

Я в порядке, спасибо, человек.

Я просмотрел документацию по HTTP API. Похоже, это делается с помощью «POST» для api.wit.ai/converse. Ответ JSON содержит поле «msg», что мне и нужно! Вот код, который я сейчас использую:

$.ajax({
    url: baseUrl + "converse",
    data: {
      'q': text, // The message to send the bot
      'session_id': "123abc",
      'access_token' : accessToken // Authorisation key for using our bot
    },
    dataType: 'json',
    crossDomain: true,
    method: 'POST',

    success: function(data) {
      prepareResponse(data);
    },
    error: function() {
      respond(messageInternalError);
    }
});

Однако Wit.Ai на данный момент не поддерживает CORS, единственный способ делать междоменные запросы — это использовать JSONP, который работает только для GET-запросов. Как и следовало ожидать, приведенный выше код приводит к ошибке HTTP 400.

Кто-нибудь может подтвердить, можно ли использовать HTTP API для получения текстового ответа бота на сообщение пользователя? Есть ли обходной путь к тому, что я сейчас делаю?


person Allan of Sydney    schedule 03.11.2016    source источник


Ответы (2)


Недавно у меня была такая же проблема. Чтобы успешно получить беседу, мне пришлось сначала создать локальный сервер, который будет обрабатывать все запросы пользователей и отправлять их на сервер Wit.

Использовал node.js, express, nodemon и sync-request.

Вот файл server.js:

var express = require('express')
var request = require('sync-request');

var port = 8001;
var app = express()

app.get('/converse', function (req, res) {
  res.header("Access-Control-Allow-Origin", "*");
  res.header("Access-Control-Allow-Headers", "X-Requested-With");
  var message = req.query.q;
  var sessionID = req.query.session_id;
  var response = request('POST', 'https://api.wit.ai/converse?q=' + message + '&session_id=' + sessionID, {
    'headers': {
      'Content-Type': 'application/json; charset=utf8',
      "Accept": "application/json",
      "Authorization": "Bearer $place-app-token"
    }
  });
  res.send(JSON.parse(response.getBody('utf8')));
})
app.listen(port);

Сервер отправит POST запрос с headers необходимой конфигурацией Wit.

Пользователь отправит запрос GET на локальный сервер. Используется jQuery, как предлагается в документации: https://wit.ai/docs/http/20160526#cross-domain-link

Вот внешний запрос:

$.ajax({
  url: 'http://127.0.0.1:8001/converse',
  data: {
    'q': text,
    'session_id': sessionID
  },
  method: 'GET',
  crossDomain: true,
  success: function(response) {
    console.log(response, response.msg);
  }
});
person Pedro Ivo Hudson    schedule 21.01.2017

Та же проблема, я нашел обходной путь, потому что я вызывал его из своего приложения nodejs. вместо этого запустил curl, вот код.

var sys = require('util')

var exec = require('child_process').exec;
var child;
child = exec("curl -XPOST 'https://api.wit.ai/converse?v=20160330&session_id=123abc&q=screw%20http%20api%20calls' \\ -H \"Content-Type: application/json\" \\ -H \"Accept: application/json\" \\  -H 'Authorization: Bearer $token'", function (error, stdout, stderr) {
    res.send(stdout)
    //sys.print('stderr: ' + stderr);
    if (error !== null) {
        console.log('exec error: ' + error);
    }
});

});

person user3042287    schedule 06.11.2016