Notion에서 Tistory로 자동 업로드 #5 (tistory 카테고리 id를 notion table에서 가져오기)
개요
지난 번엔 티스토리 블로그에 자체 CSS를 적용하여 노션에서 제공하는 style처럼 보이게 만들었습니다.
이번에는 게시물을 업로드 할 때 어떤 카테고리에 올릴 지 티스토리 API를 사용하여 원하는 카테고리 id를 가져오는 방법을 알아보겠습니다.
티스토리 블로그 카테고리 id 가져오기
아래 링크는 티스토리에서 제공하는 공식 API 설명입니다. 그 중에서 카테고리 리스트를 가져오는 API를 사용하겠습니다.
위 링크에서 제공하는 API 주소는 다음과 같습니다.
GET https://www.tistory.com/apis/category/list?
access_token={access-token}
&output={output-type}
&blogName={blog-name}
- access-token: 아래 링크에서 tistory api token 받는 법 참고하시면 됩니다.
- 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 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에서 작성되어, 자동으로 업로드 되었습니다.