본문 바로가기

Dev/Python

Python과 티스토리 API를 활용하여 글을 작성하기

일간으로 주식 분석 정보를 포스팅하려면 분석에서 포스팅의 과정중 어느정도는 자동화가 되어야 했다. (아니면 근성이 있던가.. )

분석 결과를 마크다운 포멧의 리포트로 나오게 하였고 이를 포스팅하는 것은 내 손으로 해왔는데, 이것도 3일정도 하니 꽤나 번거롭다.
KOSPI와 KOSDAQ을 뒤바꾸어 올리는 실수를 하기도 하고.. 그래서 자동화가 필요했다.

티스토리 API가 문서화가 잘 되어있기는 하지만 드문드문 안내하지 않는 내용도 있어서, 구글링도 해가며 코드를 만들었다.
코드에서 나오는 config는 직접 작성한 함수이므로 해당 부분은 따로 치환야 동작한다.

import requests
import re
from config.config import config

class PostingService:
  access_token = None

  def getAccessToken(self):
    oauth_url = "https://www.tistory.com/oauth/authorize"  # 인증 서버 접속용
    login_url = 'https://www.tistory.com/auth/login'  # 로그인 서버 접속용
    callback_url = config["TISTORY"]["COLLBACK_URL"]

    req_params = {
      'client_id': config["TISTORY"]["CLIENT_ID"],
      'redirect_uri': callback_url,
      'response_type': 'token'}

    login_info = {'loginId': config["TISTORY"]["LOGIN_ID"],
                  'password': config["TISTORY"]["PASSWORD"],
                  'redirectUri': callback_url}

    with requests.session() as s:
      response = s.post(login_url, data=login_info)

      if (response.status_code == 200):
        try:
          redirect = s.get(oauth_url, params=req_params)
        except requests.exceptions.ConnectionError as e:  
        # 내겐 리다이렉트할 콜백 URL이 없는 주소를 적었기에 에러가 발생한다.
          received = e.request.url
          p = re.compile("(?<=access_token=)\w+")
          m = p.search(received)
          access_token = m.group()
          self.access_token = access_token

  def createPost(self, title, content, category_name, tag):
    access_token = self.access_token
    blog_name = config["TISTORY"]["BLOG_NAME"]
    title = title  # 제목 (필수)
    content = content  # 글내용(필수)
    visibility = "0"  # 발행상태 0비공개-기본, 1보호, 3발행
    category_id = self.getCategoryId(category_name)  # 카테고리 아이디 기본값 0
    slogan = ""  # 문자주소
    tag = tag  # 태그 ,로 구분
    acceptComment = "1"  # 댓글 허용 (0, 1 - 기본값)
    password = ""  # 보호글 비밀번호

    url = f'https://www.tistory.com/apis/post/write?' \
          f'access_token={access_token}&' \
          f'output=json&' \
          f'blogName={blog_name}&' \
          f'title={title}&' \
          f'content={content}&' \
          f'visibility={visibility}&' \
          f'category={category_id}&' \
          f'slogan={slogan}&' \
          f'tag={tag}&' \
          f'acceptComment={acceptComment}&' \
          f'password={password}'
    r = requests.post(url)
    print(r.text)
    return r.text

  def getCategoryId(self, category_name):
    access_token = self.access_token
    blog_name = config["TISTORY"]["BLOG_NAME"]

    url = f'https://www.tistory.com/apis/category/list?access_token={access_token}&output=json&blogName={blog_name}'
    r = requests.get(url)
    categories = r.json()['tistory']['item']['categories']
    ret = None
    for category in categories:
      if category['name'] == category_name:
        ret = category['id']
        break

    return ret

  if __name__ == '__main__':
    self.getAccessToken()
    self.createPost(title, content, category_name, tag)

 개선된 코드가 새로 포스팅 되었다. 

https://woongbinni.tistory.com/entry/Python%EA%B3%BC-%ED%8B%B0%EC%8A%A4%ED%86%A0%EB%A6%AC-API%EB%A5%BC-%ED%99%9C%EC%9A%A9%ED%95%98%EC%97%AC-%EA%B8%80%EC%9D%84-%EC%9E%91%EC%84%B1%ED%95%98%EA%B8%B0-%EA%B0%9C%EC%84%A0%ED%8C%90

 

Python과 티스토리 API를 활용하여 글을 작성하기 - 개선판

https://woongbinni.tistory.com/entry/Python%EA%B3%BC-%ED%8B%B0%EC%8A%A4%ED%86%A0%EB%A6%AC-API%EB%A5%BC-%ED%99%9C%EC%9A%A9%ED%95%98%EC%97%AC-%EA%B8%80%EC%9D%84-%EC%9E%91%EC%84%B1%ED%95%98%EA%B8%B0?ca..

woongbinni.tistory.com