Data Science and Data Proicessing

Tistory 연동을 진행하며 여기저기서 자료를 찾아봤는데,

검색해서 나온 것 중 정상적으로 동작하는 코드가 없어 삽질 후 연동한 방법을 정리해보았다.

 

우선 Tistory는 글 목록, 읽기, 쓰기, 수정을 위한 API를 제공해준다.

API는 아래 URL을 통해 스펙을 확인할 수 있다.

 

인증

Tistory API활용을 위한 인증 프로세스는 다음 처럼 구현하였다.

  1. login session 만들기
  2. oauth authorize을 통한 access code 확인
  3. 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')

 

삽질한 것에 비해 코드는 길지 않다.

+ Recent posts