저와 같은 생각을 하시는 분이 계시다면 이 글을 보고 제가 소비한 시간보다 좀 더 빠르게적용 하시길바랍니다
일단 본문에 이미지를 넣기 위해서는어려번의단계가 필요했는데요
저의 경우 파이썬의어떤한결과를 txt 파일로 저장하였습니다
그리고 그 txt 파일을 png 그림 파일로 변환을 하였고
그 변환된 png 파일을 본문의 내용에업로드 하는방식으로 구조가 되어 있습니다
해당 포스팅 글에서 중요한 부분은 png 파일을 본문에업로드 하는게주요 주제이지만
제가 개발한 구조에 대한 모든 설명을업로드 하도록하겠습니다
1.txt파일을png 파일로 변환
- 저는 파이썬의 PIL를 이용하여 이미지에 텍스트를 입히는 구조로 만들었습니다
# coding=utf-8
from PIL import Image, ImageDraw, ImageFont
import textwrap
import requests
import webbrowser
from datetime import datetime
import os
from pandas import DataFrame
import settings
import time
import json
파이썬 제일 상단의 패키지 선언 부분입니다
텍스트 문서를 이미지에 쓰는 함수를 만들어 줍니다
def make_image(self, message, height, filename):
# Image size
W = 500
H = height
bg_color = 'rgb(214, 230, 245)' # 아이소프트존
# font setting
font = ImageFont.truetype('NanumSquareRoundR.ttf', size=12)
font_color = 'rgb(0, 0, 0)' # or just 'black'
# 원래 윈도우에 설치된 폰트는 아래와 같이 사용 가능하나,
# 아무리 해도 한글 폰트가 사용이 안 되어.. 같은 폴더에 다운받아 놓고 사용함.
# font = ImageFont.truetype("arial.ttf", size=28)
image = Image.new('RGB', (W, H), color=bg_color)
draw = ImageDraw.Draw(image)
lines = message
# start position for text
x_text = 10
y_text = 10
print(lines)
# 각 줄의 내용을 적음
for line in lines:
line = str(line).replace("\\n", "").replace("{", "").replace("}", "")
print(line)
width, height = font.getsize(line)
draw.text((x_text, y_text), line, font=font, fill=font_color)
y_text += height
# height는 글씨의 높이로, 한 줄 적고 나서 height만큼 아래에 다음 줄을 적음
save_path = os.path.join(settings.BASE_DIR, "tistory/png/")
#파일이 존재하면 삭제 후 저장
if os.path.isfile(save_path + '{}.png'.format(filename)):
os.remove(save_path + '{}.png'.format(filename))
image.save(save_path + '{}.png'.format(filename))
else:
# 안에 적은 내용을 파일 이름으로 저장
image.save(save_path + '{}.png'.format(filename))
그리고 저번 티스토리 API 글 작성하기 2탄에서 본문을 만드는 부분에서 다음과 같이 사용합니다
def get_content(self):
skyloket_path = os.path.join(settings.BASE_DIR, "tistory/png/skyloket_list.png")
stockclose_path = os.path.join(settings.BASE_DIR, "tistory/png/stockclose_list.png")
buylist_path = os.path.join(settings.BASE_DIR, "tistory/png/buy_list.png")
html_path = os.path.join(settings.BASE_DIR, "tistory/html/html_content.html")
now = datetime.now()
nowdate = now.strftime('%Y-%m-%d')
nowtime = now.strftime('%Y-%m-%d %H:%M:%S')
html_content = '<p>* 현재 개발 중인 주식 분석 프로그램 실행 결과 값입니다</p>'
html_content += '<p data-ke-size="size14"><span style="color: #ee2323;"><b> 이 자료는 주식 투자 목적이 아닌 프로그램 분석율 계산을 위한 값이므로 절대 신뢰하지 마세요</b></span></p>'
html_content += '<p data-ke-size="size14"><span style="color: #ee2323;"><b> (이자료를 통한 투자 손해에 대해 필자는 배상하지 않습니다)</b></span></p>'
html_content += '<p> </p>'
html_content += '<p data-ke-size="size14">※ 해당 정보는 프로그램 결과값이 정리하여 자동으로 포스팅되는 글라는 점을 참고해 주세요</p>'
html_content += '<p data-ke-size="size14"> (' + nowdate + '프로그램이 자동으로 포스팅한 자료 입니다)</p>'
html_content += '<p> </p>'
html_content += '<p>▣' + nowdate + '_급등 주가 리스트</p>'
html_content += '<p data-ke-size="size14"><span style="color: #ee2323;">(현재 기준 지난 30일간 주가가 10배 이상 급등한 주가 리스트입니다)</span></p>'
html_content += '<p>' + self.set_fileupload(skyloket_path) + '</p>'
html_content += '<p> </p>'
html_content += '<p><span style="color: #333333;">▣' + nowdate + '_매수 예상 종목</span></p>'
html_content += '<p data-ke-size="size14"><span style="color: #ee2323;">(프로그램에서 현재 기준 매수할 경우 승률이 가장 좋은 리스트 입니다)</span></p>'
html_content += '<p>' + self.set_fileupload(buylist_path) + '</p>'
html_content += '<p> </p>'
html_content += '<p><span style="color: #333333;">▣ 관심 주가별 예상 종가 리스트</span></p>'
html_content += '<p data-ke-size="size14"><span style="color: #ee2323;">(과거 데이터를 이용하여 텐서플로워를 통해 최종 예상 종가를 예측한 값입니다)</span></p>'
html_content += '<p data-ke-size="size14"><span style="color: #ee2323;">(신뢰성은 매우 낮습니다ㅠ 뭔가 알고리즘을 바꿔야 할거 같습니다)</span></p>'
html_content += '<p>' + self.set_fileupload(stockclose_path) + '</p>'
html_content += '<p> </p>'
html_content += '<p>위의 주가 리스트는 ' + nowtime + ' 기준으로 취합된 데이터로 작성된 자료 입니다</p>'
html_content += '<p>프로그램 결과에 대한 값을 티스토리에 자동 포스팅 중입니다</p>'
html_content += '<p>프로그램 결과 평일 기준 오전, 오후 두번 포스팅 하고 있습니다</p>'
html_content += '<p>해당 자료는 테스트 및 분석용으로 사용합니다</p>'
html_content += '<p>실제 투자에 활용하고자 할 경우 참고만 하시고 최종 분석은 본인이 해야 합니다</p>'
html_content += '<p>감사합니다</p>'
html_file = open(html_path, 'w+')
html_file.write(html_content)
html_file.close()
본문 내용을 보시면중간 중간에self.set_fileupload()라는 함수 호출 부분이 있습니다
이렇게 사용합니다
그리고 자동 포스팅을 돌리시면 아래와 같이중간 함수를 호출한 위치에 다음과 같이 그림파일이 생성되게 됩니다
실제 본문 내용을 파이썬에서 ptrint문으로 찍어보시면 티스토리에서 이미지 해당 부분에 html 형태의 이미지 업로드
처음 티스토리 API설정이 끝나고 카테고리 ID를 조회하여 찾으셨다면 이제 쉽게 글을 올리실수 있습니다
일단 티스토리가 html 형식으로 글을 쓰게 됩니다
쉬운 방법은 일단 PC를 통해 샘플 글을 미리 작성을 합니다
샘플 글을 작성하신 다음 우측 상단에 기본모드를 html 모드로 변경해 줍니다
html 모드로 변경을 하면 아래와 같은 형태로 변경됩니다
그럼 컨텐츠 영역에 글을 모두 복사 한뒤 파이썬에서 분자열 변수에 담아서 코딩을 합니다
def get_content(self):
html_content = '<p>* 현재 개발 중인 주식 분석 프로그램 실행 결과 값입니다</p>'
html_content += '<p data-ke-size="size14"><span style="color: #ee2323;"><b> 이 자료는 주식 투자 목적이 아닌 프로그램 분석율 계산을 위한 값이므로 절대 신뢰하지 마세요</b></span></p>'
html_content += '<p data-ke-size="size14"><span style="color: #ee2323;"><b> (이자료를 통한 투자 손해에 대해 필자는 배상하지 않습니다)</b></span></p>'
html_content += '<p> </p>'
html_content += '<p data-ke-size="size14">※ 해당 정보는 프로그램 결과값이 정리하여 자동으로 포스팅되는 글라는 점을 참고해 주세요</p>'
html_content += '<p data-ke-size="size14"> (' + nowdate + '프로그램이 자동으로 포스팅한 자료 입니다)</p>'
html_content += '<p> </p>'
html_content += '<p>▣' + nowdate + '_급등 주가 리스트</p>'
html_content += '<p data-ke-size="size14"><span style="color: #ee2323;">(현재 기준 지난 30일간 주가가 10배 이상 급등한 주가 리스트입니다)</span></p>'
html_content += '<p> </p>'
html_content += '<p><span style="color: #333333;">▣' + nowdate + '_매수 예상 종목</span></p>'
html_content += '<p data-ke-size="size14"><span style="color: #ee2323;">(프로그램에서 현재 기준 매수할 경우 승률이 가장 좋은 리스트 입니다)</span></p>'
html_content += '<p> </p>'
html_content += '<p><span style="color: #333333;">▣ 관심 주가별 예상 종가 리스트</span></p>'
html_content += '<p data-ke-size="size14"><span style="color: #ee2323;">(과거 데이터를 이용하여 텐서플로워를 통해 최종 예상 종가를 예측한 값입니다)</span></p>'
html_content += '<p data-ke-size="size14"><span style="color: #ee2323;">(신뢰성은 매우 낮습니다ㅠ 뭔가 알고리즘을 바꿔야 할거 같습니다)</span></p>'
html_content += '<p> </p>'
html_content += '<p>위의 주가 리스트는 ' + nowtime + ' 기준으로 취합된 데이터로 작성된 자료 입니다</p>'
html_content += '<p>프로그램 결과에 대한 값을 티스토리에 자동 포스팅 중입니다</p>'
html_content += '<p>프로그램 결과 평일 기준 오전, 오후 두번 포스팅 하고 있습니다</p>'
html_content += '<p>해당 자료는 테스트 및 분석용으로 사용합니다</p>'
html_content += '<p>실제 투자에 활용하고자 할 경우 참고만 하시고 최종 분석은 본인이 해야 합니다</p>'
html_content += '<p>감사합니다</p>'
html_file = open(html_path, 'w+')
html_file.write(html_content)
html_file.close()
이런식으로 아예 함수로 하나를 만들었습니다
그런뒤 해당 변수의 내용을 토대로 html 샘플 파일을 만들었습니다
이부분이 바로 html 파일로 저장하는 구문입니다
그런 다음 아래와 같이 티스토리 API를 동작시킬 함수를 만들어 줍니다
def get_write(self):
self.get_content()
#생성된 html 파일의 경로.
html_path = os.path.join(settings.BASE_DIR, "tistory/html/html_content.html")
now = datetime.now() # current date and time
today = now.strftime("%Y.%m.%d")
nowtime = now.strftime('%H:%M:%S')
title = '[주가분석요약] ' + today + '_프로그램을 활용한 주식분석_예상결과(' + nowtime + ')'
f = open(html_path, "r", encoding='cp949')
content = f.read()
print(content)
#with open(html_path, "r", encoding='ISO-8859-1') as file:
# print(file)
# content = file.read()
visibility = "3" # 발행상태 0비공개-기본, 1보고,3발행
category_id = "834763" # 카테고리 아이디 기본값 0
slogan = title # 문자주소
tag = "주가분석, 급등주, 퀸트분석, 종가예측, 관심종목, 주식, 종목," + today + " 주식정보" # 태그 ,로 구분
acceptComment = "" # 댓글 허용 (0, 1 - 기본값)
password = "" # 보호글 비밀번호
url = 'https://www.tistory.com/apis/post/write'
data = {'access_token': access_token, 'output': 'json', 'blogName': blog_name, 'title': title, 'content': content,
'visibility': visibility, 'category': category_id, 'slogan': slogan, 'tag': tag,
'acceptComment': acceptComment, 'password': password}
r = requests.post(url, data=data)
print(r, r.text)
해당 구문에서 아까 글을 올리고자 하는 문자열을 html 파일 형태로 저장하고
주석에 설명되어 있듯이 저장된 html을 읽어오는 구문 입니다
그리고 requests 형태로 변경하기 위해 여러가지 변수의 값을 지정했습니다
1) title : 글 제목
2) content : 본문 내용
3) visivbility : 발생상태
4) categort_id : 올리고자 하는 카테고리 ID
5) slogan : 주석(?) 같은 의미
6) tag : 글 태그 입력
7) acceptComment : 댓글 권한 설정
8) password : 보호글 비밀번호
9) url : 티스토리 API 동작 주소
10) data : 위의 종합 정보를 requests 형태로 조합
Dataframe에 위의 정보 정도로 취합되는거 같습니다
해당 구문을 모두 작성하신뒤
이렇게 __init__ 부분에 다음과 같이 호출을 하게 되면
저장해 놓은 html의 내용이 본문의 내용으로 업로드 되어 집니다
정상 적으로 글쓰기가 동작했다면 다음과 같은 리턴 값이 오게 됩니다
여기까지 하셨다면 성공하신겁니다
다음 포스팅에서는 본문 내용에 이미지 파일을 넣어서 작성글을 만들어보는 포스팅 방법을 올릴 예정입니다
밑에 이미지는 현재 제가 프로그램을 통해 자동 업로드 하고 있는 결과입니다
여러분도 정기적인 정보나 대량의 자료를 업로드해야할시 위의 정보로 구현하여 사용해 보시기 바랍니다
저번 포스팅에서 티스토리 API 사용시 꼭 필요한 Access_Token을 얻는 방법을 소개했습니다
이번에는 이어서 글을 올리고자 하는 카테고리 ID를 취득하는 방법을 작성해 보도록 할께요
이번 포스팅은 파이썬 환경에서 동작합니다
제가 사용한 파이썬의 환경은 아래와 같습니다
* 동작 환경
1) Python 3.6
2) requests
3) webbrowser
4) json
저는 example.py라는 파일을 하나 만들고
제일 상단에 다음과 같이 패키지를 선언해줬습니다
아래 패키지 목록중 settings는 경로를 지정해놓은 별도 py 파일이므로 여기서 설명은 생략 하도록 하겠습니다
# coding=utf-8
from PIL import Image, ImageDraw, ImageFont
import textwrap
import requests
import webbrowser
from datetime import datetime
import os
from pandas import DataFrame
import settings
import time
import json
다음 하단에 전 포스팅에서 얻은 정보를 셋팅해 줄겁니다
# client_id == app_id
client_id = ""
# client_secret = Secret_Key
Secret_Key = ""
# code 는 access_token 을 받기 위한 중간 인증코드, 한시간 내 한번만 사용됨.
code = ""
# access_token 최종인증키 유효기간동안 사용가능
access_token = ""
# 티스토리 주소의 아이디나 전체주소
blog_name = "codingman.tistory.com"
# 콜백주소는 자신의 티스토리 주소를 사용해도 되고, 끝에 /는 넣지 않는다.
redirect_uri = "http://codingman.tistory.com"
state_param = "bm" # 임의의 문자열
output_type = "json"
requests_headers = { # 없어도 동작됨
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36"
}
소스코드가 이해가 안되실거 같아서 빨간색으로 표기된 영역에 알맞은 정보 값을 넣어주시면 됩니다
설명은 주석으로 작성되어 있으니 어렵지 않으실거 같습니다
이제 파이썬의 코드를 클래스로 만들기 위해 구조를 먼저 선언하겠습니다
class message_write:
def __init__(self):
super().__init__()
# 먼저 코드를 생성하고,
if not code:
auth_url = f'https://www.tistory.com/oauth/authorize?client_id={client_id}&redirect_uri={redirect_uri}&response_type=code&state={state_param}'
webbrowser.open(auth_url)
print('주소창에서 코드 값을 복사하세요. ?code= 이하')
# r = requests.get(auth_url)
# print(r.text)
# 이후에 액세스 토큰을 받아야 한다. 이게 좀 귀찮고 낮설다.
if code and (not access_token):
print('acess token 시도중...')
token_url = f'https://www.tistory.com/oauth/access_token?client_id={client_id}&client_secret={Secret_Key}&redirect_uri={redirect_uri}&code={code}&grant_type=authorization_code'
r = requests.get(token_url)
print(r.text)
self.get_write()
if __name__ == "__main__":
# 실행
message_write()
#get_category()
#get_write()
이렇게 message_write라는 클래스를 만들고
모듈별 실행을 위해 __main__을 잡으주고 py파일 제일 먼저 실행될 부분인 __init__에 다음과 같이 코딩해 줍니다
def get_category(self):
url = f'https://www.tistory.com/apis/category/list?access_token={access_token}&output={output_type}&blogName={blog_name}'
r = requests.get(url, headers=requests_headers)
r = r.json()['tistory']['item']['categories']
for i in r:
print(f'{i["name"]} ({i["id"]})')
return r
카테고리 명과 (ID) 값을 확인 하실수 있습니다
이렇게 현재 나의 블로그의 속성을 확인 하는 방법에 대해 알아 보았습니다
이번 포스팅에서 확인한 카테고리 ID를 가지고 글을 업로드하는 방법을 다음시간에 포스팅 해보도록