Google App Engine UrlFetch - проблема с URL со специальными символами в них - PullRequest
1 голос
/ 10 марта 2011

Я использую Google Translate для преобразования фрагмента текста в речь с этим URL:
http://translate.google.com/translate_tts?tl=%s&q=%s
Где параметр tl содержит код языка языка текста, который вы хотите преобразовать вречь, а q содержит текст, который вы хотите преобразовать.

Обычные слова (без специальных символов) возвращают правильный аудиофайл.
Так что в моем приложении это то, что я делаю (no этокод языка для норвежского языка):

url = "http://translate.google.com/translate_tts?tl=%s&q=%s" % ('no', urllib.quote('kjendis'))
#url = http://translate.google.com/translate_tts?tl=no&q=kjendis
self.response.headers["Content-Type"] = "audio/mpeg"
self.response.out.write(urlfetch.fetch(url).content)

Это возвращает правильный звук.
Я использую простой веб-приложение, кстати.

Но когда у меня есть слово со специальным символом в нем(vår) что-то не так.Сгенерированный URL-адрес http://translate.google.com/translate_tts?tl=no&q=v%C3%A5r.(символ å корректно преобразуется в процентное кодирование)
При открытии этого URL-адреса в моем браузере я получаю правильный звук, но при использовании urlfetch.fetch для чтения того же URL-адреса возвращаемый звук не является правильным.

Что здесь не так?Я могу только предположить, что fetch как-то меняет URL.

1 Ответ

0 голосов
/ 11 марта 2011

Очевидно, что проблема не в проблеме App Engine, но она связана с тем, как URL-адрес Google Translate обрабатывает различные пользовательские агенты.

Пример:

#!/usr/bin/env python
#coding=utf-8

import urllib

class MyOpener(urllib.FancyURLopener):
    version = "App/1.7" #doesn't work
    version = "Mozilla/4.0 (MSIE 6.0; Windows NT 5.0)2011-03-10 15:38:34" #works

def textToSpeech(text, languageCode='en'):
    url = "http://translate.google.com/translate_tts?tl=%s&q=%s" % (languageCode, urllib.quote(text))
    myopener = MyOpener()
    return myopener.open(url, 'rb').read()

open('urllib.mp3', 'wb').write(textToSpeech('vår', 'no'))

При использовании строки пользовательского агента Firefox для MyOpener все работает как положено, но при использовании другой пользовательской строки возвращаемый звук не правильный.

...