2
@kakakaori830

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

この記事は最終更新日から3年以上が経過しています。

はじめに

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

入った!

2
ユーザー登録して、Qiitaをもっと便利に使ってみませんか。
  1. あなたにマッチした記事をお届けします
    ユーザーやタグをフォローすることで、あなたが興味を持つ技術分野の情報をまとめてキャッチアップできます
  2. 便利な情報をあとで効率的に読み返せます
    気に入った記事を「ストック」することで、あとからすぐに検索できます
kakakaori830
brides-a-tm
『一組でも多くのカップルに “理想の結婚式”のきっかけを』の使命の元、花嫁の理想(ユメ)を叶えるサービス「ハナユメ」「HIMARI」「ハナユメウエディングデスク」を運営しています。

コメント

この記事にコメントはありません。
あなたもコメントしてみませんか :)
ユーザー登録
すでにアカウントを持っている方はログイン
記事投稿イベント開催中
Java開発者のためのAzure入門
~
新人プログラマ応援 - みんなで新人を育てよう!
~