API/Tistory

[Tistory API] 글 목록, 카테고리 목록 가져오기 및 글 작성하기 (python)

hzoooo 2021. 10. 8. 13:49

공모주 청약, 상장 정보를 상세하게 블로그에 작성한 후, 해당 글 정보를 가져오기 위해 위 3가지 API 기능을 이용하였다.

결과적으로, 글 작성 이후 response로 글 정보가 return 되므로 글 목록을 받아오는 API는 사용할 필요 없어졌지만,

그래도 찾아본 겸 묶어서 올리려고 한다.

아래 내용들에서 get_access_token() 으로 액세스 토큰을 가져오는 과정은, 아래 글에서 확인할 수 있다.

 

[Tistory API] 셀레니움, 정규표현식을 사용하여 티스토리 Access Token 발급하기(python)

사이드 프로젝트 : 공모주 알리미의 카카오톡 어플리케이션 사이트 도메인을 티스토리로 구성하기 위해, 티스토리 API를 활용하게 되었다. 아침부터 많은 구글링을 하며 삽질해서, python 코드로

hzoo.tistory.com

 

0. 참고 링크

 

1. 글 목록 가져오기

더보기

Tistory GitBook : 글목록

 

글 목록 · GitBook

No results matching ""

tistory.github.io

[사진 1] 글 목록 API Request

 

GET 방법으로 요청을 보내서, 아래와 같은 결과 값들을 받을 수 있다.

[사진 2] 글 목록 API Response

 

처음 생각은 새 글을 작성하게 되면 최상단 페이지 첫 번째 글이 생성되기 때문에,

posts/title, posts/postUrl를 가져와서 정보 전달 메시지에 상세 페이지로 남겨주려고 하였다.

(하지만, 글 작성 후 response 값으로 받을 수 있었다.)

 

코드는 아래와 같다.

def get_post_list():
    access_token = get_access_token() #액세스 토큰
    url = 'https://www.tistory.com/apis/post/list'
    params = {
        'access_token': access_token,
        'output': 'json',
        'blogName': 'hzoo',
        'page': 1
    }

    response = requests.get(url, params=params)
    json_data = response.json()

    with open('json/tistory_post_list.json', 'w') as json_file:
        json.dump(json_data, json_file)

    recent_post_title = json_data['tistory']['item']['posts'][0]['title']
    recent_post_url = json_data['tistory']['item']['posts'][0]['postUrl']

[사진 2] 오른쪽 사진을 보면, tistory -> item -> posts -> title, postUrl로 원하는 항목을 가져올 수 있다.

 

2. 카테고리 목록 가져오기

더보기

Tistory GitBook : 카테고리

 

카테고리 · GitBook

No results matching ""

tistory.github.io

[사진 3] 카테고리 목록 API Request

 

카테고리 목록 역시 GET 방법으로 요청을 보내서, 아래와 같은 결과 값들을 받을 수 있다.

[사진 4] 카테고리 목록 API Response

 

'tistory' -> 'item' -> 'categories' -> 'label'에서 카테고리 이름을 얻을 수 있다.

나는 글 작성에 필요한 카테고리 id를 얻기 위해 카테고리 목록 API를 사용하였다.

즉, 'tistory' -> 'item' -> 'categories' -> 'id'를 얻으면 된다.

 

코드는 아래와 같다.

def get_category_id():
    try:
        with open('json/tistory_category.json', 'r') as f:
            category_dic = json.load(f)

            return category_dic

    except:
        access_token = get_access_token()

        url = 'https://www.tistory.com/apis/category/list'
        params = {
            'access_token': access_token,
            'output': 'json',
            'blogName': 'hzoo',
        }

        response = requests.get(url, params=params)
        json_data = response.json()

        category_dic = {}
        category_dic_list = json_data['tistory']['item']['categories']

        for i, category in enumerate(category_dic_list):
            if '공모주 알리미' in category['label']:
                if category['label'] == '공모주 알리미/상장 정보':
                    category_dic['IPO'] = category['id']
                elif category['label'] == '공모주 알리미/청약 정보':
                    category_dic['BID'] = category['id']

        with open('json/tistory_category.json', 'w') as json_file:
            json.dump(category_dic, json_file)

        return category_dic

 

category id는 변하지 않기 때문에, 한번 실행하여 json 파일로 write한 후 재사용하기 위해 json 파일로 저장하였다.

 

3. 글 작성하기

더보기

Tistory GitBook : 글 작성

 

글 작성 · GitBook

No results matching ""

tistory.github.io

[사진 5] 글 작성 API Request

 

글 작성은 POST 방법으로 요청을 보내며, 아래와 같은 값들을 전달해서 글 작성을 위한 요청을 보낸다.

 

사진 5에서 보이듯이,

글 제목은 'title'에 전달하고, 글 제목은 'content'에 전달하면 된다.

 

visibility는 글을 비공개/보호/공개 글로 발행할 수 있는데,

int형으로 전달하면 안되며 '0', '1', '3'과 같이 전달해야 한다.

추가적으로, 글을 원하는 포맷에 맞게 계속 쓰다 보니 여러 개의 글을 썼었는데 하루에 30개의 공개글만 작성할 수 있다

(즉, 공개글을 더 쓰고 싶다면 비공개글이나 보호 글을 작성한 후 다음날 공개글로 전환해야 된다)

따라서, 테스트용 글쓰기는 visibility type을 '0'이나 '1'로 해서 공개글 30회 작성 제한을 피하도록 하자.

 

category에는 카테고리 아이디를 전달해야 하며, tag는 사진과 같이 ', '(콤마)로 구분한다고 한다.

 

요청 결과로, 아래와 같은 응답을 받을 수 있다.

[사진 6] 글 작성 API Response

 

응답 결과로 status code, 작성된 글 ID, 작성된 글의 url을 얻을 수 있다

(글은 내 블로그 주소 : hzoo.tistory.com + / 작성된 글 ID 로 구성된다.)

 

코드는 아래와 같다.

def write_new_post(ipo_data_list, target_date):
    access_token = get_access_token()
    url = 'https://www.tistory.com/apis/post/write'

    param_list = []
    if len(ipo_data_list) > 2:
        if len(ipo_data_list[0]) + len(ipo_data_list[1]) + len(ipo_data_list[2]) == 0:
            return
        else:
            param_list = get_bid_parameter(ipo_data_list, target_date)
    else:
        if len(ipo_data_list[0]) + len(ipo_data_list[1]) == 0:
            return
        else:
            param_list = get_ipo_parameter(ipo_data_list, target_date)

    contents = param_list.pop()
    tag = param_list.pop()
    category = param_list.pop()
    title = param_list.pop()

    data = {
        'access_token': access_token,
        'output': 'json',
        'blogName': 'hzoo',
        'title': title,
        'content': contents,
        'visibility': '3',
        'category': category,
        'tag': tag,
        'acceptComment': AcceptCommentStatus.ALLOWANCE
    }

    response = requests.post(url, data=data)
    new_post_json = response.json()
    new_post_id = new_post_json['tistory']['postId']

    return new_post_id

 

글 작성 이후, 카카오톡/텔레그램 메세지 내 블로그 링크 제공을 위하여 id를 리턴하게 함수를 구성하였다.

contents, tag, category, title을 get_bid/ipo_parameter를 통해 받아온다.

이러한 결과로 얻은 글들은

공모주 알리미/상장 정보청약 정보 글들에서 볼 수 있다.

상세 내용은 공모주 알리미 만들기 카테고리에서 다루려고 한다.(작성 시 취소선을 긋고, 링크를 걸 예정)

 

※회고

- 액세스 토큰 발급에 약간의 차질이 있었지만, 글 작성하는 과정은 어렵지 않았으며 글이 실제로 작성되는 게 신기했다.

- 상세 정보 전달을 위해, 사진도 자동생성 하여 첨부하려 예정 중이며, 해야 된다. 파일 첨부 API도 사용해야 될 것 같은 느낌이 든다.