본문 바로가기

Programming/코딩 짤팁

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

반응형

※ 카카오 연동 로그인 변경 후 아래 방법 사용(세션 유지는 본 게시물 참조)

 

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

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

strangeronpaleblue.com

※ API Access Token 발급 방식이 변경되어 아래 게시글에 새로 작성하였습니다.

 

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

| 발급 프로세스 변경 Implicit 방식에서 Authentication Code 방식으로 얼마전 예전에 작성했던 "파이썬 로그인 세션 유지하기 & 티스토리 API Access token 자동 발급" 의 Access token 을 얻어오는 코드가 동작.

strangeronpaleblue.com

Session 유지의 필요성

오픈API의 Oauth 2.0 인증이나 기타 다른 프로그램을 만들다 보면 세션을 유지해야 하는 경우가 있다. 로그인 상태를 유지한다고 생각하면 이해가 쉽다. 특히 Oauth 인증은 API사용을 위한 ID, Key 값을 이용해서 다른 Token을 받아와야 하는 경우가 있기 때문에 세션유지를 해줘야 한다. 예전에는 그냥 로그인하고 Cookie 값을 가져다 코드에 박아 넣었지만 인증세션이 만료되면 Cookie 를 다시 확인해서 넣어줘야 되는 번거로움이 있다. 티스토리 API로 Oauth 인증방식을 사용하고 있어 세션 유지가 필요하다.

Session 유지 구현

먼저 requests 를 import 해준다. 파이썬 라이브러리에 requests가 없다면 pip -install requests 로 설치해 준다. 티스토리 API 사용을 위한 app_id와 secret_key도 선언해 준다. access_token을 파싱하기 위해 정규식 라이브러리도 추가해 준다.

import requests
import re

app_id = 'YOUR_APP_ID'
secret_key = 'YOUR_SECRET_KEY'

다음은 로그인 세션과 access_token 을 얻어오는데 필요한 URL / 파라메터들을 미리 설정해 준다.

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'}

세션을 생성하기 위해서는 requests.Session() 을 사용해주면 된다. 그리고 세션을 유지하며 사용하기 위해 with 문을 사용해 주고 로그인을 시도해준다.

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

로그인이 성공하면 access_token을 얻어오는 구문을 만들어 준다. 브라우저 개발자 도구로 확인했을 때  access_token은 response header의 location에 포함되어 리턴되므로 Redirects는 False로 설정해 주어야 다른 페이지로 이동하지 않고 제대로 된 Response Header를 얻을 수 있다. User-Agent 부분때문에 고생을 좀 했는데 티스토리 API는 웹브라우저로 접속하는 User-Agent 일떄만 로그인 세션을 성립해 주는 것 같다. 파이썬으로 하면 이부분이 Python 관련 User-Agent로 변경되어 세션이 제대로 만들어 지질 않으므로 Mozilla/5.0으로 변경해 준다. IE든 Chrome 이든 Safari 등 웹 브라우저에서 사용하는 User-Agent라면 원하는 대로 바꾸어도 상관없다.

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)

마지막으로 정규식을 써서 access_token 부분만 파싱해 준다.

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

위에 설명한 부분들을 Get_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'}

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

access_token = Get_Access_Token()
print(access_token)

참고문서

 

Implicit 방식 · GitBook

No results matching ""

tistory.github.io

 

반응형