라즈파이와 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 하지만 해설하고 있으므로 그쪽도 좋으면 봐 주세요. 질문등이 있으면 그 동영상의 코멘트란 혹은, 이 기사의 코멘트란에서 부디. 또, 좋다고 생각하면 구독 부탁합니다.

좋은 웹페이지 즐겨찾기