찬찬의 Notion API 정복기 02 - Search

소찬 (Chan)·2022년 7월 18일
0
post-thumbnail

Search를 사용해보기 전에, 생성한 봇을 작업할 페이지에 공유 버튼을 클릭하여 추가해놓습니다.
추가하시면 API 통합이라는 문구가 보이실 겁니다.

이제 파이선으로 돌아오셔서, notion 객체를 만들고 search 문을 한번 돌려볼겁니다.
보기좋게 콘솔에 프린트 하기위해 pprint를 사용해서 프린트 해봅니다.

from dotenv import dotenv_values
from notion_client import Client
from pprint import pprint

config = dotenv_values(".env")
notion_secret = config.get('NOTION_TOKEN_PROBIT2')

notion = Client(auth=notion_secret)
pages = notion.search(filter={"property": "object", "value": "page"})
pprint(pages)

실행하면 하기와 같은 결과가 쭉 나옵니다.
저희가 주의깊게 우선 보아야 할 부분은, result 값의 리스트 배열에 있는 id 값과 properties 값입니다.

{'has_more': True,
 'next_cursor': 'e6dc1357-9778-4a2e-afe9-4861cc3b6c02',
 'object': 'list',
 'page_or_database': {},
 'results': [{'archived': False,
              'cover': None,
              'created_by': {'id': '7a43d973-5047-48bb-ab30-c006c009ab7b',
                             'object': 'user'},
              'created_time': '2022-06-07T00:46:00.000Z',
              'icon': {'emoji': '🧳', 'type': 'emoji'}, ...

id 는 Page id 이고, properties 에는 Page가 가지고 있는 정보들 입니다.

 'id': '16e34dab-509f-4c7e-bb88-f778902dd597',
 'properties': {'title': {'id': 'title',
                          'title': [{'annotations': {'bold': False,
                                                     'code': False,
                                                     'color': 'default',
                                                     'italic': False,
                                                     'strikethrough': False,
                                                     'underline': False},
                          'href': None,
                          'plain_text': '기획서(APP) - '
                                        '출금 페이지 내역',
                          'text': {'content': '기획서(APP) '
                                              '- 출금 페이지 '
                                              '내역',
                                              'link': None},
                          'type': 'text'}],
                'type': 'title'}}

id 만 보고는 이 페이지의 제목이 뭔지 알수 없으나,
idproperties 값에서 titleplain_text 값 혹은 textcontent 값으로 페이지 제목을 알 수 있습니다.
그래서 특정 페이지 편집할 때에는 다음과 같은 과정으로 페이지를 찾습니다.

특정 페이지 찾는 방법

  1. search(POST) 를 사용하여 결과 값 변수에 저장한다.
  2. 결과 값 변수에서 titleplain_text 값을 불러오기하여 원하는 제목의 페이지가 존재하는지 찾아본다.

그런데 API가 조회할 수 있는 페이지가 많을 시에는, 한번 search(POST) 를 호출하는 것만으로 찾을 수 없을 수 있습니다.
한번의 호출로 불러올 수 있는 page의 limit이 존재하는데, page_size라는 Parameter Value로 정의하고 있습니다. 기본 Default 값으로는 최대 값인 100으로 불러옵니다. 한꺼번에 많이 찾고 싶으면 100으로 줄 수 있겠고, 야금야금 찾아서 보고 싶다면 10이나 20으로 설정 후 호출하시면 됩니다.

The number of items from the full list desired in the response. Maximum: 100

page_size 호출 예시

pages = notion.search(filter={"property": "object", "value": "page"}, page_size=20)

그럼 두번째 호출할 시, 두번째 호출은 어느부분부터 보아야 할까요?
notion.search 초반 호출 값에서 has_morenext_cursor 값 보이신거 기억나시나요?
has_more가 True일 경우, 이후에 좀 더 결과 값이 있다는 걸 의미하고,
next_cursor는 다음 결과 값에 시작되는 page_id (혹은 database_id)를 의미합니다.

'has_more': True,
'next_cursor': 'e6dc1357-9778-4a2e-afe9-4861cc3b6c02',

그래서 다음에 한번더 호출할 때는 While 문을 사용해서 has_more 가 False가 될 때 까지 호출하시면서 값을 찾으시면 됩니다.

cursor_id = pages['next_cursor']
while pages['has_more']:
   pages = notion.search(filter={"property": "object", "value": "page"},
                         start_cursor=cursor_id)
   (중략)
   if pages['has_more']:
      cursor_id = pages['next_cursor']
   ...

properties 에서 title 값만 가져오려면 어떻게 해야될까요?
properties의 구조를 알아야 가져오는 방법을 알 수 있겠죠? 다음 시리즈에서는 properties의 구조에 대해 알아보도록 하겠습니다.

profile
QA Specialist

1개의 댓글

comment-user-thumbnail
2022년 11월 17일

안녕하세요. 궁금한게 있어서 질문 남깁니다.
next_cursor를 While 문을 사용해서 has_more 가 False가 될 때 까지 호출하시면서 값을 찾으면 된다고 하셨는데 처음 호출했을 때 has_more은 True여서 무한루프가 되지 않나요? 어떻게 호출을 하셨는지 궁금합니다.
그리고 처음에 노션 db 호출할 때 db id가 필요하지 않나요? 어디서 요청하셨는지 알 수 있을까요?

답글 달기