2013-05-24 1 views
0

파일 (이 경우 오디오/mp3)을 App Engine blobstore에 저장하려하지만 성공했습니다. 모든 것이 제대로 작동하는 것으로 보입니다. 파일은 올바른 유형의 blobstore에 저장되지만 본질적으로 비어 있습니다 (1.5kB 대 예상 6.5kB). 따라서 재생되지 않습니다. 문제의 URL은 http://translate.google.com/translate_tts?ie=UTF-8&tl=en&q=revenues+in+new+york+were+56+millionURL에서 오디오/mp3 파일 가져 오기 및 blobstore에 저장

입니다. 앱 엔진 로그에는 이상한 부분이 표시되지 않습니다. 모든 부분이 예상대로 실행되고 있습니다 ... 어떤 포인터라도 감사 할 것입니다!

class Dictation(webapp2.RequestHandler): 
    def post(self): 
    sentence = self.request.get('words') 

    # Google Translate API cannot handle strings > 100 characters 
    sentence = sentence[:100] 

    # Replace the non-alphanumeric characters 
    # The spaces in the sentence are replaced with the Plus symbol 
    sentence = urllib.urlencode({'q': sentence}) 

    # Name of the MP3 file generated using the MD5 hash 
    mp3_file = hashlib.md5(sentence).hexdigest() 

    # Save the MP3 file in this folder with the .mp3 extension 
    mp3_file = mp3_file + ".mp3" 

    # Create the full URL 
    url = 'http://translate.google.com/translate_tts?ie=UTF-8&tl=en&' + sentence 

    # upload to blobstore 
    mp3_file = files.blobstore.create(mime_type = 'audio/mp3', _blobinfo_uploaded_filename = mp3_file) 
    mp3 = urllib.urlopen(url).read() 

    with files.open(mp3_file, 'a') as f: 
     f.write(mp3) 

    files.finalize(mp3_file) 

    blob_key = files.blobstore.get_blob_key(mp3_file) 
    logging.info('blob_key identified as %s', blob_key) 

답변

2

문제는 코드와 관련이 없습니다. URL에서 데이터를 올바르게 검색하고 있습니다. 내가 명령 줄에서이 작업을 시도하는 경우

예를 들어, : 오류의

403 :

$ curl -O http://translate.google.com/translate_tts?ie=UTF-8&tl=en&q=revenues+in+new+york+were+56+million 

나는 그 내용이 말하는 1.5KB 403 오류 페이지를 얻을.

클라이언트가이 서버에서 URL/translate_tts 즉, UTF-8 & tl = kO & q = 수익 + 신규 + york +을 (를) 얻을 수있는 권한이 없습니다. (클라이언트 IP 주소 : 1.2.3.4)

그게 전부입니다.

그리고 코드는 GAE에서 실행 되든 대화식 인터프리터에서 직접 실행 되든 정확히 동일합니다.

대부분의 경우 브라우저에서 작동하는 이유는 입니다.에 권한이 있습니다. 그럼, 그게 무슨 뜻 이죠? 브라우저에 google.com의 유효한 SID 쿠키가 있지만 스크립트는 아닙니다. 또는 브라우저의 사용자 에이전트가 HTML5 오디오를 재생할 수있는 것으로 인식되지만 스크립트는 그렇지 않습니다. 또는 ...

글쎄, 브라우저와 스크립트 사이의 쿠키, 헤더 등의 내용을 리버스 엔지니어링하여 해당 차이점을 좁히고 명시 적 헤더 또는 쿠키 또는 문제를 해결해야합니다.

하지만 다음번에 Google에서 변경 사항을 적용하면 중단됩니다.

그리고 시도해도 Google이 사용자에게 만족하지 않을 수 있습니다. 그들은 당신이 사용하기를 원했던 Google Translate API 서비스를 제공하고 "광범위한 학대로 인한 상당한 경제적 부담"때문에 해당 API에 대한 모든 무료 옵션을 없앴습니다. 페이지를 스크랩하여 Google의 API 가격 정책을 회피하는 Google App Engine 웹 서비스를 게시하려고 시도하는 것은 고객이 즐기는 것과 다를 수 있습니다.