1
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

LINEのMessagingAPI使って受信したメッセージをS3に保存する

Last updated at Posted at 2017-11-11

はじめに

LINE@で提供されているMessageingAPIを使ってLINEbotを作り、発話内容をDBに入れておきたいと思ったので、送られてきたメッセージをAPIGatewayで受けてS3に突っ込んでみました。(そこから先のDBへのインサートは割愛)

準備

  • AWSにアカウントが存在する
  • LINE@のMessagingAPIを有効にしたアカウントが存在する
  • LINE@でMessagingAPIを有効にすると下記のような制約があるので注意
    68747470733a2f2f71696974612d696d6167652d73746f72652e73332e616d617a6f6e6177732e636f6d2f302f3134353031332f65306337393037382d626666302d646538302d333133392d6361626131346263663063612e706e67.png

S3でメッセージを入れておくバケットを作成

スクリーンショット 2017-11-11 12.57.59.png
わかりやすいバケット名を入れて作成。
必要に応じて各種設定は変更すればOKだけど基本的にデフォルトでいいと思います。

受け取ったメッセージをS3に保存するためのlambda関数を作る

スクリーンショット 2017-11-11 13.03.02.png
ロールはlambdaとS3へのアクセスができるものを新規で作成するか既存の中から選択して付与します。
今回はNode.js 6.10で作りました。

'use strict';
var AWS = require('aws-sdk');
AWS.config.region = {S3のバケットのregion};
var bucketName = {S3のバケット名};

var s3 = new AWS.S3({apiVersion: '2006-03-01'});

exports.handler = function(event, context, callback) {

  if (event.headers) {

    // line からのリクエストか判定
    const crypto = require('crypto');
    const channelSecret = {LINEの管理画面上から取得するチャンネルシークレット};
    const body = event.body;
    const signature = crypto.createHmac('SHA256', channelSecret).update(body).digest('base64');
    
    if (signature == event.headers['X-Line-Signature']) {
      var date = new Date();
      var fileName = date.getTime() + '-' + signature.replace( /\//g , "" ) + '.txt';
      var params = {
        Bucket: bucketName,
        Key: fileName,
        Body: event.body
      };

      // 内容をS3に保存
      s3.upload(params, function(err, data) {
        if (err) {
          console.log("Error uploading data: ", err);
        } else {
          console.log("Successfully uploaded data to " + bucketName + "/" + fileName);
        }
    
        callback(null, response_success);  // SUCCESS with message
        context.done(null, 'Finished UploadObjectOnS3');

      });
    }
  }
};

const response_success = {
  'isBase64Encoded': false,
  'statusCode': 200,
  'headers': {
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    message: 'ok'
  }),
};

エンドポイントとなるAPIGatewayを作成

スクリーンショット 2017-11-11 13.14.11.png
アクション→メソッドの作成でPOSTメソッドを作成します。
※私はここをGETで作ってしまっていてLINEの管理画面からWebhookAPIの登録をし、疎通テストを行うとテストが通らずハマりました…

スクリーンショット 2017-11-11 13.17.37.png

そしてメソッドのセットアップを行います。
Lamdaリージョンと関数名は先ほど作ったものを入れます。
セットアップが完了したら、アクションからこのAPIのデプロイを行います。

スクリーンショット 2017-11-11 13.21.42.png

デプロイができるとURLが発行されるのでそのURLをLINE@の管理画面からWebhookURLとして登録します。

動かしてみた

LINE上で話しかけると

スクリーンショット 2017-11-11 13.39.48.png

入った!

1
3
0

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
1
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?