LANG SELRCT

コードを書く場所についてはこちら

2019年2月24日日曜日

AWS LambdaでSlackのchannels.historyを取得してみる(テスト用)


Slack APIには指定したChannelのメッセージ履歴を取得するchannels.historyというAPIがあります。
(FYI:https://api.slack.com/methods/channels.history

今回はこれを利用して、Lambda Functionで実行するコードを書いていきます。

※以下のコードはテスト用です。
SlackのAPI TokenをLambdaの環境変数に入れていて、API Gatewayのsecurityを「Open」にしている想定です。endpointを知っているすべての人がメッセージ履歴を取得できるため、privateのSlack channelの履歴を取得する場合は、API Gatewayのsecurityを「Open with API key」にするなど対策が必要です。

考えた対策
LambdaでSlackのchannels.historyを取得してみる(hostとpathもpayloadで渡す)


Lambda Functionのコード

index.js
var https = require('https');

var channel_id = 'CHANNEL_ID';
var oldest = getUnixTime("2019/02/14 13:26:12");//この日時から
var latest = getUnixTime("2019/02/23 22:17:12");//この日時まで
var inclusive = true;//それらの日時を含めるか否か
var count = 2;//取得する件数
var token = process.env.slack_token;//Lambdaの環境変数からslack_tokenを取得する

function getUnixTime(dateTime) {
  var date = new Date(dateTime);
  var milsec = date.getTime();
  var sec = milsec / 1000;
  var time = sec.toString();
  return time;
}

exports.handler = async function(event) {
  var body = event['body'];
  var jobj = JSON.parse(body);
  var results = await getData(); //getData()の処理が終わってから次の処理を実行する
  var json = returnJson(results);
  return json;
};

//Promise
function getData() {
  return new Promise(resolveFunc);
}

//Promise resolved
function resolveFunc(arg) {
  https.get(getOptions(), function(res) {
    var body = '';
    res.setEncoding('utf8');
    res.on('data', function(chunk) {
      body += chunk;
    });
    res.on('end', function(chunk) {
      arg(body);
    });
    res.on('error', function(e) {
      console.log(e.message);
      arg(e.message);
    });
  });
  //ここまでの処理をPromiseでやりたい
}

function getOptions() {
  var options = {
    'method': 'post',
    'host': 'slack.com',
    'path': '/api/channels.history' + getParams()
  };
  return options;
}

function getParams() {
  var params = '?channel=' + channel_id +
              '&latest=' + latest +
              '&inclusive=' + inclusive +
              '&count=' + count +
              '&token=' + token;
  return params;
}

//JSONを返す
function returnJson(results) {
  const response = {
    //body: JSON.stringify(result),
    body: results,
  };
  console.log(JSON.parse(results));
  return response;
}


API Gatewayのendpoitにアクセスして実行結果を見る

FYI:
AWS LambdaとAPI Gatewayを使ってみる
Lambda functionの実行ログを 見たい(CloudWatch)