From 52b90119a683cb58ea7cd6ca4f1507a42f04aa4c Mon Sep 17 00:00:00 2001 From: Ryan Hitchman Date: Fri, 20 Sep 2013 14:04:58 -0700 Subject: [PATCH] plugins/google: use custom search API instead of (deprecated) AJAX api --- plugins/google.py | 45 +++++++++++++++------------------------------ 1 file changed, 15 insertions(+), 30 deletions(-) diff --git a/plugins/google.py b/plugins/google.py index d6eaf4a..af38e8f 100644 --- a/plugins/google.py +++ b/plugins/google.py @@ -3,49 +3,34 @@ import random from util import hook, http -def api_get(kind, query): - url = 'http://ajax.googleapis.com/ajax/services/search/%s?' \ - 'v=1.0&safe=off' - return http.get_json(url % kind, q=query) +def api_get(query, key, is_image=None, num=1): + url = ('https://www.googleapis.com/customsearch/v1?cx=007629729846476161907:ud5nlxktgcw' + '&fields=items(title,link,snippet)&safe=off' + ('&searchType=image' if is_image else '')) + return http.get_json(url, key=key, q=query, num=num) +@hook.api_key('google') @hook.command -def gis(inp): - '''.gis -- returns first google image result (safesearch off)''' +def gis(inp, api_key=None): + '''.gis -- finds an image using google images (safesearch off)''' - parsed = api_get('images', inp) - if not 200 <= parsed['responseStatus'] < 300: - raise IOError('error searching for images: %d: %s' % ( - parsed['responseStatus'], '')) - if not parsed['responseData']['results']: + parsed = api_get(inp, api_key, is_image=True, num=10) + if 'items' not in parsed: return 'no images found' - return random.choice(parsed['responseData']['results'][:10]) \ - ['unescapedUrl'] # squares is dumb + return random.choice(parsed['items'])['link'] +@hook.api_key('google') @hook.command('g') @hook.command -def google(inp): +def google(inp, api_key=None): '''.g/.google -- returns first google search result''' - parsed = api_get('web', inp) - if not 200 <= parsed['responseStatus'] < 300: - raise IOError('error searching for pages: %d: %s' % ( - parsed['responseStatus'], '')) - if not parsed['responseData']['results']: + parsed = api_get(inp, api_key) + if 'items' not in parsed: return 'no results found' - result = parsed['responseData']['results'][0] - - title = http.unescape(result['titleNoFormatting']) - content = http.unescape(result['content']) - - if len(content) == 0: - content = "No description available" - else: - content = http.html.fromstring(content).text_content() - - out = '%s -- \x02%s\x02: "%s"' % (result['unescapedUrl'], title, content) + out = u'{link} -- \x02{title}\x02: "{snippet}"'.format(**parsed['items'][0]) out = ' '.join(out.split()) if len(out) > 300: