파이썬 requests 파일 POST 오류 (인코딩??)

조회수 2249회

텔레그램 봇으로 파일을 보내기 위해 https://api.telegram.org/bot~~~/sendaudio 에 POST 요청을 보내려고 합니다.

URL = 'https://api.telegram.org/bot<...>/sendaudio'
VALUE = {'chat_id': '<...>'}
FILE = {'audio': open('a.mp3', 'rb')}

r = requests.post(URL, data=VALUE, files=FILE)

이런 식으로 실행하면 정상적으로 파일이 전송되고 서버측에서 응답이 돌아옵니다.

그런데 파일명을

FILE = {'audio': open('あ.mp3', 'rb')} 라던가 FILE = {'audio': open('가.mp3', 'rb')}

이런식으로 하고 동일하게 실행시키면 서버측에서 audio 를 전달받지 못했다는 응답이 돌아옵니다. Postman을 통해 전송하면 정상적으로 동작하는 것으로 보아 requests 사용 과정에서 발생하는 오류인 것 같은데 혹시 어떻게 하면 해결할 수 있을까요? ㅠㅠ 아니면 다른 방법으로 동일한 기능을 구현할 수 있는 방법이 있는지 궁금합니다...

  • (•́ ✖ •̀)
    알 수 없는 사용자
  • python 버전을 알려주시기 바랍니다. 정영훈 2018.12.18 07:10

2 답변

  • 아래의 codecs 모듈의 open 함수를 이용해보시기 바랍니다.

    import codecs
    codecs.open(u'한글파일명.mp3', 'rb')
    
  • 파이썬 3.5.3 버전을 사용중입니다...

    >>> FILE = {u'audio': codecs.open(u'안녕.mp3', 'rb')}
    >>> r = requests.post(URL, data=VALUE, files=FILE)
    >>> r
    <Response [413]>
    >>> r = requests.post(URL, data=VALUE, files=FILE)
    >>> r
    <Response [400]>
    >>> r = requests.post(URL, data=VALUE, files=FILE)
    >>> r
    <Response [400]>
    >>> r
    <Response [400]>
    >>> FILE = {u'audio': codecs.open(u'안녕.mp3', 'rb')}
    >>> r = requests.post(URL, data=VALUE, files=FILE)
    >>> r
    <Response [413]>
    >>> r = requests.post(URL, data=VALUE, files=FILE)
    >>> r
    <Response [400]>
    >>> r = requests.post(URL, data=VALUE, files=FILE)
    >>> r
    <Response [400]>
    

    다시 확인하면서 여러번 시도 해보니 이런 식으로 파일 객체 생성 후 처음 보내는 요청에는 413 응답이 돌아오지만 나머지는 400으로 돌아오네요 ㅠㅠ 텔레그램 서버 측에서 문제가 있는 같기도 하고... 잘 모르겠네요... ㅠㅠㅠㅠ

    • (•́ ✖ •̀)
      알 수 없는 사용자
    • 윈도우인가요? 윈도우라면 py 파일로 작성하시고 파일 상단에 #-*- coding:utf-8 -*- 를 추가하여 실행해보세요. 정영훈 2018.12.18 12:13
    • 400 에러는 질문자님이 요청을 잘못 보내고 있다는 bad request 에러입니다. 텔레그램 문제가 아닐겁니다. 엽토군 2018.12.18 12:14
    • 400 에러 bad request 라는 것이죠. 문제는 http 오류는 서버에서 custom 하게 throw 할 수도 있다는 것이죠 텔레그렘쪽에서 허용하지 않는 문자인 경우 400 에러 던지도록 구성하면 그만이니까요. 또한 질문에도 영문인 경우는 문제가 없다는 경우라서 말이죠. 정영훈 2018.12.20 03:05
    • open(unicode(파일명, 'euc-kr')) 하는식으로 파일명을 문자셋 변환해 보세요. 엽토군 2018.12.20 10:02

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)