coding

[블로그 자동포스팅 총정리] API에서 코드 자동 실행까지

codlingual 2021. 12. 30. 17:27
반응형

이 블로그의 paper-of-the-day 카테고리는 자동 포스팅되고 있다. 아쉽게도 썸네일을 자동으로 설정하는 방법은 없는 거 같아서 썸네일은 수동으로 지정해주었지만! 글은 완전 자동이다.

자동 포스팅 방법을 공유한다 ~~ 

 

 

목차

1. 티스토리 블로그 API 등록

2. 자동 포스팅을 위한 파이썬 코드 

3. 파이썬 코드 자동 실행 

 

1. 티스토리 블로그 API 등록

https://www.tistory.com/guide/api/manage/register

 

TISTORY

나를 표현하는 블로그를 만들어보세요.

www.tistory.com

 

1. 1. [앱 등록] 탭에서 다음을 입력해 API를 등록한다 

서비스명: 블로그 이름

서비스 URL: 블로그 주소 

CallBack: 블로그 주소 

이외에 서비스 형태는 '웹서비스'에 체크, 서비스 권한은 '읽기.쓰기'에 체크되어 있는데 그대로 사용하면 된다. 

 

1.2.  [앱 관리] 탭에서 설정 부분을 누르면 App ID와 Secret Key를 확인할 수 있다

 

1.3. code를 알아낸다 

www.tistory.com/oauth/authorize?client_id={여기에 본인 App ID를 입력하세요}&redirect_uri={여기에에 본인 블로그 주소를 입력하세요}&response_type=code&state={state-param}

본인 정보에 맞게 위의 주소를 변경하고 접속한다 (그냥 구글 주소창에 치면 됨!)

 

그럼 이런 창이 뜨는데 허가하기 눌러주면 됨 

허가하기 누르면 본인 블로그로 보내진다. 이때 그 상태에서 주소창의 주소를 복붙해오자. 

https://codlingual.tistory.com/?code={여기에 뭐라뭐라 써있는데 이걸 복사해놓자!}&state={state-param}

이렇게 얻은 코드로 access token을 얻어야 한다. 

토큰은 파이썬으로 얻자..

 

1.4. 파이썬으로 Acess Token 알아낸다

import requests 
client_id = [본인의 App ID를 " "로 감싸서 적으세요] 
seckey = [본인의 Secret Key를 " "로 감싸서 적으세요)]
callback_url = [본인의 블로그 주소를 " "로 감싸서 적으세요]
# 등록시 입력 값 
code = [아까 얻은 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(client_id, seckey, callback_url, code) 
res = requests.get(token_url) 
access_token = res.text.split("=")[1] 
print(access_token) # 프린트 되는 값이 Acess Token !!

위의 파이썬 코드를 실행하면 access token 얻기까지 완료!!

 

2. 자동 포스팅을 위한 파이썬 코드 

import requests 
import json 
import os
import sys
import urllib.request
from bs4 import BeautifulSoup
import random
from datetime import datetime


client_id = [파파고 API Client ID 값]
client_secret = [파파고 API Client Secret 값]

# 크롤링할 사이트 
url = 'https://arxiv.org/list/cs.CL/recent'

url_post = "https://www.tistory.com/apis/post/write" 
access_token = [내 블로그의 ACCESS TOKEN] 
blog_name = "codlingual.tistory.com" # 내 블로그 주소 

# 오늘 등록된 페이퍼 중 랜덤하게 3개 골라 해당 페이퍼 주소 반환하기 
def get_url_of_the_day():
    papers = []
    response = requests.get(url)
    html = response.text
    soup = BeautifulSoup(html, 'html.parser')
    for a in soup.find_all('a', href=True):
        if a['href'].startswith('/abs/'):
            papers.append('https://arxiv.org{}'.format(a['href']))
    return random.choices(papers, k=3)

# 각 페이퍼 주소에서 그 페이퍼의 제목, 초록, 초록의 한국어 번역본 반환 
def extract_content(url):
    response = requests.get(url)
    html = response.text
    soup = BeautifulSoup(html, 'html.parser')
    
    title = soup.select_one('#abs > h1').text.replace('Title:', '')
    abstract = soup.select_one('#abs > blockquote').text.replace('Abstract: ', '')
    translation = translate(abstract)
    return title, abstract, translation
    
# 영어 텍스트 한국어로 번역하기 (파파고 API 사용 )
def translate(eng_abs):
    try:
        text = urllib.parse.quote(eng_abs)
        data = "source=en&target=ko&text=" + text
        url = "https://openapi.naver.com/v1/papago/n2mt"
        request = urllib.request.Request(url)
        request.add_header("X-Naver-Client-Id",client_id)
        request.add_header("X-Naver-Client-Secret",client_secret)
        response = urllib.request.urlopen(request, data=data.encode("utf-8"))
        rescode = response.getcode()
        if(rescode==200):
            response_body = response.read()
            res = response_body.decode('utf-8')
            res = json.loads(res)
            result = res['message']['result']['translatedText']
            return result
    except:
        return ''

# 글 쓰기 
def write_post():
    
    post = ''
    titles = []
    abstracts = []
    translations = []

    urls = get_url_of_the_day()
    for url in urls:
        title, abstract, translation = extract_content(url)
        titles.append(title)
        abstracts.append(abstract)
        translations.append(translation)
    
    
    for ti, ab, tr in zip(titles, abstracts, translations):
        post += "<h3 data-ke-size='size23'><b><span style='font-family: 'Noto Sans Demilight', 'Noto Sans KR';'>{}</span></b><span style='font-family: 'Noto Sans Demilight', 'Noto Sans KR';'></span></h3>".format(ti)
        post += "<p data-ke-size='size18'>&nbsp;</p>"
        post += "<p data-ke-size='size18'><span style='font-family: 'Noto Sans Demilight', 'Noto Sans KR';'>{}</span></p>".format(ab)
        post += "<p data-ke-size='size18'>&nbsp;</p>"
        post += "<p data-ke-size='size18'><span style='font-family: 'Noto Sans Demilight', 'Noto Sans KR';'>{}&nbsp;</span></p>".format(tr)
        post += "<p data-ke-size='size18'>&nbsp;</p>"
        post += "<p data-ke-size='size18'>&nbsp;</p>"
    
    html_file = open('./post.html', 'w+')
    html_file.write(post)
    html_file.close()


if __name__ == '__main__':
	
    # 글 제목 
    title = '[{}] 오늘의 자연어처리'.format(datetime.today().strftime('%Y-%m-%d')) 

    write_post()
    f = open('./post.html', 'rt', encoding='utf-8')
    # 글 내용 
    content = f.read()

    visibility = 3 #(0: 비공개 - 기본값, 1: 보호, 3: 발행) 
    category = 908537 # 글을 올리고 싶은 카테고리 번호 
    publish_time = '' 
    slogan = '' 
    tag = '논문,자연어처리,nlp,번역,arxiv,페이퍼' # 글 태그 
    acceptComment = 1 # 댓글허용 
    password = '' # 보호글 비밀번호 

    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': publish_time, 'slogan': slogan, 'tag': tag, 'acceptComment': acceptComment, 'password': password } 
    data = json.dumps(params) 
    rw = requests.post(url_post, headers=headers, data=data) 

    if rw.status_code == 200: 
        print('ok') 
    else: 
        print('fail')

 

2.1. html 파일 쉽게 쓰기 

 

글 쓰는 함수에서 html을 어떻게 써야 예쁜 글이 나올지 확인하기 어려울 수 있는데

그냥 티스토리 블로그에서 평소처럼 (글씨체, 글씨 크기 등 조정하면서) 글 쓴 후에 

 

HTML 눌러서 현재 글의 HTML 코드를 확인할 수 있다. 

그 코드 복붙해와서 수정하면 편하다 !! 

 

2.2. 카테고리 번호 확인하기 

 

그리고 카테고리 번호는 그 카테고리에 글 하나라도 올려야 확인 가능한 듯??

그 카테고리에 올려져 있는 글 들어가서 주소창 확인해보면 

https://codlingual.tistory.com/276?category=908537

 

이런 식으로 category={번호} 라고 써있다. 이 번호를 위의 코드에 써주면 된다. 

 

3. 파이썬 코드 자동 실행 

이제 이 코드를 매일 실행해주기만 하면 된다.

아쉽게도 3.1, 3.2 방법 모두 컴퓨터 꺼져 있으면 실행 안 됨!! 컴퓨터 꺼져도 파일 실행되게 하고 싶으면 서버 사용해야 함... 

하지만 컴퓨터만 켜져 있으면 내가 따로 실행 안 해도 자동으로 실행되는 것도 베리 굿이지 

 

3.1. 윈도우에서 코드 자동 실행

 

기본으로 깔려 있는 '작업 스케줄러' 사용하면 된다. 이건 GUI라서 그리 어렵지 않고 캡처하기 귀찮으니까 자세한 설명은 패스.... 

 

3.2. 맥에서 코드 자동 실행 

 

맥 터미널에 crontab 을 실행하면 된다 

# 현재 자동 실행 걸어놓은 파일들 목록 확인하기 
crontab -l 
# 자동 실행해놓은 것 수정하기 
crontab -e 

# 매일 오후 5시 40분에 해당 파일 실행하기 
40 17 * * * [PATH TO PYTHON] [PATH TO FILE]

맨 마지막 줄을 자기 상황에 맞게 수정하면서 사용하면 된다 

참고로 PATH TO PYTHON은 맥 터미널에서 which python 을 쳐서 알아내면 되고 

PATH TO FILE 은 파일을 터미널로 드래그 앤 드롭 하면 된다 

 

분 시 일 월 요일 

이거였나??

그래서 * * * * * 는 매분 실행되는 거고 그랬다 .. 

몰라 정확히 기억 안 남 ㅋ 

 

인기쟁이 블로그가 되면 좋겠네 호호호 

반응형