AWS LambdaでSlackのchannels.historyを取得してみる(テスト用)では、Lambdaの環境変数にSlackのAPI Tokenを入れました。
今回はGASからSlackのAPI Tokenを渡して
API GatewayのSecurityを「Open with API key」にして
そのAPI KeyもGASから渡すコードに書き換えてみます。
以下の方法の合わせ技です
API GatewayとLambdaを作る方法
API GatewayのSecurityを「Open with API key」にする方法
API GatewayにGASからPayloadでデータを渡す方法
Google Apps Script側のコード
このコードの要約
API Gateway の endpoint の API Key を options の headers に入れて
payload の中に host と path を入れて
path のパラメータに channel_id, latest, inclusive, count, slack_token を入れて
UrlFetchApp.fetch(url, options) で endpoint の url に options を渡す。
コード.gs
var url = 'https://API_ID.execute-api.us-east-1.amazonaws.com/default/FUNCTION_NAME';//API Gatewayのendpoint
var channel_id = 'ID';//SlackのChannel ID
var oldest = getUnixTime("2019/02/14 13:26:12");//この日時から
var latest = getUnixTime("2019/02/23 22:17:12");//この日時まで
var inclusive = true;//それらの日時を含める(true)か否(false)か
var count = 2;//取得する件数
function run() {
var payload = getPayload();
var options = getOptions(payload);
var response = UrlFetchApp.fetch(url, options);
var jobj = JSON.parse(response);
Logger.log(jobj);
}
function getPayload() {
var payload = {
'data':{
'host': 'slack.com',
'path': '/api/channels.history' + getParams()
}
}
var json = JSON.stringify(payload);
return json;
}
function getParams() {
var params = '?channel=' + channel_id +
'&latest=' + latest +
'&inclusive=' + inclusive +
'&count=' + count +
'&token=' + getProp('slack_token');
return params;
}
function getOptions(payload) {
var options = {
'method': 'post',
'contentType': 'application/json',
'headers': get_headers(),
'payload': payload
}
return options;
}
function get_headers() {
var headers = {
"x-api-key": getProp('apigateway_key')
}
return headers;
}
function getProp(key) {
return PropertiesService.getScriptProperties().getProperty(key);
}
function getUnixTime(dateTime) {
var date = new Date(dateTime);
var milsec = date.getTime();
var sec = milsec / 1000;
var time = sec.toString();
return time;
}
|
Lambda側のコード
このコードの要約
host と path を event['body'] から受け取ってそのAPIをたたいた結果を返す。
Lambda Function側には何一つ固有の情報を持たせていないため、Slack用ですらない空っぽのライブラリ的なコード。
index.jsvar https = require('https');
var host;
var path;
exports.handler = async function(event) {
var body = event['body'];
var jobj = JSON.parse(body);
var data = jobj['data'];
host = data['host'];
path = data['path'];
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': host,
'path': path
};
return options;
}
//JSONを返す
function returnJson(results) {
const response = {
body: results,
};
console.log(JSON.parse(results));
return response;
}
|