티스토리에서 Open API를 통해 자동으로 글을 쓸 수 있다.
파이썬을 통해 테스트 할 것이고
본 글에서는 포스팅 작성하는 것 까지 테스트해본다.
1. 오픈 API 등록
- 아래 링크로 들어가 오픈API등록
https://www.tistory.com/guide/api/manage/register
- 등록을 하면 App ID와 Secret Key를 제공한다.
(API를 사용하기위해 Access Token이란 것이 필요한데 App ID와 Secret Key는 Access Token을 얻기 위해 필요하다.)
2. 인증 요청 및 인증 코드 받기
- api 문서를 보니 로그인이 되어있어야 한다고한다. 근데 매개변수에는 id, pw값이 없는거보니 한번쯤은 로그인을 해야하는 것 같다.
- 크롬에서 직접 로그인해본다.
https://www.tistory.com/oauth/authorize?
client_id={client-id}
&redirect_uri={redirect-uri}
&response_type=code
&state={state-param}
- "허가하기"를 누르면 redirection으로 설정한 주소와 함께 code 쿼리에 데이터가 생성된다.
(16진수 72자리이다.)
- 그러면 client_id와 1번 앱등록에서 받은 App ID, Secret Key와 방금 받은 code 값으로 Access Token을 발급받을 수 있다. 이 토큰으로 글쓰기, 댓글 등을 할 수 있다. GET방식이기에 웹 브라우저 개발자모드도 가능하나 어짜피 Python이 주 목적이었고 하니 Python단에서 실행해본다.
pip install requests
import requests
def getAccessToken():
url = "https://www.tistory.com/oauth/access_token?"
client_id = "[앱 관리] - APP ID"
client_secret = "[앱 관리] - Secret Key"
code = "2번에서 허가하기를 눌러 받은 code 값"
redirect_uri = "[앱 관리]에서 설정한 값"
grant_type="authorization_code" # authorization_code 고정
data = url
data += "client_id="+client_id+"&"
data += "client_secret="+client_secret+"&"
data += "redirect_uri="+redirect_uri+"&"
data += "code="+code+"&"
data += "grant_type="+grant_type
print(data)
return requests.get(data)
if __name__ == "__main__":
token = getAccessToken().content
print(token.decode('utf-8'))
실행하면 조합한 uri 주소와 access token값이 response 된다.
참고로 Access Token받기를 실패하거나, 정상적으로 받았으나 두 번 누르는 경우 등
에러가 나타나면 code부분만 다시 받아 변경하고 다시 Access Token을 받아야 한다.
3. 글쓰기
- 먼저 카테고리의 id를 받아온다.
- output은 xml과 json이 있다. (디폴트는 xml)
- blogName은 블로그 주소 xxx.tistory.com에서 xxx 이다. 현재 블로그일 경우 park-duck이 되겠다.
하지만 현 예제에서 rankdb라는 블로그를 테스트하기 때문에 나는 rankdb로 쓰겠다.
import requests
import json
access_token = "2번에서 받은 Access Token 값"
def getAccessToken():
url = "https://www.tistory.com/oauth/access_token?"
client_id = "[앱 관리] - APP ID"
client_secret = "[앱 관리] - Secret Key"
code = "2번에서 허가하기를 눌러 받은 code 값"
redirect_uri = "[앱 관리]에서 설정한 값"
grant_type="authorization_code" # authorization_code 고정
data = url
data += "client_id="+client_id+"&"
data += "client_secret="+client_secret+"&"
data += "redirect_uri="+redirect_uri+"&"
data += "code="+code+"&"
data += "grant_type="+grant_type
print(data)
return requests.get(data)
def getCategoryID():
url = "https://www.tistory.com/apis/category/list?"
output = "json"
blogName = "rankdb"
data = url
data += "access_token=" + access_token + "&"
data += "output=" + output + "&"
data += "blogName=" + blogName
print(data)
return requests.get(data)
if __name__ == "__main__":
#token = getAccessToken().content
#print(token.decode('utf-8'))
category = json.loads(getCategoryID().content)
category = json.dumps(category, ensure_ascii=False)
print(category)
- 글쓰기에 필요한 category_id값을 기억해두자. (category_id 디폴트는 0)
- 글쓰기차례. 필수는 블로그이름, 글제목, access_token이다. post방식이다.
- 매개변수가 많아서 필요할 것 같은거만 테스트해본다.
import requests
import json
access_token = "2번에서 받은 Access Token 값"
def getAccessToken():
url = "https://www.tistory.com/oauth/access_token?"
client_id = "[앱 관리] - APP ID"
client_secret = "[앱 관리] - Secret Key"
code = "2번에서 허가하기를 눌러 받은 code 값"
redirect_uri = "[앱 관리]에서 설정한 값"
grant_type="authorization_code" # authorization_code 고정
data = url
data += "client_id="+client_id+"&"
data += "client_secret="+client_secret+"&"
data += "redirect_uri="+redirect_uri+"&"
data += "code="+code+"&"
data += "grant_type="+grant_type
print(data)
return requests.get(data)
def getCategoryID():
url = "https://www.tistory.com/apis/category/list?"
output = "json"
blogName = "rankdb"
data = url
data += "access_token=" + access_token + "&"
data += "output=" + output + "&"
data += "blogName=" + blogName
print(data)
return requests.get(data)
def postWriting(title="No Title", content="No Content"):
url = "https://www.tistory.com/apis/post/write?"
output = "json"
blogName = "rankdb"
data = url
data += "access_token=" + access_token + "&"
data += "output=" + output + "&"
data += "blogName=" + blogName + "&"
data += "title=" + title + "&"
data += "content=" + content + "&"
data += "category=1024642"
print(data)
return requests.post(data)
if __name__ == "__main__":
#token = getAccessToken().content
#print(token.decode('utf-8'))
#category = json.loads(getCategoryID().content)
#category = json.dumps(category, ensure_ascii=False)
#print(category)
posting = json.loads(postWriting(title="Test Title", content="Test Content").content)
print(posting)
- 글쓰기가 완료되면 글의 id와 url이 출력된다.
- 보면 자동적으로 글이 올라간 것을 볼 수 있다.
- 작성하고 눈치챘지만 글의 상태는 비공개가 디폴트다.
테스트한 블로그이다.
테스트한 글은 언젠간 지우겠지만 그때는 자동포스팅으로 무언가 글을 올리고 있을 때겠지?
추가
나의 귀차니즘으로 미루고 미루다 자동포스팅 글을 완성했다.
이제 24시간 돌아가는 컴퓨터에서 자동으로 글을 올리는 스케줄러만 완성하면 되는데 귀차니즘으로 인해 언제 완성할지는 모르겠다. (aws 사용중인데 시간과 돈만날려서 아까워 죽는중)
지금까지 작성된 티스토리 API 모듈을 첨부하며 (문서를 코드로 옮긴 것일 뿐...)
완전히 완성된 것은 아니다.
* post글에도 get방식으로 전송되는 점, default 값을 내 임의로 변경한 점, 글쓰기, 카테고리, 파일첨부만 테스트한 점, 공개글로 변환이 안되는 점 등이 있다.
** 결론 - 오류가 존재하니 맹신하진 말고 참고만 하자.
차후 수정하여 다시 첨부할 것이나 이 글을 은근(?) 많이 찾으시길래 일단 중간과정이라도 첨부하는 것이니 자세한 것은 문서나 다른 블로그를 찾아봐야 할 것 같다.
상단의 client_id, client_secret, acces_tokken, redirect_uri 등은 본인이 들고 있는 key값에 맞게 설정하여야한다.
포스팅시 사진올리는 법과, 썸네일이 (unknown)으로 설정되는 오류도 있는데, 블로그를 뒤져서 뒤져서 해결방법도 찾았다. 귀차니즘이 물러가면 다시 작성할 예정이다. (TistoryAPI.py 파일에 주석으로 간략하게 적어놈)
'프로그래밍 > Python' 카테고리의 다른 글
[파이썬 독학] 1. 파이썬 설치하기&실행하기 (0) | 2022.06.25 |
---|---|
[Python] if __name__ == "__main__": 란? (0) | 2022.06.24 |
[Python] 구글클라우드를 이용한 오디오 파일 자막 추출 (0) | 2022.05.01 |
[Python] .csv 파일 데이터 읽어오기 (0) | 2022.03.27 |
[Python] 라즈베리파이 LCD I2C 통신 (0) | 2022.01.07 |
댓글