본문 바로가기

Programming/코딩 짤팁

티스토리 API Access token 자동 발급 받기 업데이트

반응형

※ 티스토리 자동 로그인 게시물 업데이트 내용 - Selenium 사용 (2022. 01. 06)

 

Selenium 으로 티스토리 자동 로그인

| Selenium 자동 로그인 구상 작년에 티스토리의 로그인 과정이 카카오계정을 사용하는 것으로 통합되었다. 통합 후 파이썬으로 개발하여 기존에 사용하던 자동로그인 코드가 더이상 유효하지 않

strangeronpaleblue.com

 

※ 아래 내용은 티스토리의 카카오계정 통합으로 인해 자동 로그인 사용이 불가능 해져 수동으로 발급 받아야 합니다. (2021. 4. 14)

| 발급 프로세스 변경 Implicit 방식에서 Authentication Code 방식으로

얼마전 예전에 작성했던 "파이썬 로그인 세션 유지하기 & 티스토리 API Access token 자동 발급" 의 Access token 을 얻어오는 코드가 동작하지 않는다는 제보를 받아 코드 업데이트를 진행하였다. 글을 썼던 6월만 해도 Redirect URI 안에 Access Token 값이 들어가 있었는데 분석결과 뭔가 사용자 동작들이 추가 된 것을 확인 할 수 있었다.

 

파이썬 로그인 세션 유지하기 & 티스토리 API Access token 자동 발급

Session 유지의 필요성 오픈API의 Oauth 2.0 인증이나 기타 다른 프로그램을 만들다 보면 세션을 유지해야 하는 경우가 있다. 로그인 상태를 유지한다고 생각하면 이해가 쉽다. 특히 Oauth 인증은 API사�

garnetiger.com

티스토리 API가이드의 Authorization Code 부문을 보면 "인증 요청 및 Authentication code 발급" / "리디렉션 처리" / "Access Token 발급" 의 세단계로 나뉘어져 있는것을 알 수 있다. 예전에는 Implicit 방식으로 Access Token 페이지로 바로 이동했다면 해당 방법은 없어지고 "리디렉션 처리" 부분에서 Code 값이 추가되어, 이 Code 값으로 다시 Access Token 값을 발급받는 페이지로 이동하도록 바뀐 것을 알 수 있었다. 실제 URL을 확인하여 접속해보면 Authentication code를 확인하는 허가하기 버튼을 누르는 페이지를 확인이 되었다. 어차피 허가하기를 클릭하는 부분도 결국 링크이동이기 떄문에 소스보기를 통해 code 값이 존재하는 부분을 찾을 수 있었다.

| 코드수정

기존의 코드는 아래와 같다. implicit 방식이기 떄문에 auth_res 이후 헤더값에 있던 Accee Token 값을 바로 정규식로 매칭하여 읽어오는 것을 확인 할 수 있다.

def Get_Access_Token():
    with requests.Session() as s:
        res = s.post(login_url, data=login_info)

        if(res.status_code == 200):
            headers = {'User-Agent' : 'Mozilla/5.0'}
            auth_res = s.get(auth_url, params=params, headers=headers, allow_redirects=False)
            redirect_location = auth_res.headers['location']
            print(redirect_location)

            match = re.match('(.*?)access_token=(?P<access_token>.*?)&state=', redirect_location)
            access_token = match.groupdict()['access_token']
            return access_token

 

따라서 추출 부분을 수정해야 한다. 앞에서 소스코드에 리다이렉션에 필요한 Code 값이 있음을 확인했기 떄문에 auth_res.headers 를 참조하는 것이 아닌 auth_res.content 값을 참조하여 code 값을 가져올 것이다. 그리고 나서 API 가이드에 있는대로 다시 Access token 요청을 하도록 한다. 그리고 한번더 Response 값의 Content 에서 Access Token 값을 추출하도록 코드를 수정했다. 토큰을 요청하는 URL은 코드 제일 윗부분에 추가해 준다.

token_url = 'https://www.tistory.com/oauth/access_token'

def Get_Access_Token():

    with requests.Session() as s:
        res = s.post(login_url, data=login_info)

        if(res.status_code == 200):
            headers = {'User-Agent' : 'Mozilla/5.0'}
            auth_res = s.get(auth_url, params=params, headers=headers, allow_redirects=False)
            redirect_location = auth_res.content

            match = re.match('(.*?)code=(?P<access_token>.*?)&state=', str(redirect_location))
            code = match.groupdict()['access_token']

            params_token = {'client_id': app_id, 'client_secret' : secret_key, 'code' : code, 'redirect_uri': 'YOUR_API_ADDRESS', 'grant_type': 'authorization_code'}

            token_res = s.get(token_url, params=params_token, headers=headers)

            access_token = str(token_res.content)
            access_token = access_token.lstrip("b'access_token=")
            access_token = access_token.rstrip("'")

            return access_token

 

로그인 과정까지 포함된 전체 코드는 아래와 같다.

import requests
import re

app_id = 'YOUR_APP_ID'
secret_key = 'YOUR_SECRET_KEY'

auth_url = 'https://www.tistory.com/oauth/authorize'
params = {'client_id' : app_id, 'redirect_uri' : 'YOUR_API_ADDRESS', 'response_type' : 'token'}

login_url = 'https://www.tistory.com/auth/login'
login_info = {'redirectUrl' : 'https://www.tistory.com', 'loginId' : 'YOUR_LOGIN_ID', 'password' : 'YOUR_LOGIN_PASSWORD'}

token_url = 'https://www.tistory.com/oauth/access_token'

def Get_Access_Token():

    with requests.Session() as s:
        res = s.post(login_url, data=login_info)

        if(res.status_code == 200):
            headers = {'User-Agent' : 'Mozilla/5.0'}
            auth_res = s.get(auth_url, params=params, headers=headers, allow_redirects=False)
            redirect_location = auth_res.content

            match = re.match('(.*?)code=(?P<access_token>.*?)&state=', str(redirect_location))
            code = match.groupdict()['access_token']

            params_token = {'client_id': app_id, 'client_secret' : secret_key, 'code' : code, 'redirect_uri': 'YOUR_API_ADDRESS', 'grant_type': 'authorization_code'}

            token_res = s.get(token_url, params=params_token, headers=headers)

            access_token = str(token_res.content)
            access_token = access_token.lstrip("b'access_token=")
            access_token = access_token.rstrip("'")

            return access_token

access_token = Get_Access_Token()
print(access_token)

 

 

Authorization Code 방식 · GitBook

No results matching ""

tistory.github.io

 

반응형