본문 바로가기
Python

Python&티스토리 api로 kbo 경기 기록 자동 포스팅하기(6)

by _sweep 2021. 6. 17.

이미지 첨부하기

티스토리 api의 gitbook을 살펴보면 파일을 첨부하는 api는 다음과 같다.

 

POST https://www.tistory.com/apis/post/attach?
  access_token={access-token}
  &blogName={blog-name}

[uploadedfile]
  • access_token : 발급받은 access token
  • blogName : 블로그명

즉, 'https://www.tistory.com/apis/post/attach?'라는 주소에 각 파라미터들과 업로드할 파일을 넣어 post 요청을 보내는 것이다.

 

1. content 작성하기

content를 작성할 때도 더블헤더를 생각해야 한다.

 

def postingResult():
    content = ''
    if isDH:
        for i in range(0, 2):
            content += '<h3 data-ke-size="size23">{}차전 경기 결과</h3>'.format(i + 1)+ keyEnter
            content += createImgContent('result', i + 1) + keyEnter
    else:
        content = '<h3 data-ke-size="size23">경기 결과</h3>'+ keyEnter
        content += createImgContent('result', 0) + keyEnter
    content += keyEnter
    
    return content

 

그래서 더블헤더가 없는 날은 소제목과 사진 파일을 업로드했고

더블헤더가 있는 날은 1차전 소제목 + 사진파일 / 2차전 소제목 + 사진파일을 업로드 하도록 했다.

그리고 img content를 만드는 과정은 따로 함수 처리했다.

 

 

2. 이미지 content 작성 & POST 요청하기

이미지 content를 만드는 방법은 2가지가 있다.

 

2-1. replacer

티스토리 글쓰기에서 사진을 업로드한 후 html 모드로 확인해보면 img 태그가 아닌 replacer가 p태그와 함께 적혀있는 것을 볼 수 있다.

 

 

따라서 replacer로 content를 적기 위해서는 post 요청을 보내고 받은 응답에서 해당 파일의 replacer를 p 태그로 감싸 content에 붙여넣기만 하면 된다.

 

def createImgContent(imgName, imgNum):
    if isDH:
        content = '<p>' + uploadImage('./image/{}_{}_{}.png'.format(imgName, date, imgNum)) + '</p>'
    else:
        content = '<p>' + uploadImage('./image/{}_{}.png'.format(imgName, date)) + '</p>'
    return content
    
def uploadImage(filePath):
    files = {'file': open(filePath, 'rb')}
    parameters = {
        'access_token': access_token,
        'blogName': blogName,
        'output': 'json'
    }
    rq = requests.post(upload_url, params=parameters, files=files)
    image = json.loads(rq.text)["tistory"]

    if (image["status"] == '200'):
        # 정상 작동 확인
        print("Upload Image... status", image["status"])

    else:
        print("Upload Image Error")
        print(rq.text)
    
    return image["replacer"]

 

앞서 글 작성할 때와 마찬가지로 파라미터들을 적고 post 요청을 보내면 된다.

요청을 보냈을 때 응답으로는 status, 업로드한 파일의 url, 업로드한 파일의 치환자인 replacer가 온다.

따라서 replacer를 content에 적어 이미지를 업로드할 수 있다.

 

+) 그러나 추천하지 않는 이유는 6월 16일 오후에 에러가 나기 시작했다.

지금은 되는지 모르겠지만 6월 16일 오후에 업로드를 하려고 하니 파일의 width와 height가 모두 0으로 처리됐다.

 

 

해당 이미지 파일은 정상적으로 저장이 됐고 글쓰기 수정에 들어가 너비와 높이 값을 설정하면 이미지가 보였지만 자동 업로드라는 주제에는 맞지 않았다.

 

이와 관련해 고객센터에 질문을 남겼지만 아직 답은 없는 상태고 검색해봐도 원인을 모르겠어서 결국 replacer를 활용하는 방법을 다른 것으로 바꾸기로 했다.

 

 

2-2. url

결국 위의 이슈로 인해 url을 활용하는 방법을 택했다.

p 태그 대신 img 태그를 이용하고 src 속성에 해당 url을 넣어주는 형식이다.

 

def uploadImage(filePath):
    files = {'uploadedfile': open(filePath, 'rb')}
    parameters = {
        'access_token': access_token,
        'blogName': blogName,
        'output': 'json'
    }
    rq = requests.post(upload_url, params=parameters, files=files)
    image = json.loads(rq.text)["tistory"]

    if (image["status"] == '200'):
        # 정상 작동 확인
        print("Upload Image... status", image["status"])

    else:
        print("Upload Image Error")
        print(rq.text)
    
    return image["url"]

def createImgContent(imgName, imgNum):
    if isDH:
        content = '<img src="' + uploadImage('./image/{}_{}_{}.png'.format(imgName, date, imgNum)) + '">' + '</img>'
    else:
        content = '<img src="' + uploadImage('./image/{}_{}.png'.format(imgName, date)) + '">' + '</img>'
    return content

 

url을 사용하는 방법을 택했더니 정상적으로 다시 글에서 이미지가 보이기 시작했다.

따라서 나는 이 방법을 추천한다.

 

더보기

+ 창의 크기에 따라 사진의 크기를 자동으로 조절하고 싶으면 다음의 내용을 img 태그에 넣으면 된다.

style="max-width: 100%; height: auto;"

 

 

자세한 내용은 다음 페이지에서 확인할 수 있다.

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

 

파일 첨부 · GitBook

No results matching ""

tistory.github.io

 

 


 

이제 python과 티스토리 api를 이용한 kbo 경기 기록 자동 포스팅하는 방법 설명이 끝났다.

자동으로 포스팅한 내용은 다음 페이지에서 확인 가능하다.

https://cansweep.tistory.com/category/%EC%95%BC%EA%B5%AC%20%EA%B8%B0%EB%A1%9D

 

'야구 기록' 카테고리의 글 목록

 

cansweep.tistory.com

 

댓글