2016-10-20 4 views
0

В настоящее время я разрабатываю свой собственный слабый бот с помощью NodeJS.Slack-API NodeJS bot response_url не работает

На данный момент не сложный бот, вы просто вводите команду, и у вас есть ответ. Это прекрасно работает.

Теперь я хочу отправить ответ позже, потому что моя программа вызывает внешний API. Как я прочитал здесь в slack-API documentation в конце с заголовком «запаздывающих ответов и множественные ответы» мне нужно сделать пост запрос на URL я получил по имени «response_url»

Вот что я посылаю в мой пост resquest:

{ 
    "response_type": "in_channel", 
    "text": "My delayed text" 
} 

Но когда я делаю запрос пост с этим контентом на URL, ничего Append ...

Вот интересная часть моего кода:

// modules 
var http = require('http'); 
var https = require('http'); 
var url = require('url'); 

// Listen slack post request on/
app.post("/", function(req, res) { 
    var token = req.body.token; 
    var team_id = req.body.team_id; 
    var team_domain = req.body.team_domain; 
    var channel_id = req.body.channel_id; 
    var channel_name = req.body.channel_name; 
    var user_id = req.body.user_id; 
    var user_name = req.body.user_name; 
    var command = req.body.command; 
    var text = req.body.text; 
    var response_url = req.body.response_url; 

    if (isTokenValid(token)) { 
     var subcommands = text.trim().split(/\s+/); 

      // Check if sub-command is provided                                      
      if (subcommands.length == 0 || text == '') { 
       res.status(200).send('Usage: ' + USAGE); 
      }else { // check sub-command                                       
       switch(subcommands[0]) { 
        case 'test': 
        res.status(200).send(sendTest(response_url)); 
        default: 
        res.end('Command "' + subcommands[0] + '" does not exists.\nUsage: ' + USAGE); 
       } 
      } 
     // Bad token                                            
    }else { 
     console.log('Bad token: ' + token); 
     res.setHeader('Content-Type', 'text/plain'); 
     res.status(403).send('Bad token. This is a personal slack plugin owned by Ninjava team'); 
    } 
}); 

function sendTest(response_url) { 
    var options = { 
     host: 'my_api.com', 
     port: '80', 
     path: '/v2/content', 
     method: 'GET' 
    }; 

    getReq(options, function(output) { 
     var obj = JSON.parse(output); 

     var myresult = obj.result; 

     var host = url.parse(response_url).hostname; 
     var path = url.parse(response_url).pathname; 
     var data = { 
      "response_type": "in_channel", 
      "text" : "This is the delayed message !" 
     }; 

     postReq(host, path, data, true, function(output) { 
      console.log(output); 
     }); 
    }); 
    return "This is a direct message. Waiting for the delayed message..."; 
} 

function getReq(options, callback) { 
    //making the http get call                                         
    var getReq = http.request(options, function(res) { 
     var output = ''; 
     res.on('data', function(chunk) { 
      output += chunk; 
     }); 
     res.on('end', function() { 
      process.stdout.write('\r'); 
      callback(output); 
     }); 
    }); 

    //end the request                                           
    getReq.end(); 
    getReq.on('error', function(err){ 
     console.log("Error: ", err); 
    }); 
} 

function postReq(host, path, data, ssl, callback) { 
    var post_data = JSON.stringify(data); 
    var post_options = { 
     host: host, 
     port: '80', 
     path: path, 
     method: 'POST', 
     headers: { 
      'Content-Type' : 'application/json', 
      'Content-Length': Buffer.byteLength(post_data) 
     } 
    }; 

    var protocol = ssl ? https : http; 
    var post_req = protocol.request(post_options, function(res, b, c)  { 
     var output = ''; 
     res.setEncoding('utf8'); 
     res.on('data', function(chunk) { 
      output += chunk; 
     }); 
     res.on('end', function() { 
      callback(output); 
     }); 
    }); 

    post_req.on('error', function(err){ 
     console.log("Error: ", err); 
    }); 

    // post the data                                           
    post_req.write(post_data); 
    post_req.end(); 
} 

Я сделал много испытаний.

  1. Я использовал https://requestb.in/q9zahiq9?inspect, чтобы проверить то, что мой бот вернуться с методом поста (замены слабины response_url моего requestb.in URL). Кажется, все нормально

  2. Я использовал PostMan, чтобы проверить, был ли мой запрос на почту распознан slack-API, просто выполнив почтовый запрос в response_url с объектом json, который я предоставил в начале моего сообщения, и я успех получил сообщение на моем слабом канале.

Я не знаю, почему слабину не признают мою просьбу и как его отладить ...

Заранее спасибо

Edit: Я решил это, смотрите мой ответить ниже

+0

Никто не есть идея? может быть, есть особая вещь, связанная с slack api при использовании запроса на сообщение? – ReaperSoon

ответ

0

Если кто-то заинтересован, я исправил свою проблему!

Я только изменил мой метод запроса:

function sendDataToSlack(response_url, data, callback) { 
    request({ 
     url: response_url, 
     method: "POST", 
     json: true, 
     headers: { 
      "content-type": "application/json", 
     }, 
     body: JSON.stringify(data) 

     }, function (error, response, body) { 
     if (!error && response.statusCode === 200) { 
      callback(body); 
     } 
     else { 
      console.log("error: " + error) 
      console.log("response.statusCode: " + response.statusCode) 
      console.log("response.statusText: " + response.statusText) 
     } 
    }); 
} 

И это прекрасно работает

0

Я рекомендую вам взглянуть на код nodejslack, который я создал некоторые аналогичные проблемы с запросами GET, поэтому я использовал POST-запросы в некоторых запросах, которые должны быть GET. Звучит как ошибка на slack api, но я заметил, что это происходит, когда мы отправляем запрос GET с телами JSON, если вы запрашиваете GET без каких-либо данных (например, GET список всех Emojis), у вас не будет этой проблемы ,

+0

Спасибо за ваш ответ, я исправил его несколько недель назад. Я отправляю ответ для тех, кто был заинтересован. – ReaperSoon