반응형
[python] 구글 포토 API 이미지 업로드 자동화
구글 포토 API를 사용하는 방법에 대해 간단히 기록을 남기도록 한다.
youtube에도 잘 설명되어있긴한데... 따라하다보니 잘 안되는 부분들이 있어서 관련 내용을 기록하는 것이 주목적이다.
Google Photo API를 사용하기 위해서는 먼저 관련 API를 Enable해주고, OAuth를 통해 인증을 받아야 합니다.
1. 구글 포토 API 이미지 업로드를 위한 권한 획득
다음 사이트를 참고하여 API Enable 및 OAuth 2.0 Client ID를 생성한다.
1.1 Google Photo API 활성화
- API Console으로 이동
- menu bar에서 project를 선택
- Google API library에서 Google Photos Library API를 찾고, Enable 합니다.
1.2 OAuth 2.0 client ID 생성하기
- Google API Console으로 이동
- API & Services > Credentials을 선택
- Create Credentials > OAuth client ID를 클릭하여 client ID를 생성한다.
- Application type은 Desktop app을 선택, 이름은 알아서 지정, 생성되면 ClientID와 Client secret가 담긴 json을 다운로드받는다.
- OAuth consent screen 사용자 인증 정보 에서 Test users에 계정을 추가한다.
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 함수를 통해 서비스를 생성하도록 한다.
수행하면 다음과 같은 화면을 볼 수 있다.
로그인하면, verify되지 않은 앱이라고 나오면 continue하도록 한다.
성공적으로 로그인이 완료되고, 관련된 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 로 뜨면 정상적으로 파일 업로드가 완료된다는 점을 알 수 있다.
반응형
'Python' 카테고리의 다른 글
[python] 구글 블로거 블로그 스팟 이미지 업로드 및 자동 포스팅 (0) | 2022.10.17 |
---|---|
[python] 무료 이미지 호스팅 URL 가져오기 (0) | 2022.10.17 |
[python] 파이썬 코딩 메모장 내 다른 메모장으로 옮기기 (0) | 2022.10.12 |
[python] 구글 드라이브 내 이미지 텍스트 변환 해보기 (0) | 2022.10.12 |
[python] konlpy counter 정렬 (0) | 2022.10.12 |
댓글