본문 바로가기
Etc

Python - Blogger API 로 글 작성하기

by 올엠 2024. 6. 8.
반응형

먼저 블로거를 API로 활용하기 위해서는 블로거에 로그인하는 구글 계정이 필요하다.

헤당 계정을 통해  https://console.cloud.google.com/ 으로 로그인하여 API 계정이 생성할 수 있다.

먼저 인증 부분을 해결해야 한다. 

인증은 API 페이지를 이용한 간편 방법과

아래는 클라우드 콘솔에서 진행하는 정식 방법으로 가능하다.

먼저 API 페이지에서 진행하는 방법으로 블로거 API를 위한 간편 설정 부분이다.

Blogger API 페이지에서 인증 생성

1. Oauth 를 이용한 방법

Blogger API: API 사용  |  Google for Developers

위 링크에 접속하면, 요청 승인 및 애플리케이션 식별 페이지가 열리는데, 여기에서 블로거용 Oauth의 발급과 요청 승인을 바로 진행할 수 있다.

위 OAuth 클라이언트 ID 가져오기를 누르면, 프로젝트 생성하거나 기존 프로젝트에서 OAuth를 생성할 수 있는데, 자신의 상황에 맞게 새로 생성하거나 기존 프로젝트에 Blogger API를 사용하도록 하자.


이후 프로젝트를 생성하고 Next를 누르면 어디에서 사용할 것인지를 묻는 화면이 나타난다. 필자는 Desktop App으로 선택하였다. 토큰 사용처 구분이기 때문에 알맞은 것을 선택하고 다음을 누르도록 하자.

 

 


다음을 누르면 실제 호출이 가능한, Client ID Secret 키가 나타나게 된다. 

키를 직접 입력하여 프로그램에서 사용해도 좋지만, 보통은 credentials.json로 생성하여 사용하므로, Download Client Configuration을 통해서 다운로드하여 저장해두도록 하자. 
 

이 정보를 추후 다시 확인하고자 한다면, 아래 구글 클라우드 콘솔에서 사용자 인증 정보에서 Oauth 부분을 통해서 동일하게 확인이 가능하다. https://console.cloud.google.com/apis/credentials 

다음은 구글 클라우드 콘솔에서 생성하는 방법이다.

구글 클라우드 콘솔에서 인증 생성

이를 위해서 Google Cloud Platform인 https://cloud.google.com/ 으로 접속 하도록 하자.

환영합니다 – Google Cloud Console

아직 프로젝트 생성이 되지 않았다면, IAM 및 관리자 > 프로젝트 만들기를 통해 프로젝트를 생성하도록 하자.


생성한 이후에는 아래와 같이 관리가 가능하므로, 정상적으로 생성되었는지 확인하도록 하자.

 

이후 API 및 서비스 메뉴를 통해서 라이브러리 에 들어가 Blogger API를 검색하면, 서비스를 확인할 수 있다.


 



이제 블로거 API 사용을 활성화 하였기 때문에, 인증 생성을 진행하도록 하도록 하자.
https://console.cloud.google.com/apis/credentials 에서 진행하거나 API 및 서비스 사용자 인증 정보를 누르면, 인증 정보를 생성할 수 있다.
사용자 인증 정보를 보면 위에 사용자 인정 정보 만들기가 보인다. 여기에서 앞서 Blogger API 페이지에서 만든 것처럼 API 키 방식으로 만들거나, OAuth 클라이언트 ID방식으로 작성이 가능하다.

OAuth 2.0을 누르면 몇가지 정보를 입력한후 생성되는데 앞서 입력했듯이 앱 생성 정보를 입력하면 되기 때문에 어렵지 않게 생성이 가능하다.
 

Oauth의 경우 유형을 입력하면 생성된다

Blog ID 확인

BLOG_ID는 관리 페이지에 접근시 나타나는 숫자키 값을 입력하자.
 

글 작성 하기

Oauth의 경우 Python 코드로 작성해서 인증을 진행하는 것이 유리하다. 
인증작업을 위해서 먼저 Google API 라이브러리를 설치하도록 하자.
pip install google-api-python-client google-auth-oauthlib
 
이후 OAuth용 credentials.json 를 파일을 다운로드하여서 사용하면 정상적으로 인증이 되지는 확인할 수 있다. 전체 코드는 아래와 같다.
from google.oauth2.credentials import Credentials
from google_auth_oauthlib.flow import InstalledAppFlow
from googleapiclient.discovery import build
import os.path
import pickle

# Blogger API의 스코프
SCOPES = ['https://www.googleapis.com/auth/blogger.readonly']

def get_credentials():
    creds = None

    # 저장된 크레덴셜 불러오기
    if os.path.exists('token.pickle'):
        with open('token.pickle', 'rb') as token:
            creds = pickle.load(token)

    # 크레덴셜이 유효하지 않으면 새로 생성
    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(
                'credentials.json', SCOPES)
            creds = flow.run_local_server(port=0)
        
        # 새로운 크레덴셜을 파일에 저장
        with open('token.pickle', 'wb') as token:
            pickle.dump(creds, token)

    return creds

def check_auth():
    credentials = get_credentials()

    # Blogger API 빌드
    service = build('blogger', 'v3', credentials=credentials)

    try:
        # Blogger API를 사용하여 사용자의 블로그 정보 가져오기
        blogs = service.blogs().listByUser(userId='self').execute()
        print("OAuth 인증이 성공적으로 확인되었습니다.")
        print("사용자의 블로그 목록:")
        for blog in blogs.get('items', []):
            print(f"- {blog['name']} ({blog['id']})")
    except Exception as e:
        print(f"OAuth 인증 확인 중 오류 발생: {e}")

if __name__ == '__main__':
    check_auth()

글 작성 하기

이제 글을 작성할 준비는 완료되었다. OAuth를 이용한 글 작성 방법이다.
인증 부분까지는 동일하고, 인증을 이용해서, 글을 작성한다고 보면 좋을 듯 하다.
from google.oauth2.credentials import Credentials
from google_auth_oauthlib.flow import InstalledAppFlow
from googleapiclient.discovery import build
import os.path
import pickle

# Blogger API의 스코프
SCOPES = ['https://www.googleapis.com/auth/blogger']

def get_credentials():
    creds = None

    # 저장된 크레덴셜 불러오기
    if os.path.exists('token.pickle'):
        with open('token.pickle', 'rb') as token:
            creds = pickle.load(token)

    # 크레덴셜이 유효하지 않으면 새로 생성
    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(
                'credentials.json', SCOPES)
            creds = flow.run_local_server(port=0)
        
        # 새로운 크레덴셜을 파일에 저장
        with open('token.pickle', 'wb') as token:
            pickle.dump(creds, token)

    return creds

def create_blog_post(credentials, blog_id, title, content):
    # Blogger API 빌드
    service = build('blogger', 'v3', credentials=credentials)

    # Blogger에 게시할 데이터 생성
    post_data = {
        'kind': 'blogger#post',
        'blog': {
            'id': blog_id,
        },
        'title': title,
        'content': content,
    }

    try:
        # Blogger API를 사용하여 글 작성
        post = service.posts().insert(blogId=blog_id, body=post_data).execute()
        print('글이 성공적으로 작성되었습니다.')
        print('게시된 글의 ID:', post['id'])
    except Exception as e:
        print(f'글 작성 중 오류 발생: {e}')

if __name__ == '__main__':
    # Blogger API 크레덴셜 가져오기
    credentials = get_credentials()

    # 블로그 ID: 블로그 대시보드에서 확인 가능
    blog_id = 'YOUR_BLOG_ID'

    # 작성할 글의 제목과 내용
    post_title = '새로운 글의 제목'
    post_content = '새로운 글의 내용입니다.'

    # 글 작성 함수 호출
    create_blog_post(credentials, blog_id, post_title, post_content)
반응형