Language specific redirect
I want to create simple application that detects language(using Google API) of phrase and send it to corresponded search engine. For example, if search query is in Russian then I need to redirect it to Yandex.ru in all other cases to Google.
That's how I do this:
def get(self):
decoded = unicode(unquote(self.request.query), "windows-1251")
text = decoded.encode("utf-8")
url = "http://ajax.googleapis.com/ajax/services/language/detect?v=1.0&q="+ quote(text)
try:
data = json.loads(urllib2.urlopen(url).read())
redirectUrl = "http://www.google.com/sea开发者_StackOverflow中文版rch?q=" + text
if data["responseData"]["language"] == 'ru':
redirectUrl = "http://yandex.ru/yandsearch?text=" + text
self.redirect(redirectUrl)
except urllib2.HTTPError, e:
self.response.out.write( "HTTP error: %d" % e.code )
except urllib2.URLError, e:
self.response.out.write( "Network error: %s" % e.reason.args[1])
When I request this url "http://findinrightplace.appspot.com/q?test query" it redirects to google but redirection to yandex doesn't work (http://findinrightplace.appspot.com/q?тестовый запрос).
What I'm doing wrong?
You need to remove quote() from url = "http://ajax.googleapis.com/ajax/services/language/detect?v=1.0&q="+ quote(text)
, its returning a bad result for your Russian query.
I tested your code in my local python shell and it worked without quote(), but did not work with quote().
You are incorrect in assuming that the query string will be windows-1251 encoded. In the link you give, it's up to the web browser on how to encode it (since HTTP is also silent as to what the encoding of URLs should be). However, today, most browsers will assume that the URL must be encoded in UTF-8. As then language/detect also assumes that the query string is UTF-8 encoded (and URL escaped), you neither need to unquote nor decode the string at all. Also, yandex supports UTF-8 encoded query strings just fine. So putting this all together: try
def get(self):
text = self.request.query
url = "http://ajax.googleapis.com/ajax/services/language/detect?v=1.0&q=" + text
try:
data = json.loads(urllib2.urlopen(url).read())
redirectUrl = "http://www.google.com/search?q=" + text
if data["responseData"]["language"] == 'ru':
redirectUrl = "http://yandex.ru/yandsearch?text=" + text
self.redirect(redirectUrl)
except urllib2.HTTPError, e:
self.response.out.write( "HTTP error: %d" % e.code )
except urllib2.URLError, e:
self.response.out.write( "Network error: %s" % e.reason.args[1])
I suggest using the Google Prediction API [http://code.google.com/apis/predict/]. You'll notice that the example on the main page is exactly what you are trying to do.
You're not quoting text
when building redirectUrl
. Try:
...
redirectUrl = "http://www.google.com/search?q=" + quote(text)
if data["responseData"]["language"] == 'ru':
redirectUrl = "http://yandex.ru/yandsearch?text=" + quote(text)
...
精彩评论