본문 바로가기
Python

[python] 구글 포토 API 이미지 업로드 자동화 해보기

by 퍼포먼스마케팅코더 2022. 10. 15.
반응형

[python] 구글 포토 API 이미지 업로드 자동화

구글 포토 API 이미지 업로드 자동화

구글 포토 API를 사용하는 방법에 대해 간단히 기록을 남기도록 한다.

youtube에도 잘 설명되어있긴한데... 따라하다보니 잘 안되는 부분들이 있어서 관련 내용을 기록하는 것이 주목적이다.

Google Photo API를 사용하기 위해서는 먼저 관련 API를 Enable해주고, OAuth를 통해 인증을 받아야 합니다.

1. 구글 포토 API 이미지 업로드를 위한 권한 획득

다음 사이트를 참고하여 API Enable 및 OAuth 2.0 Client ID를 생성한다.

1.1 Google Photo API 활성화

  1. API Console으로 이동
  2. menu bar에서 project를 선택
  3. Google API library에서 Google Photos Library API를 찾고, Enable 합니다.

1.2 OAuth 2.0 client ID 생성하기

  1. Google API Console으로 이동
  2. API & Services > Credentials을 선택
    구글 포토 API 이미지 업로드 자동화 해보기
  3. Create Credentials > OAuth client ID를 클릭하여 client ID를 생성한다.
    구글 포토 API 이미지 업로드 자동화 해보기
  4. Application type은 Desktop app을 선택, 이름은 알아서 지정, 생성되면 ClientID와 Client secret가 담긴 json을 다운로드받는다.
  5. OAuth consent screen 사용자 인증 정보 에서 Test users에 계정을 추가한다.
    구글 포토 API 이미지 업로드 자동화 해보기

2. API 사용하기

2.1 파이썬 라이브러리 설치

다음을 참고해서 Google API를 위한 다음 python library를 설치하도록 한다. (https://developers.google.com/sheets/api/quickstart/python)

  • google-api-python-client
  • google-auth-httplib2
  • google-auth-oauthlib
pip install --upgrade google-api-python-client google-auth-httplib2 google-auth-oauthlib

2.2 OAuth 인증

다음 코드를 통해 OAuth 인증을 받는다.

import os

from google.auth.transport.requests import Request
from google.oauth2.credentials import Credentials
from google_auth_oauthlib.flow import Flow, InstalledAppFlow
from googleapiclient.discovery import build

def CreateService(clientSecretFile, apiName, apiVersion, scopes):
    print(clientSecretFile, apiName, apiVersion, scopes, sep='-')
    CLIENT_SECRET_FILE = clientSecretFile
    API_SERVICE_NAME = apiName
    API_VERSION = apiVersion

    creds = None

    credFile = f'token_{API_SERVICE_NAME}_{API_VERSION}.json'

    if os.path.exists(credFile):
        creds = Credentials.from_authorized_user_file(credFile, scopes)

    # 유효한 credential이 없다면 login하도록 한다.
    if not creds or not creds.valid:
        if creds and creds.expired and creds.refresh_token:
            creds.refresh(Request())
        else:
            flow = InstalledAppFlow.from_client_secrets_file(CLIENT_SECRET_FILE, scopes)
            creds = flow.run_local_server(port=0)
        # 성공하면 기록하도록 한다.
        with open(credFile, 'w') as token:
            token.write(creds.to_json())

    # 서비스를 생성한다.
    try:
        service = build(apiName, apiVersion, credentials=creds, static_discovery=False)
        return service

    except Exception as e:
        print('Exception: ', e)

    return None
    

API_NAME = 'photoslibrary'
API_VERSION = 'v1'
CLIENT_SECRET_FILE = 'C:/Users/user/google-photo/client_secret.json'
SCOPES = ['https://www.googleapis.com/auth/photoslibrary',
          'https://www.googleapis.com/auth/photoslibrary.sharing']

service = CreateService(CLIENT_SECRET_FILE, API_NAME, API_VERSION, SCOPES)

#미디어 항목을 사용자의 라이브러리나 앨범에 업로드하려면 photoslibrary.appendonly또는 photoslibrary범위가 필요합니다.

CreateService 함수를 통해 서비스를 생성하도록 한다.

수행하면 다음과 같은 화면을 볼 수 있다.

구글 포토 API 이미지 업로드 자동화 해보기

로그인하면, verify되지 않은 앱이라고 나오면 continue하도록 한다.

구글 포토 API 이미지 업로드 자동화 해보기

성공적으로 로그인이 완료되고, 관련된 token이 json 형태로 저장된다. 이후 해당 json을 읽어 사용하게 된다.
또한 서비스가 만들어져서 반환된다. 

 

 

2. 구글 포토 API 활용한 이미지 업로드

위와 같은 인증이 완료되면 이제 본격적으로 구글 포토 API를 활용하여 이미지를 업로드 해보도록 한다. 

 

#구글 포토 API 사용해보기

import requests
import json
import warnings

warnings.filterwarnings('ignore')

#service.albums().list().execute() 


upload_url= 'https://photoslibrary.googleapis.com/v1/uploads'

token = json.load(open('token_photoslibrary_v1.json','rb'))

headers= {
    'Authorization':'Bearer '+ token['token'],
    'Content-type':'application/octet-stream',
    'X-Goog-Upload-Protocol':'raw',
    'X-Goog-Upload-File-Name': "totoro name.jpg"
    
}

image_file = "C:/Users/user/Desktop/mail.naver.jpg"
filename = 'mail.naver'  #파일명

img = open(image_file,'rb').read()


response = requests.post(upload_url, data=img, headers = headers, verify=False)


request_body ={
    'newMediaItems':
    [
        {
            'description': filename,
            'simpleMediaItem': 
            {
                'uploadToken': response.content.decode('utf-8')
            }
        }
    ] 

}


upload_response = service.mediaItems().batchCreate(body=request_body).execute()

 

 

최종 파일 업로드느 하기와 같은 방식으로 나오며, status 200 으로 메시지가 Success 로 뜨면 정상적으로 파일 업로드가 완료된다는 점을 알 수 있다.

 

구글 포토 API 이미지 업로드 자동화 해보기

반응형

댓글