티스토리(tistory)
Photo of author

[티스토리 자동 블로그 만들기 3편] Python(파이썬)  티스토리 자동화 글쓰기

티스토리 자동 블로그 만들기 3편 Python(파이썬)  티스토리 자동화 글쓰기에 대해 설명하겠습니다. 티스토리 블로그가 개설 되어 있고 티스토리 API KEY가 발급되어 있어야 합니다. 되어 있지 않다면 [티스토리 자동 블로그 만들기 1편] 티스토리 블로그 만들기[티스토리 자동 블로그 만들기 2편] 티스토리 API 코드 발급를 먼저 진행 하시길 바랍니다. 또한 Python(파이썬)으로 자동화를 구축할 것이기 때문에 파이썬 환경이 구축되지 않으신 분들은 파이썬(Python) 설치 및 개발환경세팅 – Visual Studio Code(VSC) 여기 들어가시어 환경세팅 하시길 바랍니다.

 

[티스토리 자동 블로그 만들기 3편] Python(파이썬)  티스토리 자동화 글쓰기

 

Python(파이썬) 티스토리 자동화 글쓰기

 

제가 티스토리 블로그를 시작한 것은 Python(파이썬)으로 티스토리 블로그 자동화를 하기 위해서 시작 하였습니다. 파이썬으로 프로그래밍을 하기에 앞서 티스토리 API를 먼저 확인을 해야 글을 쓸 수 있겠죠? 티스토리 Open API에서 사용 할 API를 설명하겠습니다. API에 대한 모든 내용을 확인하고 싶으신 분들은 티스토리 API 공식사이트에서 확인이 가능합니다. 저는 제가 사용할 API만 설명 하도록 하겠습니다.

 

티스토리 API

 

카테고리 목록 API

 

자신의 블로그 정보를 가져오는 API 입니다. 자신의 글을 어디에 올릴지 알아야 하기 때문에 필요한 API입니다.

API 호출 방식

GET https://www.tistory.com/apis/category/list?
  access_token={access-token}
  &output={output-type}
  &blogName={blog-name}

호출 parameter 정보

access_token : 티스토리에서 발급한 ACCESS TOKEN
output : 응답 타입
blogName : 자신의 블로그 주소 또는 블로그 이름

호출 예시

GET https://tistory.com/apis/category/list?
  access_token=발급받은 ACESS TOKEN
  &output=json
  &blogName=자신의 블로그 주소 또는 블로그 이름

응답 정보

id : 카테고리 ID
name : 카테고리 이름
parent : 부모 카테고리 ID
label : 부모 카테고리를 포함한 전체 이름 (‘/’로 구분)
entries : 카테고리내 글 수

응답 예시

{
  "tistory":{
    "status":"200",
    "item":{
      "url":"https://orectickangji.com",
      "secondaryUrl":"",
      "categories":[
        {
          "id":"1172574",
          "name":"증권",
          "parent":"",
          "label":"증권",
          "entries": "61",
          "entriesInLogin": "61"
        },
        {
          "id":"1173905",
          "name":"청약",
          "parent":"1173904",
          "label":"부동산/청약",
          "entries": "5",
          "entriesInLogin": "5"
        },
        ...
      ]
    }
  }
}

 

글 작성 API

 

API 호출 방식

POST https://www.tistory.com/apis/post/write?
access_token={access-token}
&output={output-type}
&blogName={blog-name}
&title={title}
&content={content}
&visibility={visibility}
&category={category-id}
&published={published}
&slogan={slogan}
&tag={tag}
&acceptComment={acceptComment}
&password={password}

호출 parameter 정보

blogName : 자신의 블로그 주소 또는 블로그 이름(필수)
title : 포스팅 글의 제목(필수)
content : 포스팅 글의 내용
visibility : 발행상태 (0: 비공개 – 기본값, 1: 보호, 3: 발행)
category : 카테고리 id (기본값: 0)
published : 발행시간 (TIMESTAMP 이며 미래의 시간을 넣을 경우 예약. 기본값: 현재시간)(필수아님)
slogan : 문자 주소(필수아님)
tag : 태그 (‘,’ 로 구분)
acceptComment : 댓글 허용 (0, 1 – 기본값)
password : 보호글 비밀번호(필수아님)

호출 예시

POST https://www.tistory.com/apis/post/write

{ 
    "access_token" : "발급받은 ACESS TOKEN",
    "output" : "json",
    "blogName" : "자신의 블로그 주소",
    "title" : "포스팅 글 제목",
    "content" : "포스팅 글 내용",
    "visibility" : "3",
    "category" : "1174208",
    "tag" : "경제, 증권, 주가, 공시, 정보, 공모주, 청약",
    "acceptComment" : "1"
}

 

응답 정보

postId : 글 번호
url : 발행 주소

응답 예시

{
  "tistory":{
    "status":"200",
    "postId":"74",
    "url":"https://orectickangji.com/74"
  }
}

 

파일 첨부 API

 

API 호출 방식

POST https://www.tistory.com/apis/post/attach?
access_token={access-token}
&blogName={blog-name}
&targetUrl={blog-name}
&output={ouput-type}
[uploadfile]

호출 parameter 정보

access_token : 발급받은 Access Token
blogName : 자신의 블로그 주소 또는 블로그 이름
targetUrl : 자신의 블로그 주소 또는 블로그 이름
output : output type
uploadedfile : 업로드할 파일 (multipart/form-data)

호출 예시

POST https://www.tistory.com/apis/post/attach

{
    "access_token" : "발급받은 ACESS TOKEN",
    "blogName" : "자신의 블로그 주소",
    "targetUrl" : "자신의 블로그 주소",
    "output" : "json",
    "uploadfile" : "./img/test.png"
}

응답 정보

url : 업로드한 파일의 url
replacer : 업로드한 파일의 치환자

응답 예시

{
  "tistory":{
    "status":"200",
    "url":"http://orectic-kj.tistory.com/image/1328CE504DB79F5932B13F",
    "replacer":"%5b%23%23_1N%7ccfile6.uf%401328CE504DB79F5932B13F%7cwidth%3d\"500\"+height%3d\"300\"%7c_%23%23%5d"
  }
}

 

Python 글쓰기

카테고리 호출 하는 API

 

카테고리 정보를 얻는 코드입니다.

def getCategoryID():
    url = "https://www.tistory.com/apis/category/list?"
    output = "json"
    blogName = "orectic-kj"

    data = url
    data += "access_token=" + TISTORY_ACCESS_TOKEN + "&"
    data += "output=" + output + "&"
    data += "blogName=" + blogName

    print(data)
    return requests.get(data)

코드를 사용하지 않고 원하는 카테고리만 찾고 싶다면 postman과 같은 프로그램으로 호출해보면 확인 할 수 있습니다.

 

파일첨부 API

 

파일 첨부하는 코드입니다.

def fileupload(path):
    
    files = {'uploadedfile': open(path, 'rb')}
    params = {'access_token': TISTORY_ACCESS_TOKEN , 'blogName': 'orectic-kj', 'targetUrl':'orectic-kj', 'output':'json'}
    rd = requests.post('https://www.tistory.com/apis/post/attach', params=params, files=files)
    try:
        item = json.loads(rd.text)
        print(f'{item}')
    except:
        print("fail")
    return item["tistory"]["replacer"]

 

글쓰기 API

 

글 포스팅하는 코드입니다.

def post_tistory():
     tistory_url = 'https://www.tistory.com/apis/post/write?'

     title, content = test_post()

     data = {
           'access_token': TISTORY_ACCESS_TOKEN,
           'output': '{output-type}',
           'blogName': 'orectic-kj',
           'title': title,
           'content': content,
           'visibility': '3',
           'category': '1172680',
           'tag': '경제, 증권, 주가, 증시',
           'acceptComment': '1'
     }
     result = requests.post(tistory_url, data=data)

 

아래는 실제 실행하는 전체 Python 코드입니다. 필요하신 분은 복사해서 사용하시면 됩니다. import로 구성되어 있는 것들은 아래 명령어들 처럼 모두 패키지 설치를 진행해 주어야 합니다.

pip install requests

pip install os

아래 코드의 TISTORTY_ACCESS_TOKEN 부분을 로컬에서 진행할 때는 자신이 발급받은 코드를 아래와 같이 하드코딩하거나

TISTORY_ACCESS_TOKEN = “발급받은 AccesToken 값”
또는 아래와 같이 로컬PC에 환경변수를 등록해 주어서 사용해도 됩니다.
윈도우 >

 

import requests
import os
from bs4 import BeautifulSoup
from pytz import timezone
from datetime import datetime
import datetime
import json

today = datetime.datetime.now(timezone('Asia/Seoul'))
date1 = today.strftime('%Y-%m-%d')
date2 = today.strftime('%Y년 %m월 %d일'.encode('unicode-escape').decode()).encode().decode('unicode-escape')

TISTORY_ACCESS_TOKEN = "2dc2cde2ebac33e81a9c05e295cc42a3_d554cf89a364ebbe7bc64493aff9dce2"


def getCategoryID():
    url = "https://www.tistory.com/apis/category/list?"
    output = "json"
    blogName = "orectic-kj"

    data = url
    data += "access_token=" + TISTORY_ACCESS_TOKEN + "&"
    data += "output=" + output + "&"
    data += "blogName=" + blogName

    print(data)
    return requests.get(data)

def fileupload(path):
    
    files = {'uploadedfile': open(path, 'rb')}
    params = {'access_token': TISTORY_ACCESS_TOKEN , 'blogName': 'orectic-kj', 'targetUrl':'orectic-kj', 'output':'json'}
    rd = requests.post('https://www.tistory.com/apis/post/attach', params=params, files=files)
    try:
        item = json.loads(rd.text)
        print(f'{item}')
    except:
        print("fail")
    return item["tistory"]["replacer"]
      
def test_post():

    stock_img = './img/test.png'

    title = date1 + "글 포스팅"

    # 시간대 설정
    timezone2 = timezone('Asia/Seoul')
    
    content = f'''

    <p>{fileupload(stock_img)}<p>
    <br><br>
    <p> 포스팅 테스트 </p>    
    <br><br>
    '''

    return title, content

def post_tistory():
     tistory_url = 'https://www.tistory.com/apis/post/write?'

     title, content = test_post()

     data = {
           'access_token': TISTORY_ACCESS_TOKEN,
           'output': '{output-type}',
           'blogName': 'orectic-kj',
           'title': title,
           'content': content,
           'visibility': '3',
           'category': '1172680',
           'tag': '경제, 증권, 주가, 증시',
           'acceptComment': '1'
     }
     result = requests.post(tistory_url, data=data)
     result = BeautifulSoup(result.text)
     print(result.prettify())

post_tistory()

실제로 코드를 실행 보면 포스팅이 정상적으로 되는 것을 확인 할 수 있습니다.

 

이제 작성한 Python(파이썬)코드를 자신의 GitHub에 Commit  및 Push를 진행합니다. 그리고 포스팅하는 python파일을 workflow에 스케줄로 등록하면 스케줄에 의해 자동으로 포스팅 됩니다. GitHub 자동화 스케줄은 GitHub Action 스케쥴링, Secrets and Variables 활용하기 여기에 들어가시면 진행하는 방법을 알 수 있습니다. 감사합니다.

Leave a Comment