はじめに
以前、畜産農家が深夜に子豚が産まれていないかを見に行く手間の削減として、ラズパイを使って子豚の出産通知を作ったのですが、GoogleDriveとの認証でエラーが出るようになってしまい、調べたのですが解決できず。
また、通知された画像を見る際、GoogoleDriveにアクセスする必要があり、ワンクリック必要なのがちょっと煩わしかったので、その課題解決としてAmazonS3を活用することにしました。
その結果、LINE通知でGoogleDriveのURLを送っていた部分が、画像で送付されるようになったので、LINEの画面だけで完結するようになり、以前のものより使いやすいものになりました。
システムの概要と改善箇所
このシステムの処理の流れは以下のようになっています。
ラズパイで撮影した画像をユーザに見せる方法として、GoogleDriveを使用していたのですが、エラーになってしまったので、通知の方法をAWSを活用するように置き換えました。
- 画像を撮影
- 画像を保存
- 画像分析
- 写真に情報を追記
- 画像をGoogleDriveにアップロード → 画像をAmazonS3にアップロード
- GoogleDriveのURLをLINE通知 → URLを参照して画像そのものをLINE通知
AmazonS3にアップロードする処理
引数で撮影した画像のファイルパスを渡して、S3にファイルをアップロードします。
その後、URLを取得して戻り値で返します。
'XXXXXXXXXX'にはAWSでバケットを作るときに取得したアクセスキーを、
'YYYYYYYYYY'にはAWSでバケットを作るときに取得したシークレットキーを設定します。
import boto3
from botocore.exceptions import NoCredentialsError
def s3_upload(filepath):
# AWSの設定
AWS_ACCESS_KEY = 'XXXXXXXXXX'
AWS_SECRET_KEY = 'YYYYYYYYYY'
REGION_NAME = 'ap-northeast-1'
BUCKET_NAME = 'piglet-bucket'
# boto3のS3クライアントを作成
s3 = boto3.client(
's3',
aws_access_key_id=AWS_ACCESS_KEY,
aws_secret_access_key=AWS_SECRET_KEY,
region_name=REGION_NAME
)
#日時からファイル名を作成
now = datetime.datetime.now()
nowtime = now.strftime('%Y%m%d%H%M')
object_name = nowtime + ".jpg"
s3.upload_file(filepath, BUCKET_NAME, object_name)
url = s3.generate_presigned_url('get_object',
Params={'Bucket': BUCKET_NAME,
'Key': object_name},
ExpiresIn=3600)
return url
URLを取得して画像をLINE通知する処理
取得したURLを使って、linebotAPIで通知します。
"XXXXXXXXXXXXXX"にはLINEBotのアクセストークンを設定します。
def line_notice_image(url):
# アクセストークンの設定
LINE_CHANNEL_ACCESS_TOKEN = "XXXXXXXXXXXXXX"
line_bot_api = LineBotApi(LINE_CHANNEL_ACCESS_TOKEN)
# 画像の送信
messages = ImageSendMessage(
original_content_url=url, # 画像のオリジナルURL
preview_image_url=url # プレビュー画像のURL(同じURLを使うことができます)
)
line_bot_api.broadcast(messages)
おわりに
子豚の出産通知自体が技術を使った解決で、この改善はちいさなものですが、システムを作った後も困りごとは尽きません。課題にぶつかって心が折れそうなとき、少し引いてみると新しいものや便利なものが見つかったりするので、この記事がその一助のなればいいなと思います。
ちなみに、当初AWSを使わなかったのはコストの面も大きかったのですが、実際にこの程度の使用ならつけっぱなしでも大した額にはならなそう(1ドル以下)です。