0

我正在尝试将文件(在本例中为音频/mp3)保存到 App Engine blobstore,但成功率参差不齐。一切似乎都正常,一个文件保存在 blobstore 中,类型正确,但它基本上是空的(1.5kB 与预期的 6.5kB),因此无法播放。有问题的网址是http://translate.google.com/translate_tts?ie=UTF-8&tl=en&q=revenues+in+new+york+were+56+million

应用引擎日志没有显示任何异常 - 所有部分都按预期执行......任何指针将不胜感激!

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)
4

1 回答 1

2

该问题与您的代码无关;它正确地从您提供的 URL 中检索数据。

例如,如果我在命令行尝试这个:

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

我收到一个 1.5kB 403 错误页面,其内容显示:

403. 这是一个错误。

您的客户端无权从此服务器获取 URL /translate_tts?ie=UTF-8&tl=en&q=revenues+in+new+york+were+56+million。(客户端 IP 地址:1.2.3.4)

我们知道的就这些。

您的代码执行完全相同的操作,无论是在 GAE 中运行还是直接在交互式解释器中运行。

最有可能的是,它在您的浏览器中运行的原因是您确实拥有权限。那么,这意味着什么?这可能意味着您的浏览器中有来自 google.com 的有效 SID cookie,但不是您的脚本。或者这可能意味着您的浏览器的用户代理被识别为可以播放 HTML5 音频的东西,但您的脚本不是。或者……</p>

好吧,您可以尝试对浏览器和脚本之间的 cookie、标头等中的不同之处进行逆向工程,并将其缩小到相关差异,并使用显式标头或 cookie 或任何您需要解决的问题.

但下次谷歌改变任何东西时,它就会崩溃。

如果您尝试这样做,Google 可能不会对您满意。他们提供了他们希望您使用的Google 翻译 API服务,并且由于“广泛滥用造成的巨大经济负担”,他们放弃了该 API 的所有免费选项。试图发布通过抓取页面来规避 Google API 定价的 Google App Engine Web 服务可能不是他们喜欢客户做的事情。

于 2013-05-24T23:08:09.950 回答