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で渡す