#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があるディレクトリに作り実行する。
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を貼り付けてください。
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でも解説しているのでそちらも良かったらご覧ください。質問等がございましたらその動画のコメント欄もしくは、この記事のコメント欄でどうぞ。また、いいなと思ったらチャンネル登録お願いします。