ラズパイとGmailAPIとLineAPIを使って簡易的なサーバーレス監視カメラを作る方法


0.最初に

今回作るものがどういう感じで動くのか見てみたい方は、こちら(youtubeの動画)でどうぞ。

1.Gmailの設定

まず、google cloud platformのサイトにいき、APIとサービスのライブラリのところを押す。

そして下にスクロールしていき、GmailAPIを見つけてそれを押す。

そして、有効にするを押す。

画面が変わったら、左のメニューのリストになっているやつの概要を押す。

画面が変わったら、右端の認証情報を作成を押す。

そして、画像の通りに入力して下の必要な認証情報を押す。

これも入力し終わったら、OAuthクライアントIDを作成を押す。名前のところは何でも構いません。

まだ、完了は押さずに、

ダウンロードのところを押す。すると、現在のディレクトリにclient_id.jsonというファイルが作成される。

2.必要なライブラリのダウンロード

pip install --upgrade google-api-python-client
pip install requests
pip install httplib2

今回はpython3.6を使っているのでpython3.7などを使っていてうまくいかないという方は、pip3を使ってインストールしてください。

3.LineAPIの設定

Line Developersのサイトにいき、上のメニューのDocumentsのところを押す。

下にスクロールしていき、LineNotifyのところを押す。

ページが変わり、ログインしたらMy pageのところを押す。

そして、Create tokenを押す。そうすると、名前を聞かれますがトークメッセージの先頭につくだけなので何でも構いません。
そしてtokenが表示されるのでそれをコピーする。しかし、一度閉じてしまうともう二度と見れないので注意。

4.Gmailの認証

下のファイルをclient_id.jsonがあるディレクトリに作り実行する。

g_oauth.py
 import httplib2, os 

 from apiclient import discovery 
 from oauth2client import client 
 from oauth2client import tools 
 from oauth2client.file import Storage 


 SCOPES = 'https://www.googleapis.com/auth/gmail.readonly' 

 CLIENT_SECRET_FILE = '/home/igor-bond/Desktop/client_id.json' 

 USER_SECRET_FILE = '/home/igor-bond/Desktop/credentials_gmail.json' 

 def gmail_user_auth(): 
     store = Storage(USER_SECRET_FILE) 
     credentials = store.get() 
     if not credentials or credentials.invalid: 
         flow = client.flow_from_clientsecrets(CLIENT_SECRET_FILE, SCOPES) 
         flow.user_agent = 'Python Gmail API' 
         credentials = tools.run_flow(flow, store, None) 
         print('認証結果を保存しました:' + USER_SECRET_FILE) 
     return credentials 

ここでは、さらにユーザーの秘密を保存するcredentials_gmail.jsonというファイルがまた、同じディレクトリに作成される。

5.メイン処理の作成

このファイルも今まで作ってきたと同じディレクトリに作ります。Your tokenのところはさっきコピーしたLineNotifyのtokenを貼り付けてください。

gpio.py
 import os,httplib2 
 from apiclient import discovery 
 import g_oauth  
 import time 
 from datetime import datetime 
 import picamera 
 import requests 

 token = 'Your Token' 

 def gmail_get_service(): 
     credentials = g_oauth.gmail_user_auth() 
     http = credentials.authorize(httplib2.Http()) 
     service = discovery.build('gmail', 'v1', http=http) 
     return service 

 mail_list = [] 

 def gmail_get_messages(): 
     service = gmail_get_service() 
     messages = service.users().messages() 
     msg_list = messages.list(userId='me', maxResults=1).execute() 
     for msg in msg_list['messages']: 
         topid = msg['id'] 
         msg = messages.get(userId='me', id=topid).execute() 
         if msg['snippet'] == 'Security Check2': 
             if not msg['id'] in mail_list: 
                 mail_list.append(msg['id']) 
                 send_msg() 

  def send_msg(): 
     filename = datetime.now() 
     with picamera.PiCamera() as camera: 
         camera.resolution = (1024,768) 
         camera.capture(str(filename)+'.jpg') 

     url = 'https://notify-api.line.me/api/notify' 
     headers = {'Authorization':'Bearer '+token} 
     data = {"message":"Here is your room."} 
     img = f'/home/pi/Desktop/RaspberryPi_for_convenient_life/Projeect 1/{filename}.jpg' 
     file = {'imageFile': open(img, 'rb')} 
     r = requests.post(url, headers=headers, params=data, files=file,) 


 run = True 
 while run: 
     try: 
         time.sleep(30) 
         gmail_get_messages() 
     except KeyboardInterrupt: 
         run = False 

ここでは30秒ごとにログインしているユーザーのGmailの一番上にあるメールを取り出し、もしその内容が"Security Check2"かつ、同じ内容で処理済みのメールでなければラズパイで写真をとり、LineNotifyにおくる。というものです。まだ、実装していませんが写真を送り終わったらその写真を削除するという処理も必要だとおもいます。写真がたまって動作が重くなってしまうので、、、、、

最後に

この簡易的な監視カメラの作り方はYoutubeでも解説しているのでそちらも良かったらご覧ください。質問等がございましたらその動画のコメント欄もしくは、この記事のコメント欄でどうぞ。また、いいなと思ったらチャンネル登録お願いします。