티스토리 뷰

반응형
Notion에서 Tistory로 자동 업로드 #5 (tistory 카테고리 id를 notion table에서 가져오기)

개요


지난 번엔 티스토리 블로그에 자체 CSS를 적용하여 노션에서 제공하는 style처럼 보이게 만들었습니다.

이번에는 게시물을 업로드 할 때 어떤 카테고리에 올릴 지 티스토리 API를 사용하여 원하는 카테고리 id를 가져오는 방법을 알아보겠습니다.

티스토리 블로그 카테고리 id 가져오기


아래 링크는 티스토리에서 제공하는 공식 API 설명입니다. 그 중에서 카테고리 리스트를 가져오는 API를 사용하겠습니다.

카테고리
https://tistory.github.io/document-tistory-apis/apis/v1/category/list.html

위 링크에서 제공하는 API 주소는 다음과 같습니다.

GET https://www.tistory.com/apis/category/list?
  access_token={access-token}
  &output={output-type}
  &blogName={blog-name}
  • output: 리스트를 반환하는 형태로 'json', 'lxml' 타입을 선택할 수 있습니다.
  • blogName: 자신의 블로그 이름을 적으면 됩니다. (아래와 같은 자신의 블로그 주소에서 xxxx)
    • https://xxxx.tistory.com

파이썬에서 requests로 가져오기

위 API 주소로 파이썬을 사용해서 요청 해보겠습니다. 위의 각 요소들은 params라는 dictionary에 담아서 GET방식으로 요청하겠습니다. 저는 반환 방식을 lxml로 하겠습니다.

import requests
url = 'https://www.tistory.com/apis/category/list'
params = {
    'access_token': ACCESS_TOKEN,
    'blogName': BLOG_NAME,
    'output': 'lxml'
}
resp = requests.get(url, params=params)

위에서 요청받은 resp 변수를 아래와 같이 출력해서 확인 해 보면 category id들을 확인할 수 있습니다.

from bs4 import BeautifulSoup
soup = BeatufiulSoup(resp.text, 'lxml')
category_list = soup.find_all('category')

아래는 category_list 리스트 중에서 현재 게시물을 업로드 할 카테고리인 기타/Notion의 한 sample입니다.

(id는 000000으로 교체하였습니다.)

label이 해당 카테고리의 이름이고, id가 게시물 업로드 API에서 사용할 카테고리 id 입니다.

기타는 대분류고, 그 안에 Notion이 소분류인데 '/' 기호로 구분이 되어있네요.

<category>
	<id>000000</id>
  <name>Notion</name>
	<parent>825834</parent>
	<label>기타/Notion</label>
	<entries>6</entries>
	<entriesinlogin>6</entriesinlogin>
</category>,

아래는 티스토리 블로그 설정 - 컨텐츠 - 카테고리 관리에서 캡쳐한 사진입니다.

이제 이것을 label 로 검색하면 id를 반환 해주는 함수를 작성해 보겠습니다.

def get_category_id_from_label(target_name):
	url = 'https://www.tistory.com/apis/category/list'
	params = {
	    'access_token': ACCESS_TOKEN,
	    'blogName': BLOG_NAME,
	    'output': 'lxml'
	}
	# api 요청
	resp = requests.get(url, params=params)
	
	# lxml 형식으로 parsing
	soup = BeautifulSoup(resp.text, 'lxml')
	
	# category로 되어있는 모든 태그 가져오기
	category_list = soup.find_all('category')
	
	# 모든 category 탐색
	for item in category_list:
	    label = item.find('label').text
			# 찾고자 하는 target_name을 발견하면 id 반환
	    if label == target_name:
	        return item.find('id').text

위와 같은 함수를 작성하고 아래와 같이 호출하면 원하는 카테고리 id를 얻을 수 있습니다.

get_ctegory_id_from_label('기타/Notion')
# 000000

notion-py를 이용해서 발행할 게시물(페이지)의 카테고리 이름 찾기


notion table property 세팅

맨 첫번째 게시물에서 봤듯이 저는 노션에서 아래 사진과 같이 테이블 property를 설정했습니다.

카테고리 property type은 select 옵션으로 설정하고 미리 티스토리 카테고리 목록들을 다 적어 놓았습니다.

notion-py 모듈로 가져오기

아래 링크에서 notion-py의 간단한 사용법을 알 수 있습니다.

Notion에서 Tistory로 자동 업로드 #4
Notion에서 Tistory로 자동 업로드 #4 지난 번에 notion page를 html형태로 export하여 python으로 parsing하고 tistory API로 직접 업로드까지 해보았습니다. 이번에는 notion CSS를 적용하여 블로그에서도 노션과 같은 style로 보이게 수정해보겠습니다. 아래는 notion page를 html export한 파일을 열었을 때의 소스 입니다. 태그 안에 여러가지 css가 적혀 있는데요, 이를 티스토리 블로그에 그대로 가져가면 적용이 됩니다.
https://minimin2.tistory.com/101

notion token과 자동화를 원하는 노션 페이지 url을 가져와서 아래에 각각 채워줍니다.

client.get_collection_view()함수로 테이블 정보를 가져올 수 있습니다.

get_rows()를 사용하면 테이블의 모든 행을 반복문으로 돌게 되는데요,

이때 property는 영어로 되어있는데 row를 출력하시면 property이름도 확인할 수 있습니다.

저는 카테고리 항목을 확인하기 위해 row.kategory로 출력해 봤습니다.

(한글이 알아서 영어로 전환되네요. 하지만 발음하는 대로 변환됩니다.. 카테고리→kategory)

from notion.client import NotionClient

token_v2 = '<token>'
client = NotionClient(token_v2=token_v2)

# 포스팅 목록 테이블 페이지
table_url = '<url>'

# 테이블 가져오기
cv = client.get_collection_view(table_url)

# 카테고리 확인하기
for row in cv.collection.get_rows():
	print(row.kategory)
# 출력: 기타/Notion

이제 저 row.kategory의 값을 맨 위에 만들었던 get_id_from_label() 함수에 넣어주면,

티스토리 API로 카테고리 id를 바로 얻어낼 수 있습니다.

그럼 지난 게시물에서 api로 게시물을 업로드 할 때, 카테고리 id를 일일이 입력하지 않아도 되겠죠? ㅎㅎ

이제 거의 자동화가 완성 되었네요. 전체 소스는 쉽게 사용할 수 있도록 정리해서 공유할 예정입니다.

추가로 더 작업할 건 다음과 같습니다.

다음 할 일

  • 노션에서 게시한 페이지의 property를 발행완료로 수정하기 (notion-py 사용)
  • notion page를 일일이 다운로드 하지 않고 자동으로 export 하기 (selenium 사용)


이 게시물은 Notion에서 작성되어, 자동으로 업로드 되었습니다.

반응형
댓글
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday