Today's

길을 나서지 않으면 그 길에서 만날 수 있는 사람을 만날 수 없다

파이썬 스크립트

파이썬 자동화 스크립트 : 티스토리 글을 네이버블로그에 퍼 담아 보자

Billcorea 2021. 12. 18. 09:30
반응형

오늘은 글쓰기가 귀차니즘으로 티스토리에 적어 두었던 글들을 네이버 블로그에 옮겨 보자.

1. 옮기는 방법을 찾아보니. 

https://developers.naver.com/docs/share/navershare/

 

네이버 공유하기 개발가이드

NAVER Developers - 네이버 공유하기 개발가이드

developers.naver.com

네이버 공유하기 가 있다. 이걸 어떻게 이용하면 될까? 생각해 보고, 일단은 저 스크립 트을 따라 해 보았다. 그랬더니, 블로그로 글을 옮겨주는 페이지를 열어 준다. 오호라~ 그렇다면... 하는 생각이 번쩍 스친다...

 

2. 이제 티스토리의 글목록은 어떻게 얻을 것인가 ?

https://tistory.github.io/document-tistory-apis/apis/v1/post/list.html

 

글 목록 · GitBook

No results matching ""

tistory.github.io

글목록은 얻어오는 방법은 티스트로 api 가이드를 참고해 보면 알 수 있다.  몇 번 해 본 것들이니 따로 설명은 생략.

3. 이제 소스 작업을 해 보자.

#coding=utf-8
import json
import sqlite3
import time

import pyperclip
import requests
from urllib import parse
from selenium import webdriver
from selenium.webdriver import ActionChains, Keys
from selenium.webdriver.common.by import By

conn = sqlite3.connect("test.sqlite", isolation_level=None)
rs = conn.cursor()
rs.execute("CREATE TABLE IF NOT EXISTS myUrlList \
        (id integer PRIMARY KEY, url text, Name text, writeDate text)")

path = "C:\\Users\\nari4\\Documents\\python_workspaces\\chromedriver.exe"
browser = webdriver.Chrome(path)

blog_name = "b.....a"
client_id = "c......................6753a"
seckey = "cf6e..............................................................0efb7"
callback_url = "http://b......a.tistory.com"
getUrl = 'https://www.tistory.com/oauth/authorize?client_id={0}&redirect_uri={1}&response_type=code&state=someValue'
getUrl = getUrl.format(client_id, callback_url)
#1 print(getUrl)

def getToken():
    code = '901.............................................895568dc642f63da08'
    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)

def clipboard_input(user_type, user_xpath, user_input):
    temp_user_input = pyperclip.paste()  # 사용자 클립보드를 따로 저장

    pyperclip.copy(user_input)
    browser.find_element(user_type, user_xpath).click()
    ActionChains(browser).key_down(Keys.CONTROL).send_keys('v').key_up(Keys.CONTROL).perform()

    pyperclip.copy(temp_user_input)  # 사용자 클립보드에 저장 된 내용을 다시 가져 옴
    time.sleep(1)

#2 getToken()
access_token = 'cef.....................................................f45333'

url_getPostList = "https://www.tistory.com/apis/post/list?access_token={0}&output={1}&blogName={2}&page={3}".format(access_token, 'json', blog_name, 1)
res = requests.get(url_getPostList)
jsonObject = json.loads(res.text)
iCnt = 0;
for idx in range(int(int(jsonObject.get('tistory').get('item').get('totalCount')) / 10), 0, -1):
    print(idx)
    url_getPostList = "https://www.tistory.com/apis/post/list?access_token={0}&output={1}&blogName={2}&page={3}".format(
        access_token, 'json', blog_name, idx)
    res = requests.get(url_getPostList)
    jsonObject1 = json.loads(res.text)
    data = jsonObject1.get('tistory')
    for item in data.get('item').get('posts'):
        # 모바일앱 카테고리의 글만 20 발행인 글만
        if '933360' in item.get('categoryId') and '20' in item.get('visibility'):
            naverUrl = 'https://share.naver.com/web/shareView?url={0}&title={1}'.format(parse.quote(item.get('postUrl')), parse.quote(item.get('title')))
            print(item.get('id'))
            print(naverUrl)
            browser.get(naverUrl)
            browser.find_element(By.CLASS_NAME, 'btn_next').click()
            time.sleep(1)

            if iCnt == 0:
                # 아이디 입력
                clipboard_input(By.XPATH, '//*[@id="id"]', 'na......k')
                time.sleep(1)
                # 비밀번호 입력
                clipboard_input(By.XPATH, '//*[@id="pw"]', 'NTF......4')
                time.sleep(1)
                # 로그인 버튼 클릭
                browser.find_element(By.XPATH, '//*[@id="log.login"]').click()
                browser.implicitly_wait(30)
                browser.find_element(By.XPATH, '//*[@id="new.save"]').click()
                time.sleep(1)

            desc = browser.find_element(By.CLASS_NAME, 'dsc').text
            clipboard_input(By.ID, 'content', desc)

            browser.find_element(By.CLASS_NAME, 'btn_write').click()
            iCnt += 1

반복적으로 하고 있는 것이기는 하지만, 아직도 좀 힘든 부분은 access_token을 얻어 오는 것이다.  전체 스크립트를 기술해 두었지만,  #1 print(getUrl) 을 최종적으로 막았지만, print(getUrl) 에서 출력되는 링크를 클릭해 들어가면 code 값을 얻을 수 있고, #2 getToken() 으로 막았지만, 저걸 풀고 getToken() 을 실행해 보면 access_token 을 얻을 수 있다. 

access_token 은 한번 얻고 나면 변경할 필요가 없는 것 같아서.  그다음부터는 위에서 처럼 #1, #2는 막아 두고 진행을 해도 된다. 

4. 그다음은 post 리스트를 얻어오는 링크를 실행해서 티스토리의 post 목록을 받아오고, 

5. 필요에 따라 카테고리 값을 구분해서 필요한 부분만 선택해서  네이버 블로그에 저장하는 처리를 진행한다.

6. 진행하기 전에 네이버 내 정보에 들어가서 보안설정 - 2단계 인증 관리에서 애플리케이션 비밀번호 관리를 통해 파이썬 스크립트에서 사용할 비밀번호를 하나 생성한 다음 위의 스크립트를 진행해야 한다.  그렇지 않으면 자동화 스크립트에서 로그인하는 것을 네이버는 싫어해서 그림 캡챠를 돌려 로그인을 방해(?)하는 처리를 하고 있다. 

네이버 2단계 인증

 

7. 이렇게 하면 짜잔... 티스토리에 작성한 글들의 전체 본문은 아니지만 링크를 달아서 네이버 블로그에 다 담아 볼 수 있다. ㅎㅎㅎ

 

반응형