코딩하는 개굴이

Notion 을 Tistory 로 변환하기 (feat. N2T) 본문

기본기 채우기

Notion 을 Tistory 로 변환하기 (feat. N2T)

개굴이모자 2023. 2. 20. 02:31
반응형

스스로 정리하고자 글을 작성하는데 어떤 프로그램을 사용하는지는 자유이다. 본인의 경우는 Notion 을 사용하는데, 다양하게 템플릿을 제공하고 보기 편하며 약간의 지불로 무제한 이용이 가능한 스페이스가 주어짐이 이유였다.

그리고, 이렇게 작성된 글을 주로 Tistory 에 올려 포스팅하여 공유하곤하는데, 이런 과정에서 큰 불편함이 있다.

바로 Notion 과 Tistory 는 상호 호환이 좋지 않다는 것이다. 😭

Notion 에서 글을 작성하고 Tistory 로 붙여넣기를 한다면 형태가 그대로 유지되지 않고 특히 이미지가 들어가지 않는 문제가 있다.

한두개의 이미지는 참고 붙여넣을 수는 있으나, 2-3개가 넘어가면 일일이 파일로 저장하고 붙여넣고 수정하는데 매우 큰 불편함이 느껴지기 마련이다.

이럴때, Notion 을 Tistory 로 포스팅할 수 있도록 변환해주는 것이 있다면 좋을텐데… 라는 생각이 들었다면 친절하게도 그러한 불편을 미리 경험하고 방법을 찾아놓은 방법이 있으므로 우리는 감사하게 이를 사용하면 된다!

그리고 이번 포스팅은 해당 방법을 소개하고 적용해보면서 어려움들과 이를 어찌 처리해야하는지를 가이드 해보고자 한다.

N2T란?

위에서 소개했지만 친절하게도 Notion 에서 Tistory 로 변환하는 과정의 번거로움에 답을 찾아두신 분이 계신다.

N2T 는 “노션 테이블 페이지에서 상태 컬럼을 발행 요청/수정 요청으로 두면 해당 내용이 자동으로 티스토리 블로그로 업로드” 해주는 기능을 제공하며, 아래 블로그에 적어두신 가이드를 따라가면 개발자분의 설명도 잘 되어있다.

다만, 이번 포스팅의 경우 본인이 따라가면서 주의해야할 점이라고 느꼈던 것들과 헷갈렸던 점들을 적은 것이므로 개발자의 블로그를 먼저 보는 것을 권장한다.

N2T 를 적용하기 위해서 아래와 같은 과정을 거칠 것이다. 순차적으로 따라가보도록 하자.

만일 중간의 과정에서 에러가 발생하거나 스킵하였다면 작동이 불가할 수 있으므로 빼먹지 않도록 주의하자.
또한, 본인의 경우 N2T 에서 제공하는 모든 기능을 사용한 것이 아니므로, 가이드 또한 참고하여 본인과 맞는 환경을 구축할 것을 권장한다.

  • 발행/수정의 대상을 리스팅하는 Notion 테이블 생성하기
  • N2T 코드 클론 / 환경 설정하기
  • OpenAPI 등록하기
  • Notion 에서 TokenV2 값 가져오기
  • 업로드하기

테이블 생성하기

향후 세팅이 끝나게되면 우리는 Notion 에서 아래처럼 테이블에 특정 페이지를 올리고 세팅한 후, python 코드를 돌리면 티스토리에 자동으로 포스팅이 올라가도록 만들게 될 것이다.

그러기 위한 첫번째 단계가 본인의 노션에 위와 같이 테이블 템플릿을 맞추어 페이지를 하나 생성하는 것이다.

페이지의 템플릿은 아래 링크를 참고하면 된다. 우측 상단의 ‘복제’ 를 선택하여 본인의 노션에 옮기도록 하자.

N2T Clone & 환경 세팅

해당 포스팅은 MacOS 환경을 기반으로 작성되었음을 알립니다.

Clone

우선 N2T 코드를 clone 하자. 해당 코드가 있어야할 위치에 이동하여, git 을 clone 해오도록하자. 명령어는 아래와 같다.

git clone https://github.com/jmjeon94/N2T.git

환경 세팅

N2T 는 코드를 실행하기 위해 여러 패키지들을 필요로한다.

필요한 패키지들의 리스트는 requirements.txt 에 들어가있으므로, N2T 를 clone한 경로로 이동하여 아래 명령어를 이용해 설치해보자.

pip3 install -r requirements.txt

자, 여기서 뭔가 문제가 발생한 사람들이 있을 것이다. 없다면 다음 step 으로 넘어가도 좋다.

Permission denied 에러

Could not install packages due to an EnvironmentError: [Errno 13] Permission denied: '/Library/Python'
Consider using the `--user` option or check the permissions.

설치하는 과정에서 위와 같은 에러가 발생하였다면, --user 를 뒤에 붙인다면 문제 없이 동작시킬 수 있다.

lxml install 에러 (libxml2 installed? try xcode-select —install)

본인의 경우 여기서 애를 많이 먹었다. 우선, requirements.txt 는 아래와 같이 필수 설치 파일들이 존재하는데, 그 중 lxml 이 문제인 것이다.

그러므로, 우선 해당 파일에서 lxml 을 제외하고 다시 실행하도록 하자. lxml 은 따로 설치할 것이다.

vi requirements.txt
// 혹 명령어에 익숙치 않은 사람들을 위해 적자면, i 로 input 하여 lxml 라인을 지우고 :wq 로 저장한다.

나머지 설치는 다 success 가 되었다면 이제 lxml 의 설치만 남았다.

pip3 install lxml

해당 명령어로 lxml 을 설치했을 때 잘 되었다면 다행이지만, 본인의 경우 아래와 같은 에러가 발생하였다.

clang: error: invalid version number in 'MACOSX_DEPLOYMENT_TARGET=12'
      *********************************************************************************
      Could not find function xmlCheckVersion in library libxml2. Is libxml2 installed?
      Perhaps try: xcode-select --install
      *********************************************************************************
      error: command '/usr/bin/clang' failed with exit code 1
      [end of output]
  
  note: This error originates from a subprocess, and is likely not a problem with pip.
error: legacy-install-failure

× Encountered error while trying to install package.
╰─> lxml

note: This is an issue with the package mentioned above, not pip.
hint: See above for output from the failure.

구글링 해본 결과, 이는 현재 내가 사용하는 python 3.11.x가 lxml 과 호환이 맞지 않기 때문이었는데, 이를 해결하기 위해서는 python 의 버전을 바꾸어야한다.

python --version 
// 해당 결과가 3.11.x 가 나온다면 변경이 필요하다.

//python 을 uninstall 한다.
brew uninstall --ignore-dependencies python@3.11
//심볼릭 링크 등을 삭제한다.
sudo rm -rf /usr/local/Cellar/python@3.11/3.11.2_1
brew doctor
brew cleanup

//완료 후, 버전을 확인한다.
python3 --version                                 
//Python 3.7.3

//다시 lxml 의 설치를 시도하자
pip3 install lxml
//혹 이리 했는데 다시 3.11.x 버전으로 시도되어 동일한 문제가 발생한다면, 아래와 같이 시도하자.
python3 -m pip install lxml

해결되었는가? 😊

ModuleNotFoundError: No module named ‘requests’ 에러

requests 가 정상적으로 설치되지 않은 것이 원인이다. 아래의 명령어로 설치해주도록 하자.

python3 -m pip install requests

과정에 있어서 위의 python 의 reinstall 을 했다면 기존에 패키지를 받은 것이 없을 수도 있다. 다시 시행하도록 하자. 혹, 그러하더라도 비슷한 문제가 지속된다면 PATH 가 이전을 바라보고 있을 가능성이 있으므로 export 를 다시 수행해보도록 하자.

export PATH=/usr/local/opt/python3/libexec/bin:$PATH

ValueError: [Error] 다운로드 폴더 경로를 비우고 다시 실행해주세요 에러 (실행 시)

cd ~/.n2t
ls -al
// 나오는 애들을 복사
rm -r 나온-파일-이름

경로에 삭제되지 않은 것이 남아있어서 발생하는 에러로, 위처럼 비워주면 해결된다.

주로 중간에 에러가 발생할 경우 자동으로 삭제가 되지 않아 발생하는 것으로 보인다.

NoneType object 에러 (이미지 파일 형식 등 지원하지 않는 형식 에러)

Traceback (most recent call last):
  File "main.py", line 172, in <module>
    client.posts()
  File "main.py", line 79, in posts
    self.parse_and_post(page, page_path)
  File "main.py", line 140, in parse_and_post
    content = self.translate_img_url(content)
  File "main.py", line 104, in translate_img_url
    url, replacer = self.t_client.attach(fp)
  File "/Users/당신의 경로/clients/TistoryClient.py", line 159, in attach
    url = soup.url.text
AttributeError: 'NoneType' object has no attribute 'text'

위와 같이 발생하는 에러의 경우 heic 등 지원하지 않는 확장자 형식을 사용하였기 때문이다.

본인은 heic 파일을 jpg 로 변환하여 해결하였다.

Config 세팅

실행하기 위해 config 파일에 몇가지 정보들의 기입이 필요하다.

이를 위해 먼저 필요한 정보들을 모아오자.

필요한 것들은 아래와 같다.

  • Open API 세팅으로 SecretKey, Client Id 얻어오기
  • Notion 의 tokenv2 얻어오기

OpenAPI 세팅

OpenAPI 에 들어가서 아래와 같이 세팅하여 앱 등록을 수행한다.

위처럼 세팅하고 등록하면 아래와 같이 앱아이디/키가 발급된 것을 볼 수 있는데 해당 정보를 config 세팅에 이용할 것이다.

Notion TokenV2

아까의 노션에 생성한 테이블 페이지로 돌아가서 (단, 웹이어야한다.) 개발자 툴(Ctrl+F12 혹은 우클릭>검사)을 실행하도록 하자.

상단 탭에서 Application 을 선택하고, 쿠키 메뉴에서 token_v2 를 찾아 복사한다.

이렇게 모은 값들로 config 를 채울 것이다.

Config 값 세팅

config.py 파일을 열어보면 아래와 같이 구성되어있다. 하나하나 세팅해보록 하자.

vi config.py
//결과
# config 파일 예시
cfg = dotdict(
    TISTORY=dotdict(
        ID='kakao email',
        PW='kakao password',
        BLOG_NAME='blog_name',
        SECRET_KEY='xxx',
        CLIENT_ID='xxx',
        REDIRECT_URI='https://blog_name.tistory.com',
    ),
    NOTION=dotdict(
        TOKEN_V2='xxx',
        TABLE_PAGE_URL='https://www.notion.so/xxx',
        DOWNLOAD_DIR='~/.n2t',
        CODE_BLOCK_THEME='atom-one-dark',

        COLUMN=dotdict(
            TITLE='제목',
            CATEGORY='카테고리',
            TAG='태그',
            STATUS='상태',
            URL='링크'
        ),

        POST=dotdict(
            UPLOAD_VALUE='발행 요청',
            MODIFY_VALUE='수정 요청',
            COMPLETE_VALUE='발행 완료',
        ),
    ),
    MAIL=dotdict(
        ID='',
        KEY='',
    )
)

//세팅 후 :wq! 를 잊지말자.

  • TISTORY
    • ID
      • Tistory 의 카카오 아이디 즉, 이메일 형태를 그대로 입력한다.
    • PW
      • 비밀번호를 그대로 입력한다.
    • BLOG_NAME
      • https://~~~~.tistory.com 에서 ~~~~에 해당하는 값을 넣어준다.
    • SECRET_KEY
      • OpenAPI 의 SecretKey 를 기입한다.
    • CLIENT_ID
      • OpenAPI 의 APP ID 를 기입한다.
    • REDIRECT_URI
      • OpenAPI 의 Callback URL 을 복사해온다.
  • NOTION
    • TOKEN_V2
      • Notion 쿠키에 있던 TokenV2 를 기입한다.
    • TABLE_PAGE_URL
      • 테이블 페이지의 url 을 기입한다.
    • DOWNLOAD_DIR
      • 선택 사항이므로 세팅하지 않아도 무관한다.
    • CODE_BLOCK_THEME
      • 선택 사항이므로 세팅하지 않아도 무관한다.
  • COLUMN
    • 템플릿을 그대로 복제하였다면 세팅하지 않아도 무관하다.
  • POST
    • 템플릿을 그대로 복제하였다면 세팅하지 않아도 무관하다.
    • 다만, 우리는 발행이 필요할 때 ‘발행 요청’ 이라는 태그를 사용해야한다.
  • MAIL
    • 발행 여부를 메일로 발송해주는데 선택 사항이므로 세팅하지 않아도 무관하지만, 없애버릴 경우 에러가 발생하므로 빈 값으로 놔두어야한다.

아래처럼 세팅이 되었다면 다음 단계로 넘어가자.

업로드 하기

고생 많았다! 이제 테이블에가서 변환하고자 하는 페이지를 아래처럼 추가하자.

  • 태그는 발행 요청을 넣어야한다.
  • 페이지를 넣은 후, Open 하여 우측처럼 내용이 들어가 있는지 확인하자.
    • 참고로, 링크로 들어가면 빈 포스팅이 들어가니 우측처럼 제목과 내용을 채우는 것을 잊지 말자!

이제, 아래 명령어로 main 을 실행시키도록 하자.

python3 main.py

아래처럼 진행 과정이 나오는데 tistory 에 로그인하고, Notion 을 html 로 변환 후, tistory 에 올리고 삭제하는 과정을 거친다.

이제 본인의 블로그에 가보면!

이렇게 뿅하고 들어와 있는 것을 볼 수 있다 (드디어!)

(미리보기 이미지는 후에 본인이 넣은 것이다. 현재 코드만으로는 별도 처리 없이는 넣기 어렵다.)

포스팅된 것은 아래와 같이 마크되어있는 것을 참고하자!

이제 노션에서 티스토리로 편리 포스팅을 즐기자 🧚🏻

참고 링크


Uploaded by N2T

반응형
Comments