Lineトークにアップした画像をS3に保存する

先日はRekognitionを利用して飯テロ禁止botを作成しましたが、 今回はLINEにアップした画像をS3に保存するbotを作ってみました。 Lineトークにアップされた画像は2週間でLineサーバから削除されるため、 後でダウンロードしようと思った時に有効期限が切れてしまってもう1度アップし直してもらう… なんてことがありました。 アルバムに置いてれば保存期間は無期限なんですが やはりトーク内に画像貼り付ける方が楽ですからね。 そんなこんなで、S3に置いて永続化できるといいなぁと思った次第です。 アーキテクチャ 基本構成は前回のものと同じですが、RekognitionがS3に置き換わっています。 実際に作ってみた コードはGithubに置いてます。 https://github.com/328/serverless-practice/tree/master/linebot-s3 serverless.yml LambdaにはS3の書き込み権限を付与します。(めんどくさいのでフルアクセスにしてるのは申し訳ない) 環境変数はLine developerからとってくる handler.js 保存するファイル名をどうしようかなぁちょっとばかり悩んでたんですが 「画像をMD5関数に突っ込んでハッシュ値を得る。そのハッシュ値をファイル名として利用する。」 としました。 メリットとして 同じ画像が既に上がっていた場合は上書き保存される。 同じ画像はリストに出てこなくなるので一種の重複排除機能として利用できる。 もちろん問題点はあって 「ハッシュ値は衝突する可能性がある」 ということで この辺りを改善するには ハッシュ値 + タイムスタンプ でファイル名とする 既に同じファイル名のものがS3上にあるか検索し、あればMD5とは別のもので再計算する くらいでしょうか。 実際に大量のファイルを保存する場合にはこの辺りも考慮にいれないといけなかったり。 あとは他のアルゴリズムを使うと計算量が多くなる可能性があったり その分Lambdaの実行時間が長くなってしまう可能性もある(要検証)。 個人で利用する分にはこれくらいのもので良いし、 違う画像でMD5が一致した場合には画像が消えてしまいますが、 その辺は許容します。 という感じでLinebotを作ってみました。 先日のRekognitionと組み合わせれば画像を仕分けしつつ保存できそうですね。 もう少し時間を作って他のLINE APIも触ってみようかなと思います。 »

飯テロ禁止botをLINE + AWS Rekognitionで実装する

先週、JAWS-UG沖縄 画像認識サービスを使ってみようハンズオン / もくもく勉強会 2017年7月に参加してきました。 AWSの画像認識サービス(Rekognition)を使って感情ランキングアプリを作るハンズオンをやっておりました。 JAWS-UG青森で開催されたハンズオンの再演で、感情ランキングアプリを作りました。 Rekognition使って何か作れないかなあと考えてたら そういやパリピ共がよくご飯の時間に美味そうなご飯の写真をうpしてくるので それを撃退できるbotが作れたらいいなと思ってちょっと頑張ってみました。 ちょっとググってみたら似たようなことを既に実施してる人がいたのでこれを元にちょいっと変更したらできそうな感じ Amazon Rekognition × LINE Botを試してみた - Qiita 実際に作ったもの 下記の画像を見てもらえればわかる通りご飯画像を投げるとアラートメッセージが飛んできます。 アーキテクチャ Line DeveloperのサイトにWEBHOOK_URLを登録する項目があるので、そこにAPIGatewayのURLを登録する。 Linebotへの個別, もしくはLinebotが属するグループに対して発言なり画像を送信するとアップロードするとWebhook URLにイベントが通知されてAPIGatewayを経由して、Lambdaが処理を行う。 そのイベントが画像であればLambdaを介してRekognitionで解析をかける。 それがご飯であればアラートを上げるようにします。 Rekognition自体は日本のリージョンで展開されてないサービスですので、バージニア北部等のリージョンで利用します。 APIGateway, Lambdaもそれに合わせて今回はバージニア北部のリージョンで利用します。 Rekognition Rekognitionに画像を投げると下記のような感じでラベル付けをしてくれます。 { "Labels": [ { "Name": "Bowl", "Confidence": 97.36100769042969 }, { "Name": "Dish", "Confidence": 69.66221618652344 }, { "Name": "Food", "Confidence": 69.66221618652344 } ] } 今回のお題は「ご飯の画像であればアラートを上げる」ですので、 LabelsのNameのValueがFoodでConfidenceのvalueがある一定以上であればメッセージを出力できればOKです。 Line -> APIGateway 一部マスク・省略してますが、LINEからAPIGatewayに入ってくるパラメータはこんな感じです. { resource: '/', path: '/', httpMethod: 'POST', headers: { Accept: '*/*', 'Content-Type': 'application/json;charset=UTF-8', Host: '********. »