質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
LINE Messaging API

LINE Messaging APIは、メッセージの送信・返信ができるAPIです。Web APIを経由しアプリケーションサーバとLINEのAPIでやり取りが可能。複数のメッセージタイプや分かりやすいAPIリファレンスを持ち、グループチャットにも対応しています。

AWS Lambda

AWS Lambdaは、クラウド上でアプリを実行できるコンピューティングサービス。サーバーのプロビジョニングや管理を要せず複数のイベントに対してコードを実行します。カスタムロジック用いた他AWSサービスの拡張やAWSの規模やパフォーマンスを用いたバックエンドサービスを作成できます。

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

Q&A

解決済

1回答

1003閲覧

LINEbotに送った画像と動画を自動でAWSのS3に保存したい

rirako

総合スコア13

LINE Messaging API

LINE Messaging APIは、メッセージの送信・返信ができるAPIです。Web APIを経由しアプリケーションサーバとLINEのAPIでやり取りが可能。複数のメッセージタイプや分かりやすいAPIリファレンスを持ち、グループチャットにも対応しています。

AWS Lambda

AWS Lambdaは、クラウド上でアプリを実行できるコンピューティングサービス。サーバーのプロビジョニングや管理を要せず複数のイベントに対してコードを実行します。カスタムロジック用いた他AWSサービスの拡張やAWSの規模やパフォーマンスを用いたバックエンドサービスを作成できます。

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

0グッド

0クリップ

投稿2020/08/10 11:39

前提・実現したいこと

LINEbotに送った画像と動画を自動でAWSのS3に保存したいです。
LINE→API GATEWAY→lambda→S3で実現できると理解しています。

発生している問題・エラーメッセージ

LINEからのメッセージをトリガーにlambda関数が動くところまではhello worldで確認できたのですが、
いざ画像を取得してみようとするとうまくいきません。
まずは下記記事の内容を動かしてみたいです。
https://qiita.com/vedokoy/items/165eaa90015e0181475a

特に疑問なのが、lambda関数をnode.jsで使うのならば
exports.handler = (event, context, callback) =>
が真っ先に来るかと思っていたのですが、
記事中ソースコードでは一切触れられていないため
そういうやり方もあるのか?と混乱しています。

該当のソースコード

node.js var https = require('https'); // 引数のmessage_idは // event_data.events[0].message.typeが"image"だった場合に // event_data.events[0].message.idで取得したもの var get_image = function(message_id,callback){ // Request Headers var send_options = { host: 'api.line.me', path: '/v2/bot/message/'+message_id+'/content', headers: { "Content-type": "application/json; charset=UTF-8", "Authorization": " Bearer " + "{ MY_TOKEN }" // ←ここに自分のトークンを入れる(LINE Developersで発行したやつ) }, method:'GET' }; // APIリクエスト var req = https.request(send_options, function(res){ var data = []; res.on('data', function(chunk){ //image data dividing it in to multiple request data.push(new Buffer(chunk)); }).on('error', function(err){ console.log(err); }).on('end', function(){ // ここに画像取得後の処理を書く // この場合は、引数で受け取った画像取得後の処理用callbackを実行 // dataに画像のバイナリデータが入ってる save_image(data); }); }); req.end(); }; var AWS = require('aws-sdk'); AWS.config.region = 'ap-northeast-1'; var s3 = new AWS.S3({ apiVersion: '2006-03-01' }); // dataは画像のバイナリデータ // ②の関数のcallbackがこれになるイメージ var save_image = function(data){ var params = { Bucket: 'my_bucket', // ←バケット名 Key: 'test.png', // ←バケットに保存するファイル名 Body: Buffer.concat(data) }; s3.putObject(params, function(err, data) { // 画像保存後の処理 }); };

試したこと

実際に動作した際は矢印でコメントされている部分は正しい値を入力しました。

補足情報(FW/ツールのバージョンなど)

VBAしかいじったことがないため、半端な知識で申し訳ないのですがご教授よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

特に疑問なのが、lambda関数をnode.jsで使うのならば

exports.handler = (event, context, callback) =>
が真っ先に来るかと思っていたのですが、
記事中ソースコードでは一切触れられていないため
そういうやり方もあるのか?と混乱しています。

この記事では単にexports.handler = (event, context, callback) =>...の部分を省略しているだけだと思います。記事の「①LINE Botを使えるようにする」で参照しているhttp://www.kazuweb.asia/aws/lambda/chatbot の記事にその辺りのコードがあるので割愛したのでしょう。

動作確認はしていないのですが、下記のコードを一番最後に追加すると動作するようになると思います。

exports.handler = function(event, context) { var event_data = JSON.parse(event.body); event_data.events.forEach(function(event) { if(event.message.type === 'image') { get_image(event.message.id, save_image) } }) }

投稿2020/08/11 02:05

Arahabica

総合スコア209

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

rirako

2020/08/11 06:14

ご回答ありがとうございます。 いただいたコードを追加してみたところエラーがでました。 調べてみるとundefinedのものをJSON.parseすると発生するエラーのようです。 解決策などわかりましたらお教えいただきたいです。 { "errorType": "SyntaxError", "errorMessage": "Unexpected token u in JSON at position 0", "stack": [ "SyntaxError: Unexpected token u in JSON at position 0", " at JSON.parse (<anonymous>)", " at Runtime.exports.handler (/var/task/index.js:53:27)", " at Runtime.handleOnce (/var/runtime/Runtime.js:66:25)" ] }
Arahabica

2020/08/11 11:41 編集

おかしいですね。。 ``` var event_data = JSON.parse(event.body); ``` でエラーが出てるっぽいですね。 ``` exports.handler = function(event, context) { console.log(event); var event_data = JSON.parse(event.body); ``` このように、eventを出力するようにするとどうなるか確認してもらえますか?
rirako

2020/08/12 10:19

遅くなり申し訳ありません。 ログが下記のようにでました。 events: [ { type: 'message', replyToken: '204c365f91d94aa88ef35015ccc8ebd', source: [Object], timestamp: 1597199223174, mode: 'active', message: [Object] } ], destination: 'U6742e5f7f70f2611183b108c7b0e57ed' } { "errorType": "SyntaxError", "errorMessage": "Unexpected token u in JSON at position 0", "stack": [ "SyntaxError: Unexpected token u in JSON at position 0", " at JSON.parse (<anonymous>)", " at Runtime.exports.handler (/var/task/index.js:3:23)", " at Runtime.handleOnce (/var/runtime/Runtime.js:66:25)" ] }
Arahabica

2020/08/12 11:35

失礼しました。ちょっと古い書き方をしてしまったようです。 JSONはパース済みでlamdaに来てるみたいですね。 exports.handler = function(event, context) { event.events.forEach(function(eve) { if(eve.message.type === 'image') { get_image(eve.message.id, save_image) } }) } で動作するはずです。
rirako

2020/08/12 12:38

おかげさまでS3に画像保存できました! 何度もありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問