찬찬의 Notion API 정복기 05 - 내용을 바꿔보자 (상)

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

Notion API에 rich_text 형태로 업데이트 해달라고 하면, 업데이트를 해주는데,
rich_text 라는게 까다롭습니다. 뭐만 하면 형식에 맞춰달라 에러를 뱉어내니까,
하지만 다음과 같이 하면 쉽게 내용을 바꾸실 수 있습니다.

  1. 바꾸려는 page 혹은 block 을 읽는다.
  2. 읽은 내용 중 rich_text를 임시 변수에 저장한다.
  3. 임시 변수에 수정할 내용을 변경하여 다시 저장한다.
  4. 변경한 임시 변수를 그대로 업데이트 해달라고 하면 에러를 뿜지않고 고스란히 수정한대로 바꿔준다.

우선 바꾸려는 페이지를 읽습니다.
노션 API 정복기 4까지 읽으셨다면, title 이름만으로 page_id 를 찾아오실 수 있을겁니다.
페이지에 내용이 작성되어 있다고 가정하고,
내용에 block 을 읽어보는 코드를 실행시켜 보겠습니다.

page_id = '2c9258e1-43ed-4713-8895-123d42268d2f'
block_list = notion.blocks.children.list(block_id=page_id)
pprint(block_list)

특이한점은 page_idblock_id 로도 사용할 수 있다는 점입니다.
pageblock 은 호환되는 개념으로 보시고 id를 활용하시면 됩니다.
결국 노션은 database > page > block 이런 개념인데,
databasepage의 묶음, pageblock의 묶음으로 보실 수 있겠죠?

이제 block_list 값을 살펴보겠습니다. 그러면 위의 '페퍼로니가 취향저격' 이란 글이 있는 블록을 찾으실 수 있을겁니다.
block_listlist 배열로 되어있습니다.

'id': '27b0ad2f-5698-4f7c-ab07-00f174042264'
...
'paragraph': {'color': 'default',
              'rich_text': [{'annotations': {'bold': False,
                                             'code': False,
                                             'color': 'default',
                                             'italic': False,
                                             'strikethrough': False,
                                             'underline': False},
                             'href': None,
                             'plain_text': '페퍼로니가 취향저격',
                             'text': {'content': '페퍼로니가 취향저격',
                                      'link': None},
                             'type': 'text'}]}, ...

여기서 '페퍼로니가 취향저격' 이란 문구가 존재하는 block의 id를 찾아오시면 됩니다.
첫번째 블록에 있다고 가정할때 ['results'][0]번째 ['id'] 값을 가져오시면 되시고,
두번째 블록에 있다고 가정할때 ['results'][1]번째 ['id'] 값을 가져오시면 됩니다.

[0]번째에 있을 시 해당 id 를 target_block_id 라는 변수에 저장한다고 할 때는 다음과 같이 선언 해주시면 됩니다.

target_block_id = block_list['results'][0]['id']

이제 페퍼로니가 취향저격크러스트가 취향저격으로 바꿔보는 걸 해보겠습니다.
rich_text 안에 있는 내용을 변수에 저장할 겁니다.

{'block': {},
 'has_more': False,
 'next_cursor': None,
 'object': 'list',
 'results': [{'archived': False,
              'created_by': {'id': 'edfacc72-eb15-467b-9fdb-d5b656e1c77b',
                             'object': 'user'}, ...
              'paragraph': {'color': 'default',
                            'rich_text': [{'annotations': {'bold': False,

block_list['results'][0]번째 리스트 값의 ['paragraph']['rich_text']를 변수에 대입시키면 되겠죠.
rich_text_temp = block_list['results'][0]['paragraph']['rich_text']

이제 rich_text_temppprint로 값을 찍어보겠습니다.

[{'annotations': {'bold': False,
                  'code': False,
                  'color': 'default',
                  'italic': False,
                  'strikethrough': False,
                  'underline': False},
  'href': None,
  'plain_text': '페퍼로니가 취향저격',
  'text': {'content': '페퍼로니가 취향저격', 'link': None},
  'type': 'text'}]

보시면 이미 예리하신 분은 특이점이 있다는걸 찾으셨을겁니다.
바로 dictionary {}에 list [] 형식이 씌워져 있다는 점입니다.
notion API로 업데이트 할때는 반드시 list [] 형식이 씌워진 상태로 업데이트를 진행해야지 API 에서 인식이 됩니다.

이제 바꿔야 될 부분은 'plain_text''text''content' 부분입니다.
rich_text_temp 로 부터 원래의 text 를 읽어서 변수에 저장해 보겠습니다.

text_value = rich_text_temp[0]['plain_text']
text_value = text_value.replace('페퍼로니', '크러스트')

그럼 이 text_valuerich_text_temp'plain_text''text''content' 값을 치환 시킨뒤, 이 값으로 업데이트 해달라 하면 Update API가 동작할겁니다.

rich_text_temp[0]['plain_text'] = text_value
rich_text_temp[0]['text']['content'] = text_value
pprint(rich_text_temp)

pprint 의 값은 다음과 같습니다.

[{'annotations': {'bold': False,
                  'code': False,
                  'color': 'default',
                  'italic': False,
                  'strikethrough': False,
                  'underline': False},
  'href': None,
  'plain_text': '크러스트가 취향저격',
  'text': {'content': '크러스트가 취향저격', 'link': None},
  'type': 'text'}]

이제 Dictionary 형태로 rich_text는 업데이트 할 값이다 라고 감싸주시면 업데이트 할 준비가 완료됩니다.

rich_text = {}
rich_text['rich_text'] = rich_text_temp
profile
QA Specialist

0개의 댓글