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 Functionのコード
index.jsvar 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)
考えた対策
「Open with API key」にしてhostとpathもpayloadで渡す