2016-04-17 4 views
0

私はスラックコマンドを使って、他の人の代わりに投稿することができます。これはAWS Lambdaに存在するノード関数です。私はスラックに入る/mybot danturcotte^ helloを入力してSlack bot - ボットが入ってくるウェブフックに返信するのを防ぎます

enter image description here

迷惑な事は、私が投稿するたびに、私のSlackbotでは、 "ダンテ" は、返信。

I postToSlack

、私はたるみの投稿をフォローアップしません、私のボットを確保するために、これらの二つのオプションを試してみました:

1) context.succeed(); 

2) callback(error, null); 

どちらの方法がまだダンテはnullで応答しています。どのように私は単に着信webhookと他の何も(単に、ハローと言ってダントコット)を投稿することはできますか?

AWSラムダNodeJSコードスニペット:

var AWS = require('aws-sdk'); 
var qs = require('querystring'); 
var request = require('request'); 

exports.handler = function (event, context, callback) { 

    var params = qs.parse(event.postBody); 

    var botPayload = {}; 
    botPayload.channel = params.channel_name; 

    if (typeof params.text !== 'undefined') { 

     botPayload.userToGet = params.text.split('^')[0]; 

     getUserData(botPayload, function (error, status, body) { 

      var userDataArray = JSON.parse(body), 
       profileFound = false; 

      for (var i = 0; i < userDataArray.members.length; i++) { 
       if (!profileFound) { 
        if (userDataArray.members[i].name === botPayload.userToGet) { 
         //set bot to user 
        } 
       } 
      } 

      postToSlack(botPayload, function (error, status, body) { 
       //context.succeed(); 
       callback(error, null); 
      }); 
     }); 
    } 
}; 


function getUserData (payload, callback) { 
    request({ 
     uri: 'https://slack.com/api/users.list?token=mytoken', 
     method: 'GET' 
    }, function (error, response, body) { 
     callback(error, response.statusCode, body); 
    }); 
}; 

function postToSlack (payload, callback) { 

    var incoming_webhook = 'https://hooks.slack.com/services/T02LHM7GA/B11BS608F'; 

    request({ 
     headers: { 
      'content-type': 'application/json' 
     }, 
     uri: incoming_webhook, 
     body: JSON.stringify(payload), 
     method: 'POST' 
    }, function (error, response, body) { 
     if (error) { 
      return callback(error); 
     } 
     callback(null, response.statusCode, body); 
    }); 
}; 

答えて

2

私はこれがちょうどラムダとスラックでは可能ではないと思います。 Slack slash command documentationは言う:

あなたのコマンドは、(個人 または公にどちらか)何もポストバック空のHTTP 200応答で応答する必要がない場合。

あなたの目標は、あなたのラムダ関数に本体がないHTTP応答が返されるようにすることです。残念ながら、the AWS Lambda documentation for Node.jsによると、すべてのHTTPレスポンスがJSONであるようです:

結果はJSON.stringify互換でなければなりません。エラーが発生した場合、このパラメータは無視されます。

コードでコールバックを使用しない場合、AWS Lambdaは暗黙的にコールバックし、戻り値はnullです。

だから、あなたが何で、あなたの関数は、JSONのいくつかの並べ替えに対応しようとしていない、とあなたが表示されていないメッセージが表示されますスラックに送り返すことができます何のJSONはありません。 (nullは空の文字列が""として戻ってくるだろう、nullを表示し、no_textエラーで{"text": ""}結果になります。)

を、私はあなたが空のボディを返すになりAWSラムダの前に座って、いくつかの層が必要になるでしょうと信じて。 AWS API Gatewayはこのレイヤー(mapping templatesを参照)の可能性があるように聞こえますが、最初の経験はありません。

UPDATE

これは確かにAWS APIゲートウェイを介して行うことができますように見えます。私は$input.path('$')にマップされているapplication/jsonの "ボディマッピングテンプレート"を作成することでこれを実現しました。つまり、空の文字列("")をcallbackに渡すと、応答がまったく返されません。 (の場合何らかの方法で応答したい場合は、文字列を返すようにしてください。)

+0

私はこの正確な問題を抱えていますが、AWSコンソールはユーザーフレンドリーではありません。 APIゲートウェイコンソールでボディマッピングテンプレートを作成する方法についてもう少し詳しく説明できますか? –

関連する問題