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

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

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

아래 제시된 코드는 공식적으로 지원되는 방법을 이용한 것이 아니다. 하지만 access_token을 얻기 위한 꽤나 불편한 점이 있는데 이를 회피하기 위한 것이다. 아이디(tistory_id), 비밀번호(tistory_pw), 클라이언트아이디(client_id), 콜백경로(redirect_uri) 등 4가지 정보가 필요하다. 아이디와 비밀번호는 기존 알고 있는 것을 사용하면 되고 클라이언트아이디와 콜백경로는 이곳에서 클라이언트 등록 이라는 것을 하면 얻을 수 있다. 클라이언트 등록 페이지에서 입력되어야 하는 항목 중 CallBack 경로는 여기서 제시하는 방법을 사용한다면 중요하지 않는 항목이므로 적당히 입력하면 된다(예를들어 http://localhost 와 같이 입력).

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
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을 출력한다. 공식적인 방법이 아니므로 언제 막힐지 알 수 없다. 안정성이 필요한 곳에는 사용하면 안되겠다.