Google App Engine UrlFetch - 处理包含特殊字符的URL的问题

1 投票
1 回答
1158 浏览
提问于 2025-04-16 13:23

我正在使用谷歌翻译把一段文字转换成语音,使用的链接是:
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)时,就出现问题了。 生成的链接是 http://translate.google.com/translate_tts?tl=no&q=v%C3%A5r。(这里的 å 被正确地转换成了百分比编码)
当我在浏览器中打开这个链接时,能听到正确的声音,但当我用 urlfetch.fetch 来读取同样的链接时,返回的声音就不对了。

这里出了什么问题呢?我只能猜测 fetch 可能在某种程度上改变了这个链接。

1 个回答

0

显然,这个问题不是出在App Engine上,而是和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一切正常,但如果使用其他用户代理字符串,返回的声音就不对了。

撰写回答