Как интегрировать результат диалога в linebot (Node.js)? - PullRequest
0 голосов
/ 25 сентября 2019

Я создаю чат-бота (Line), интегрируем диалог Google Dialogflow, используя node.js.

Я могу создать чат-бота линии из пользовательского ввода текста и выводить только некоторый текст.

И я могу создать код из пользовательской команды отправки, отправляемой в Google Dialogflow, и диалогового потока, используя текст технического ответа NLU для пользователя.

Но мне нужно, чтобы пользователь ввел текст, отправленный в диалоговый поток, и ответил текстом (A), затем отправьте текст (A) (после кода добавьте некоторый код кнопки шаблона) в Line bot create покажите пользователю некоторую кнопку шаблона.

Как можно интегрировать код из двух частей, чтобы получить вводимый пользователем текст и через результат диалогового потока, используя результат отправки на сервер линейного бота?

ввод пользователя -> dialogflow -> mycode (добавить строку вызова кнопки шаблона) -> linbot -> кнопку шаблона показа бота пользователю

Спасибо.

// ----------------------------------

Код моего диалогового потока:

var express = require('express');
var bodyParser = require('body-parser'); 
var app = express();
app.use(
    bodyParser.urlencoded({
        extended: true
    })
)

app.use(
    bodyParser.json()
)



app.post("/webhook", function(req,res){
    console.log(JSON.stringify(req.body, null, 2))
    var intent = req.body.queryResult.intent.displayName;
    var entityCity =  req.body.queryResult.parameters["geo-city"];

    if(intent === 'myIntent')
    {
       //  here I need call bot.on method, but I don't known how to do.
       // return res.json({
            fulfillmentText: `I known your mean.`
        });
    }
    else
    {
        return res.json({
            fulfillmentText: `i am not sure your mean`
        });
    }
})

app.listen(process.env.PORT || 5566, function(){
    console.log('server start ...');
})

// ----------------------------------

Код чата My Line:

var linebot = require('linebot');
var express = require('express');
var app = express();

const bot = linebot({
    channelId: 'mychannelId',
    channelSecret: 'mychannelSecret',
    channelAccessToken: 'mychannelAccessToken'
});

bot.on('message',function(event) {
    console.log('bot');
  console.log(event); 
  var msg = event.message.text;
  // here can add some template button code and reply to user.
 });

 const linebotParser = bot.parser();
app.post('/webhook', linebotParser);

var server = app.listen(process.env.PORT || 8080, function() {
  var port = server.address().port;

});

// --------------------

Код чата My Line другая версия:

const line = require('@line/bot-sdk');
const express = require('express');
const lineConfig = {
  channelAccessToken: process.env.HEROKU_LINE_CHANNEL_ACCESS_TOKEN,
  channelSecret: process.env.HEROKU_LINE_CHANNEL_SECRET
};
const client = new line.Client(lineConfig);
const app = express();
app.post('/webhook', line.middleware(lineConfig), function(req, res) {
  Promise
    .all(req.body.events.map(handleEvent))
    .then(function(result) {
      res.json(result);
    });
});
function handleEvent(event) {
  switch (event.type) {
    case 'join':
    case 'follow':
      return client.replyMessage(event.replyToken, {
        type: 'text',
        text: 'hello~'
      });   
    case 'message':
      switch (event.message.type) {
        case 'text':
          return client.replyMessage(event.replyToken, {
            type: 'text',
            text: (event.message.text+'~yu')
          });
      }
  }
}
app.listen(process.env.PORT || 3000, function(){
  console.log("Express server listening on port %d in %s mode", this.address().port, app.settings.env);
});

1 Ответ

0 голосов
/ 27 сентября 2019
const line = require('@line/bot-sdk');
const express = require('express');

const dialogflow = require('dialogflow');
const uuid = require('uuid');
const lineConfig = {
  channelAccessToken: process.env.HEROKU_LINE_CHANNEL_ACCESS_TOKEN,
  channelSecret: process.env.HEROKU_LINE_CHANNEL_SECRET
};
const client = new line.Client(lineConfig);
const app = express();
app.post('/webhook', line.middleware(lineConfig), function(req, res) {
  Promise
    .all(req.body.events.map(handleEvent))
    .then(function(result) {
      res.json(result);
    });
});
async function handleEvent(event) {
  switch (event.type) {
    case 'join':
    case 'follow':
      return client.replyMessage(event.replyToken, {
        type: 'text',
        text: 'hello~'
      });   
    case 'message':
      switch (event.message.type) {
          case 'text':
              const response = await queryDF(event.message.text)
              // you will get response from DF here
          return client.replyMessage(event.replyToken, {
            type: 'text',
            text: (event.message.text+'~yu')
          });
      }
  }
}


async function queryDF(message, projectId = 'your-project-id') {
    // A unique identifier for the given session
    const sessionId = uuid.v4();

    // Create a new session
    const sessionClient = new dialogflow.SessionsClient();
    const sessionPath = sessionClient.sessionPath(projectId, sessionId);

    // The text query request.
    const request = {
        session: sessionPath,
        queryInput: {
            text: {
                // The query to send to the dialogflow agent
                text: message,
                // The language used by the client (en-US)
                languageCode: 'en-US',
            },
        },
    };

    // Send request and log result
    const responses = await sessionClient.detectIntent(request);
    return responses[0].queryResult;

}
app.listen(process.env.PORT || 3000, function(){
  console.log("Express server listening on port %d in %s mode", this.address().port, app.settings.env);
});

Вам нужно, чтобы пользователь диалоговый поток npm обнаружил метод намерения

...