Tistory 연동을 진행하며 여기저기서 자료를 찾아봤는데,
검색해서 나온 것 중 정상적으로 동작하는 코드가 없어 삽질 후 연동한 방법을 정리해보았다.
우선 Tistory는 글 목록, 읽기, 쓰기, 수정을 위한 API를 제공해준다.
API는 아래 URL을 통해 스펙을 확인할 수 있다.
인증
Tistory API활용을 위한 인증 프로세스는 다음 처럼 구현하였다.
- login session 만들기
- oauth authorize을 통한 access code 확인
- access token 만들기
1. login session 만들기
import requests
account_id = 'TISTORY ID'
account_pw = 'TISTORY PWD'
callback_url = "http://datasciense4u.tistory.com/"
fp_value = 'Tistory로그인 페이지에서 제공하는 임의의 값'
login_url = 'https://www.tistory.com/auth/login'
headers = { 'User-Agent' : 'Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; rv:11.0) like Gecko' }
login_param = { 'loginId':account_id, 'password':account_pw, 'redirectUri':callback_url, 'fp':fp_value}
requests.post(login_url, headers=headers, data=login_param)
2-1. oauth authorize
import requests
appid = 'application id'
callback_url = "http://datasciense4u.tistory.com/"
oauth_url = 'https://www.tistory.com/oauth/authorize?client_id={0}&redirect_uri={1}&response_type=code&state={2}'.format(appid, callback_url, '')
res = requests.get(oauth_url)
2-2. response로부터 access code 추출
from bs4 import BeautifulSoup
soup2 = BeautifulSoup(res.text, 'html.parser')
candidates = soup2.findAll("script")
p = re.compile("(?<=\?code=)[a-zA-Z:/0-9?=]*")
m = p.search(str(candidates[0]))
code = m.group()
print(code)
3. Access Token 만들기
import requests
appid = 'application id'
seckey = 'Secret key'
callback_url = "http://datasciense4u.tistory.com/"
code = 'response에서 추출한 access code'
token_url="https://www.tistory.com/oauth/access_token?client_id={0}&client_secret={1}&redirect_uri={2}&code={3}&grant_type=authorization_code".format(appid,seckey,callback_url,code)
res = requests.get(token_url)
access_token = res.text.split("=")[1]
print(access_token)
글쓰기
글쓰기는 정의된 API만 호출하면 된다.
import requests
url_post = "https://www.tistory.com/apis/post/write"
blog_name = "blog 명"
visibility = 3;
category = 카테고리id;
tag = '태그1,태그2'
acceptComment = 1
headers = {'Content-Type': 'application/json; charset=utf-8'}
params = {
'access_token': access_token,
'output': 'json',
'blogName': blog_name,
'title': title,
'content': content,
'visibility': visibility,
'category': category,
'published':'',
'slogan':'',
'tag': tag,
'acceptComment': acceptComment,
'password':''
}
data = json.dumps(params)
rw = requests.post(url_post, headers=headers, data=data)
if rw.status_code == 200:
print('ok')
else:
print('fail')
삽질한 것에 비해 코드는 길지 않다.