0

ファイル (この場合は audio/mp3) を App Engine ブロブストアに保存しようとしていますが、うまくいきません。すべてが機能しているように見え、ファイルは適切なタイプのブロブストアに保存されますが、本質的に空 (1.5kB 対予想される 6.5kB) であるため、再生されません。問題の URL は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はあなたに満足しないでしょう. 彼らはユーザーに使ってほしいGoogle Translate APIサービスを提供していますが、「広範な悪用による実質的な経済的負担」のために、その API の無料オプションをすべて廃止しました。ページをスクレイピングして Google の API 価格設定を回避する Google App Engine Web サービスを公開しようとすることは、おそらく彼らが顧客に喜ばれるようなことではありません。

于 2013-05-24T23:08:09.950 に答える