LoginSignup
23

More than 5 years have passed since last update.

API Gateway + Lambda でQiita::Team のポエムを集約してみました

Last updated at Posted at 2016-02-08

「ポエム」のタグを付けた投稿を #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 コンソールでポチポチすれば簡単に作れるのでお試しあれ。

追記:こんな感じで通知されます

Screen Shot 2016-02-09 at 13.01.23.png

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
23