9
7

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 3 years have passed since last update.

LINEで送った画像をS3に保存する(LINE Messaging API x AWS )

Last updated at Posted at 2021-11-18

LINEで送った画像をS3に保存したい。

動機

・AWS rekognitionでいろいろ遊べたら良いなあ
・そのためにはまず画像を用意せねばなあ
・一番使いやすいプラットフォーム(⊃LINE)でできたら良いなあ

LINE公式アカウントとAWSの連携

LINE公式アカウントの登録、およびLINEとAWSとの紐付けに関しては以下の記事を参考にさせていただきました。
API GatewayとLambda(Python)でLINE BOT(Messaging API)開発 [前編]

構成は下記の通りです。
line_to_s3.png

S3に画像を保存するLambda

実際に、S3に画像を保存するためのコード(python)をAWS Lambdaに書いていきます。

lambda_function.py
import requests
import os
import json
import boto3
from io import BytesIO

#-- Lambdaの環境変数でLINE_CHANNEL_ACCESS_TOKENを登録しておく
LINE_CHANNEL_ACCESS_TOKEN = os.environ["LINE_CHANNEL_ACCESS_TOKEN"]

#-- Headerの生成
HEADER = {
    'Content-type':
    'application/json',
    'Authorization':
    'Bearer ' + LINE_CHANNEL_ACCESS_TOKEN,
}
BUCKET_NAME='xxxxxxxx'

s3 = boto3.resource('s3')
def lambda_handler(event, context):
    body = json.loads(event['body'])
    for event in body['events']:
        #-- LINEからimage(画像)が届いた時
        if event['message']['type'] == 'image':
            #-- 1. 画像を読み出し
            MessageId = event['message']['id']  # メッセージID
            ImageFile = requests.get('https://api-data.line.me/v2/bot/message/'+ MessageId +'/content',headers=HEADER) #Imagecontent取得
            Image_bin = BytesIO(ImageFile.content)
            Image = Image_bin.getvalue()  # 画像取得

            #--2. xxxx.jpgに保存
            filename='xxxx.jpg'
            obj = s3.Object(BUCKET_NAME,filename)
            obj.put( Body=Image )
            print('file %s saved at %s!' %(filename,BUCKET_NAME))
            msg='画像が保存されました!'
        else:
            msg='画像が送信されていません!'

        #-- LINEに返す情報
        REQUEST_MESSAGE = [
        {
        'type': 'text',
        'text': msg,
        }
        ]
        payload = {'replyToken': event['replyToken'], 'messages': REQUEST_MESSAGE}
        
        #-- HEADERとmessages(payload)を付加してpost
        if len(payload['messages']) > 0:
                response = requests.post(
                'https://api.line.me/v2/bot/message/reply',
                headers=HEADER,
                data=json.dumps(payload)
                )
    return 0

上記のコードにより、「LINEで送った画像がS3バケット(BUCKET_NAME)に保存される」ことを確認できました。
LINEから画像が送信されれば、LINEに「画像が保存されました!」と返ってきます。
画像以外が送信されていた場合、「画像が送信されていません!」と返ってきます。
このあたりは変数msgに格納しています。

補足

ちなみに、S3に保存するとき、下記のようにkeyをスラッシュで区切ると、階層構造で保存できます。

lambda_function.py
obj = s3.Object(BUCKET_NAME,'foo/bar/hoge.jpg')

今後は、S3に保存された画像を別の場所で読み出したり(JSなどWeb系で使うとか)、
送られてきた画像をAWS rekognitionに食わせたりしてみようと思います!

9
7
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
9
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?