본문 바로가기
카테고리 없음

tistory api 사용을 위한 access token 얻는 방법 (no browser only command line)

by DogBull 2018. 6. 18.

   예전에 아주 잠깐 Windows Live Writer 라는 것을 사용했던 적이 있다. 편리해서 사용했다기 보다는 티스토리 웹에서 글을 작성하는 것이 너무 힘들어서였다. 다른 블로그를 보면 글 내용 뿐만 아니라 편집(구성?? 이라고 해야하나.. 디자인??은 좀 좁은 의미 같고..)이 잘되어 있어 읽기도 편한데.. 웹에서 글을 작성해서 어려운건가.... 하는 생각으로 사용해 보았었다. 도구의 문제는 아니었던것 같다. 웹으로 하나 WLW 로 하나 마찬가지였다. 어쨌든 그 때 WLW 를 사용하기 위해서는 티스토리 블로그 관리자 페이지에서 뭔가 설정을 해 주어야 했었는데, 지금은 뭔가 바뀐 것 같다. 더욱이 공식 가이드(https://www.tistory.com/guide/api/index) 를 보니 access_token 이라는 것을 먼저 얻어온 후에야 뭔가 할 수 있는 것 같다.

   아래 제시된 코드는 공식적으로 지원되는 방법을 이용한 것이 아니다.  하지만 access_token 을 얻기 위한 꽤나 불편한 점이 있는것 같은데, 이를 회피하기 위한 것이다.

아이디(tistory_id), 비밀번호(tistory_pw), 클라이언트아이디(client_id), 콜백경로(redirect_uri) 등 4가지 정보가 필요하다. 아이디와 비밀번호는 기존 알고 있는 것을 사용하면 되고 클라이언트아이디와 콜백경로는 이곳(https://www.tistory.com/guide/api/manage/register) 에서 '클라이언트 등록' 이라는 것을 하면 얻을 수 있다.

   '클라이언트 등록' 페이지에서 입력되어야 하는 항목 중 'CallBack 경로' 는 여기서 제시하는 방법을 사용한다면 중요하지 않는 항목이므로 적당히 입력하면 된다. (예를들어 http://localhost 와 같이 입력)

import re

import requests


class Tistory:
    base_url = 'https://www.tistory.com'

    def __init__(self, tistory_id, tistory_pw, client_id, redirect_uri):
        self.access_token = None

        login_url = '{}/auth/login'.format(self.base_url)
        login_data = {
            'loginId': tistory_id,
            'password': tistory_pw,
            'redirectUrl': '{}/oauth/authorize?client_id={}&redirect_uri={}&response_type=token'.format(
                self.base_url,
                client_id,
                redirect_uri
            ),
        }

        try:
            requests.post(login_url, login_data)
        except Exception as e:
            match = re.match('(.*?)access_token=(?P<access_token>.*?)&state=', e.request.url)
            gd = match.groupdict()
            self.access_token = gd['access_token']


ts = Tistory(
    tistory_id='????',
    tistory_pw='????',
    client_id='????',
    redirect_uri='????',
)

print(ts.access_token)

4 가지의 정보 적절히 입력되면 access_token을 출력한다. 공식적인 방법이 아니므로 언제 막힐지 알 수 없다. 안정성이 필요한 곳에는 사용하면 안되겠다.