몇개월 전, 티스토리의 OPEN API를 이용해 블로그에 매일 자정 코로나관련 글을 올리는 봇을 만들었다. 가끔씩 에러가 발생하면 수정을 해서 새로 릴리즈를 하곤 하는데, 어제 자정 (2020년 6월 12일 00시)에도 업로드가 되지않아, 확인해 보았다.
에러가 일어난 곳은 티스토리의 파일첨부 API를 사용하는 부분이었다.
정상적으로 API에 리퀘스트를 보냈을때, 돌아오는 리스폰스의 값은 아래와 같다.
{
"tistory":{
"status":"200",
"url":"https://t1.daumcdn.net/cfile/tistory/1328CE504DB79F5932",
"replacer":"%5b%23%23_1N%7ccfile6.uf%401328CE504DB79F5932B13F%7cwidth%3d\"500\"+height%3d\"300\"%7c_%23%23%5d"
}
}
하지만, 내가 실행했을때 돌아오는 리스폰스의 값은 아래와 같이 400 에러가 발생하고 있다.
{
"tistory":{
"status":"400","error_message":"HTTP Method Not Allowed"
}
}
티스토리 API 문서에 따르면, 아래와 같이 POST 값과 uploadedfile로 지정된 이미지 파일을 보내면 된다고 하는데,
POST https://www.tistory.com/apis/post/attach?
access_token={access-token}
&blogName={blog-name}
[uploadedfile]
갑자기 "HTTP Method Not Allowed" 에러가 발생하여 의문이 들었다.
400에러면 Bad Request인지라, 내가 무언가 잘못한건가 하는 생각도 들지만, 몇개월간 아무 문제 없이 작동하던 코드에 무슨 문제가 있나싶어졌다. 그래서 고객센터에 API의 폼에 어떠한 변화가 있는지 문의를 남겨서 답변을 기다리고 있다.
혹시라도 저랑 같은 증상이 있으신 분이 계실까요?
참고로 나의 코드는 아래와 같다. 개발고수님들 혹시나 제가 틀린 부분이 있다면,,, 알려주세요!
files = {'uploadedfile': open(f'/home/ubuntu/tsotry/data/{capture}.png', 'rb')}
url = f'https://www.tistory.com/apis/post/attach?access_token={access_token}&blogName={blog_name}'
r = requests.post(url, files=files)
print(r.url) #결과 값 : https://www.tistory.com/apis/post/attach?access_token=XXXXXXX&blogName=digitalnomad-lee
아무리 구글링을 해봐도 잘 모르겠어서, 일단은 고객센터에서 문의가 올때까지 기다려볼 생각이다. 제발 하루하루 지날때마다 게시글이 올라가지 않으니 조급해진다. 문의가 오거나 해결이 된다면 이어서 해결법을 적어보겠다.
<6월 14일 추가테스트 결과>
댓글들에서 파일 첨부API가 아닌 다른 API에서도 에러가 발생한다는 얘기를 듣고 6월 14일 23시 30분 기준으로 테스트를 해보았다.
POSTMAN으로 테스트 하셨을때 잘 된다고 하셔서, 포스트맨으로 테스트해보려했지만 현재 컴퓨터에서 다운로드가 안된다.(젠장)
그래서, 실제로 같은 기능의 코드를 JAVA로 작성해서 테스트 해보았다.
먼저, 나의 파이썬 코드의 결과값은 다음과 같다.
<Python3>
블로그 정보API/ 글 목록 API/ 카테고리 목록 API/ 글 읽기 API/ 글 작성 API/ 파일첨부 API 전부 에러가 발생하고 있었다.
위의 에러 문구만 본다면 access_token에 오타가 있는것이 아닌가 생각하실 수 있지만, 정확하게 같은 access_token으로 자바로 작성한 테스트 프로그램을 구동해 보면 아래와 같다.
<JAVA 1.8.0>
파일 첨부 API 까지는 테스트 해보진 않았지만, 전부 잘 동작하는것을 확인하실 수 있다.
Python은 왜 안되고 JAVA는 되는것인지 잘 모르겠다. Python의 request 커넥션에 문제가 있는것인가.
혹시 해결하신 분이 있으시다면 제발 알려주세욤... 저도 공유하겠음!
(정 안될경우에는, JAVA로 새로운 프로그램을 만들어야할까 싶은생각이다)
<6월 15일 위의 문제 해결 및 해결방법>
너무나 감사하게도 나와 같은 증상을 겪으시던 다른 블로거님께서 댓글을 통해서 해결방법을 알려주셨다.
(CONFIDENCE LIFE님, info-W 님 너무나 감사드립니다.)
결론부터 말하자면, 위의 문제는 Request를 보내는 Header값에 User Agent 값이 들어가 있지 않아 발생되는 문제였다.
자바로 프로그램을 짰을때는 Header값에 User Agent를 넣어두었지만, 파이썬은 Header 값을 따로 넣지 않고 Request를 보냈기에 Java로는 잘 돌아갔지만 Python으로는 제대로 된 Response 값이 돌아오지않았다.
하지만, 몇 개월간 잘 돌아가던 Python 프로그램이 갑자기 User Agent값이 없다고 안돌아간다는 것은 어떤 정책이 바뀐것인가.
(왜 그런지 의문이긴하다.)
<User Agent란?>
나는 userAgent는 서버에 접속하는 단말기의 OS 정보와 브라우저의 정보를 가지고 있는 정보라고 이해하고 있다.
실제로 자신의 컴퓨터나 스마트폰과 같은 단말기로 아래의 사이트에 접속해 보면 자신의 User Agent값을 확인할 수 있다.
http://www.useragentstring.com/index.php
이러한 사용자 에이전트 정보에 따라서 서버 측에서 다른 웹페이지를 보여주는 것이 가능하기 때문에, 때로는 User Agent에 다른 값을 넣어서 다른 페이지를 보는것도 가능하다.(예를들어, 스마트폰에서 접속했지만 데스크탑버젼 구현과 같은)
아무튼, 나의 코드를 수정해 보았다.
<변경 전>
files = {'uploadedfile': open(f'/home/ubuntu/tsotry/data/{capture}.png', 'rb')}
url = f'https://www.tistory.com/apis/post/attach?access_token={access_token}&blogName={blog_name}'
r = requests.post(url, files=files)
print(r.url) #결과 값 : https://www.tistory.com/apis/post/attach?access_token=XXXXXXX&blogName=digitalnomad-lee
<변경 후>
requests_headers = {
"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.97 Safari/537.36"
}
files = {'uploadedfile': open(f'/home/ubuntu/tsotry/data/{capture}.png', 'rb')}
url = f'https://www.tistory.com/apis/post/attach?access_token={access_token}&blogName={blog_name}'
r = requests.post(url, files=files,headers=requests_headers)
이렇게 위의 사이트에서 받은 나의 User-Agent 정보를 넣어주고 나니 아무 문제없이 다시 이용이 가능해졌다.
해결할 수 있도록, 도움을 주신 모든 분들 다시한번 너무나 감사드립니다.
(특히나 해결법을 공유해주신 CONFIDNECE LIFE님에게 영광을 돌립니다.)
'IT > 개발자' 카테고리의 다른 글
String()과 toString()의 차이 (0) | 2024.04.11 |
---|---|
706.Design HashMap (Leet Code) (0) | 2023.10.04 |
416. Partition Equal Subset Sum (Leet Code) (1) | 2023.10.03 |
쇼핑몰 실시간재고 알림 봇 만들기 (2.텔레그램 Bot) (0) | 2020.05.04 |
쇼핑몰 실시간재고 알림 봇 만들기 (1.파이썬 웹 크롤링 + BeautifulSoup) (2) | 2020.03.29 |