Notion API 활용(with Python)

Jay Kim·2022년 9월 15일
  • 아나콘다 ) 여러가지 패키지가 기본적으로 포함되어 있는 파이썬 배포판 다라서 세팅이 매우 간단해진다. conda 패키지 관리자를 통해 쉽게 패키지를 설치하고 가상 환경을 관리한다.

https://www.anaconda.com/products/distribution 파이썬 3.0 version 아나콘다 설치

Untitled

Anaconda prompt로 python 버전을 확인한다.

Untitled

cmd를 통해 아나콘다 버전을 확인한다.

+Jupyter Notebook : 웹 브라우저상에서 코드를 단계적으로 실행해볼 수 있는 프로그램

http://127.0.0.1:8889/?token=05c4a24efeb830be8db7cfa73aa95c8cec341706796b84cd

Requests 라이브러리

파이썬으로 HTTP 통신이 필요한 프로그램을 작성할 때 가장 많이 사용되는 라이브러리

특히 원격에 있는 API를 호출할 대 주로 사용한다.

pip install requests : 파이썬의 패키지 매니저인 pip를 이용하여 requests 패키지 설치

🔴SSL 인증 error 해결 방법🔴

Untitled

🔴Warning 메시지 숨기기🔴

Jupyter Notebook을 사용할 경우 향후 버전 업그레이드 될 경우 변경될 사항을 알려주기 위하여 warning message를 출력한다. 이럴 경우 warnings 라이브러리를 사용하여 숨기거나/ 다시 보이게 할 수 있다.

import warnings

#경고 메시지 숨기기
warningsfilterwarnings(action = 'ignore')

#숨겼던 경고 메시지를 다시 보이게 하기
warings.filterwarnings(action = 'default')

requests로 Rest API 호출하기

requests.get()Get 요청
requests.post()Post 요청
requests.put()Put 요청
requests.delete()Delete 요청

requests 라이브러리가 제공하는 HTTP 요청 이름에 해당하는 함수

https://nasn.tistory.com/117

notion api 이용하기

현재 Python으로 공개된 Notion API가 두가지가 있습니다.

notion-py/notion at master · jamalex/notion-py

  • notion-py 패키지 설치 : pip install notion
  • notion을 원격에서 파이썬으로 제어하기 위해서는 인증 토큰이 필요하다. 노션 페이지에 로그인 한 상태에서 F12키를 실행하여 Cookies에서 token_v2 값을 복사한다.

🔴Unofficial ? Official?🔴

비공식 API공식 API
사용자가 쓰기 쉽게 개발된 API사용하기 어렵지만 Notion API Reference에 기술된 API 명 그대로 사용
오류 발생 시, 클라이언트 개발자가 디버깅 해주기 전까지 기능 사용 힘들다.오류 발생 시, 파이썬에서 직접 디버깅해서 호출 한 뒤 사용 가능하다.

client 변수 = 노션 접속을 한 내용이 저장 이때 token 값이 필요하다.

get_block(page url) = 제어할 노션 페이지를 설정한다. 페이지의 제목과 블록들을 제어할 수 있다.

1)Python Notion API를 이용하여 노션 페이지의 제목을 확인하고 자동으로 바꿔보기 (페이지 제목 자동화)

from notion.client import NotionClient

# Obtain the `token_v2` value by inspecting your browser cookies on a logged-in (non-guest) session on Notion.so
client = NotionClient(token_v2="9e1277377147e8156ee3cd5320ff15382ed7f06acf52603306bc82179a0dd869cdf9c48d33c37fba73f18c0de2912bf1341ce2299bf7898c80fff02892dbae64a38d8b9d8f6b00237b7677e9603f") #시크릿 토큰 값 

# Replace this URL with the URL of the page you want to edit
page = client.get_block("https://www.notion.so/Hello-Notion-Task-39928068200848a4bfb4b8f827098bbe")  #notion page url

print("The Notion title is:", page.title) # 노션 페이지 제목 확인

page.title = "노션 페이지 title 변경 완료" #노션 페이지의 제목을 자동으로 바꾸기

print("The title has now changed:", page.title) # 바뀐 노션 페이지 제목 확인

노션 페이지의 제목이 자동으로 바뀜을 확인

Untitled

🔴ERROR🔴

requests.exceptions.HTTPError: Invalid input.은 notion api가 변경되어 발생하는 오류이다.

import inspect
import notion
print(inspect.getfile(notion)) # notion 모듈의 위치

notion 모듈의 위치를 위와 같이 찾아 store.py와 clinet.py 파일 중 limit 값이 크게 설정되어 있기 때문에 limit = 100000을 limit=100으로 수정한다.

Untitled

2)Python Notion API로 노션 페이지 정보 출력하기

from notion.client import NotionClient

# Obtain the `token_v2` value by inspecting your browser cookies on a logged-in (non-guest) session on Notion.so
client = NotionClient(token_v2="9e1277377147e8156ee3cd5320ff15382ed7f06acf52603306bc82179a0dd869cdf9c48d33c37fba73f18c0de2912bf1341ce2299bf7898c80fff02892dbae64a38d8b9d8f6b00237b7677e9603f") #시크릿 토큰 값 

# Replace this URL with the URL of the page you want to edit
page = client.get_block("https://www.notion.so/Hello-Notion-Task-39928068200848a4bfb4b8f827098bbe")  #notion page url

for child in page.children:
    print(child.title)

Untitled

Untitled

왼쪽의 페이지의 정보를 오른쪽과 같이 출력한다. 테이블 형식은 별도의 코드를 추가해야 하므로 출력 되지 않는다.

3) ToDoBlock으로 할 일 자동 생성하기

from notion.block import TodoBlock(*)

참고: https://github.com/jamalex/notion-py/blob/master/notion/block.py

from notion.client import NotionClient
from notion.block import TodoBlock

client = NotionClient(token_v2="9e1277377147e8156ee3cd5320ff15382ed7f06acf52603306bc82179a0dd869cdf9c48d33c37fba73f18c0de2912bf1341ce2299bf7898c80fff02892dbae64a38d8b9d8f6b00237b7677e9603f") #시크릿 토큰 값 
page = client.get_block("https://www.notion.so/Hello-Notion-Task-39928068200848a4bfb4b8f827098bbe")  #notion page url

newchild1 = page.children.add_new(TodoBlock, title = "노션 한글 축하 영상 업로드")
newchild2 = page.children.add_new(TodoBlock, title = "조정경기장 사이클 타기")

print("자동 완성 완료")

다음과 같이 페이지에 할 일 목록이 생성된다. →

할 일 수행 완료를 하고 싶은 경우 →

newchild1.checked = True

Untitled

Untitled

4)비디오 블록으로 유튜브 영상 가져오기

video1 = page.children.add_new(VideoBlock) #VideoBlock 추가
video1.width = 600
video1.height = 300
#추가 할 비디오의 url 설정
video1.set_source_url("https://www.youtube.com/watch?v=OgXwu0eLDSs") 

Untitled

5)사용자에게 반복적으로 url 입력을 받아 반응

print("페이지 제목 확인: ", page.title)

answer = "예"
text = page.children.add_new(TextBlock)
text.title = "파이썬 API VideoBlock 활용 참고 영상 자동 추가 반복하기"

while answer =="예":
    video = page.children.add_new(VideoBlock) #VideoBlock 추가
    video.width = 600
    video.height = 300
    input_url = input("추가 할 비디오의 URL 주소를 입력하세요.")
    video.set_source_url(input_url)
    answer = input("추가로 비디오 블록을 생성할건가요?")
    
print("자동 완성 완료")

Untitled

Untitled

6) CodeBlock 자동 생성

#코드 블록 자동 추가
from notion.client import NotionClient
from notion.block import CodeBlock

# 시크릿 토큰 값 설정
client = NotionClient(token_v2="f97b195d64663eaef0bf80854a83dc2ba44037ce2f3ee168b84ebdf565062d6837106813304fed63a89230e72f0030b678b6147ae36a5e2577c98194044038bedbe02f2c78e8fcdc9cc88fb8ad71")

#제어할 노션 페이지의 url
page = client.get_block("https://www.notion.so/Notion-API-Test-Page-50e64e6469bf425fa5a1ed07b9a1edff")  

#todo block 생성
newchild1 = page.children.add_new(CodeBlock, language = "java", title="System.out.write(65);")

print("CodeBlock 생성 완료")

Untitled


7) checklist 자동화

from notion.client import NotionClient
from notion.block import *
from notion.collection import *
from datetime import datetime
import notion

def get_today_str():
    today = datetime.today()
    return f'{today.year}{today.month}{today.day}일'

client = NotionClient(token_v2="9e1277377147e8156ee3cd5320ff15382ed7f06acf52603306bc82179a0dd869cdf9c48d33c37fba73f18c0de2912bf1341ce2299bf7898c80fff02892dbae64a38d8b9d8f6b00237b7677e9603f") #시크릿 토큰 값 

# Replace this URL with the URL of the page you want to edit
page = client.get_block("https://www.notion.so/Hello-Notion-Task-39928068200848a4bfb4b8f827098bbe")  #notion page url

## page.children을 print해보면 CollectionViewBlock 혹은 TableViewBlock이 존재한다고 나올겁니다.

myViewBlock = page.children[0] # 우리가 미리 만들어 놓은 테이블(ViewBlock)을 호출합니다.

new_row_of_my_table =myViewBlock.collection.add_row()   # 우리가 만든 테이블의 데이터 모음을 collection이라고 부르는데 여기에 새로 가로 줄을 하나 추가해줍니다.

# 가로줄을 추가하는 순간 table view의 특성상 이름이 Untitled(안보임)인 페이지가 추가됩니다.

new_row_of_my_table.title = get_today_str()+' 체크리스트'    # 새로운 가로줄의 이름을 설정하면 새로운 페이지가 눈에 보일 것입니다.

AM_check_list_toggle = myViewBlock.children.add_new(ToggleBlock, title='오전 체크리스트')   # 누르면 펼쳐지고 또 다시 누르면 닫히는 Toggle 블럭을 우리가 새로 만든 페이지에 추가해줍니다.

## 위의 Toggle Block의 이름은 미리 title에서 지정해두었고 toggle의 하위 내용으로
## TodoBlock을 추가해줍니다.

AM_check_list_toggle.children.add_new(TodoBlock,title='8시 30분 전에 기상')
AM_check_list_toggle.children.add_new(TodoBlock,title='10시 30분 전에 출근')
AM_check_list_toggle.children.add_new(TodoBlock,title='새로운 메일 점검!')

# 이런식으로 추가해주세요.

+자동화 ) 윈도우에서는 ‘작업 스케줄러’를 사용하여 스크립트 실행을 예약 할 수 있다.

하지만 윈도우 작업 스케줄러는 사용자가 직접 조작해서 설정하는 GUI 방식인데 Cron은 운영체제와 상관없이 동일한 방식의 텍스트 편집만으로 설정이 가능하기 때문에 Cron을 사용하여 자동화 시스템을 만든다.

Cron = 미리 설정한 날짜, 시간에 따라 스크립트를 실행해주는 잡 스케줄러

http://www.nncron.ru/download.shtml 에서 nncronIt117.exe 설치

🔴ERROR🔴

Notion API 자체 문제

  • IndexError: list index out of range = block.py 문제
  • ModuleNotFoundError: No module named 'notionist’ = from notionist import collection_api 모듈 설치 문제

Untitled


  • BeautifulSoup : Html, XML 등 파일로부터 데이터를 뽑기 위한 모듈(파싱 기능)

python test page

0개의 댓글