Notion API에 rich_text
형태로 업데이트 해달라고 하면, 업데이트를 해주는데,
rich_text
라는게 까다롭습니다. 뭐만 하면 형식에 맞춰달라 에러를 뱉어내니까,
하지만 다음과 같이 하면 쉽게 내용을 바꾸실 수 있습니다.
page
혹은 block
을 읽는다.rich_text
를 임시 변수에 저장한다.우선 바꾸려는 페이지를 읽습니다.
노션 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_id
를 block_id
로도 사용할 수 있다는 점입니다.
page
와 block
은 호환되는 개념으로 보시고 id를 활용하시면 됩니다.
결국 노션은 database
> page
> block
이런 개념인데,
database
는 page
의 묶음, page
는 block
의 묶음으로 보실 수 있겠죠?
이제 block_list
값을 살펴보겠습니다. 그러면 위의 '페퍼로니가 취향저격' 이란 글이 있는 블록을 찾으실 수 있을겁니다.
block_list
는 list
배열로 되어있습니다.
'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_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 {}
에 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_value
를 rich_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