「ポエム」のタグを付けた投稿を #poem チャンネルに集約するためにAPI Gateway とLambda を使ってみました。
Qiita::Team のWebhook => API Gateway => Lambda => Slack の流れで、Qiita::Team の投稿をSlack に通知する流れです。
細かい設定は公式のドキュメントが丁寧に説明してくれています。また、API Gateway + Lambda の連携は書いてくれている人が多いので説明は割愛。
Lambda の設定
API Gateway で適宜Webhook のPOST データを受け取れる様にすると、 event
変数にJSON データが受け渡されます。
var https = require('https');
exports.handler = function(event, context) {
console.log('event: ' + JSON.stringify(event, null, 4));
var payload = event;
// 不要なアクションはスキップ
// cf. https://qiita.com/api/webhook/docs
var nop = true;
if (payload.action === 'created') {
payload.item.tags.some(function(e, index) {
if (e.name === 'ポエム') {
nop = false;
return true;
}
});
}
if (nop) {
context.succeed('NOP');
return;
}
var options = {
host: 'hooks.slack.com',
port: 443,
path: '/services/xxx/xxxxxx', // NOTE: Slack のIncoming Webhook URL を指定する
method: 'POST',
headers: { 'Content-Type': 'application/json' }
};
// Slack への投稿フォーマット指定
// cf. https://api.slack.com/incoming-webhooks
var response = {
channel: '#poem',
username: 'poemer',
text: 'ポエム入荷しました!',
icon_emoji: ':kissing_cat:',
attachments: [
{
"title": payload.item.title,
"title_link": payload.item.url,
"fields": [
{
"title": "Author",
"value": payload.user.url_name,
"short": true
}
]
}
]
};
// Slack へのPOST
var req = https.request(options, function(res) {
var body = '';
console.log('Status:', res.statusCode);
console.log('Headers:', JSON.stringify(res.headers));
res.setEncoding('utf8');
res.on('data', function(chunk) {
body += chunk;
});
res.on('end', function() {
console.log('Successfully processed HTTPS response');
// If we know it's JSON, parse it
if (res.headers['content-type'] === 'application/json') {
body = JSON.parse(body);
}
context.succeed(body);
});
});
req.on('error', context.fail);
req.write(JSON.stringify(response));
req.end();
};
Qiita::Team のWebhook 通知のToken はチェックしていないので、セキュリティ的な部分が気になる人はチェックするとよいと思います。
Qiita::Team から飛んでくるデータは公式ドキュメントを参照してください。
AWS コンソールでポチポチすれば簡単に作れるのでお試しあれ。