LINEで送った画像をS3に保存したい。
動機
・AWS rekognitionでいろいろ遊べたら良いなあ
・そのためにはまず画像を用意せねばなあ
・一番使いやすいプラットフォーム(⊃LINE)でできたら良いなあ
LINE公式アカウントとAWSの連携
LINE公式アカウントの登録、およびLINEとAWSとの紐付けに関しては以下の記事を参考にさせていただきました。
API GatewayとLambda(Python)でLINE BOT(Messaging API)開発 [前編]
S3に画像を保存するLambda
実際に、S3に画像を保存するためのコード(python)をAWS Lambdaに書いていきます。
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をスラッシュで区切ると、階層構造で保存できます。
obj = s3.Object(BUCKET_NAME,'foo/bar/hoge.jpg')
今後は、S3に保存された画像を別の場所で読み出したり(JSなどWeb系で使うとか)、
送られてきた画像をAWS rekognitionに食わせたりしてみようと思います!