From e55774b77093522eaa444890b011746bc76966b0 Mon Sep 17 00:00:00 2001 From: Ryan Hitchman Date: Thu, 22 Apr 2010 21:47:41 -0600 Subject: [PATCH] refactor http (and html, xml, json) handling into util/http.py (not done for dotnetpad), fix mtg, remove dict & goonsay --- plugins/babel.py | 11 ++---- plugins/bigassmessage.py | 10 ++---- plugins/dict.py | 62 ---------------------------------- plugins/down.py | 10 ++---- plugins/drama.py | 23 ++++--------- plugins/gcalc.py | 8 ++--- plugins/google.py | 16 ++++----- plugins/goonsay.py | 65 ----------------------------------- plugins/mtg.py | 19 ++++++----- plugins/pyexec.py | 11 +++--- plugins/religion.py | 25 ++++++-------- plugins/suggest.py | 11 +++--- plugins/tf.py | 19 +++++------ plugins/tinyurl.py | 15 +++------ plugins/twitter.py | 14 +++----- plugins/urbandictionary.py | 27 +++++++++++++++ plugins/urlhistory.py | 1 + plugins/util/http.py | 69 ++++++++++++++++++++++++++++++++++++++ plugins/validate.py | 12 +++---- plugins/weather.py | 10 ++---- plugins/wikipedia.py | 23 ++++++------- plugins/wolframalpha.py | 9 ++--- plugins/youtube.py | 12 +++---- 23 files changed, 191 insertions(+), 291 deletions(-) delete mode 100644 plugins/dict.py delete mode 100644 plugins/goonsay.py create mode 100644 plugins/urbandictionary.py create mode 100644 plugins/util/http.py diff --git a/plugins/babel.py b/plugins/babel.py index ea3b222..fea2dcc 100644 --- a/plugins/babel.py +++ b/plugins/babel.py @@ -1,9 +1,7 @@ -import urllib import htmlentitydefs import re -import json -from util import hook +from util import hook, http ########### from http://effbot.org/zone/re-sub.htm#unescape-html ############# @@ -37,11 +35,8 @@ language_pairs = zip(languages[:-1], languages[1:]) def goog_trans(text, slang, tlang): - req_url = 'http://ajax.googleapis.com/ajax/services/language/translate' \ - '?v=1.0&q=%s&langpair=%s' - url = req_url % (urllib.quote(text, safe=''), slang + '%7C' + tlang) - page = urllib.urlopen(url).read() - parsed = json.loads(page) + url = 'http://ajax.googleapis.com/ajax/services/language/translate?v=1.0' + parsed = http.get_json(url, q=text, langpair=(slang + '|' + tlang)) if not 200 <= parsed['responseStatus'] < 300: raise IOError('error with the translation server: %d: %s' % ( parsed['responseStatus'], '')) diff --git a/plugins/bigassmessage.py b/plugins/bigassmessage.py index 921b985..d4bc6b9 100644 --- a/plugins/bigassmessage.py +++ b/plugins/bigassmessage.py @@ -1,8 +1,4 @@ -import urllib - -from lxml import etree - -from util import hook +from util import hook, http @hook.command @@ -22,9 +18,7 @@ def bam(inp): params['theStyle'] = style params['theMessage'] = message - url = host + path + urllib.urlencode(params) - - response = etree.parse(url) + response = http.get_xml(host + path, params) status = response.xpath('//status/text()')[0] if status == 'ok': return host + response.xpath('//msgid/text()')[0] diff --git a/plugins/dict.py b/plugins/dict.py deleted file mode 100644 index c29b2e7..0000000 --- a/plugins/dict.py +++ /dev/null @@ -1,62 +0,0 @@ -import re -import urllib - -from lxml import html - -from util import hook - - -@hook.command('u') -@hook.command -def urban(inp): - '''.u/.urban -- looks up on urbandictionary.com''' - if not inp: - return urban.__doc__ - - url = 'http://www.urbandictionary.com/define.php?term=' + \ - urllib.quote(inp, safe='') - page = html.parse(url) - words = page.xpath("//td[@class='word']") - defs = page.xpath("//div[@class='definition']") - - if not defs: - return 'no definitions found' - - out = words[0].text_content().strip() + ': ' + ' '.join( - defs[0].text_content().split()) - - if len(out) > 400: - out = out[:out.rfind(' ', 0, 400)] + '...' - - return out - - -## A dictionary look-up plugin for Skybot made by Ghetto Wizard and Scaevolus - -@hook.command('dict') -@hook.command -def define(inp): - ".define/.dict -- fetches definition of " - - if not inp: - return define.__doc__ - - base_url = 'http://dictionary.reference.com/browse/' - - raw_data = urllib.urlopen(base_url + urllib.quote(inp, '')).read() - raw_data = raw_data.decode('utf-8') - - definition = html.fromstring(raw_data).xpath('//span[@class="dnindex"]' - ' | //div[@class="dndata"]') - - if not definition: - return 'No results for ' + inp - - result = ' '.join(section.text_content() for section in definition) - result = re.sub(r'\s+', ' ', result) - - if len(result) > 400: - result = result[:result.rfind(' ', 0, 400)] - result = re.sub(r'[^A-Za-z]+\.?$', '', result) + ' ...' #truncate - - return result diff --git a/plugins/down.py b/plugins/down.py index 7db4690..c6848a0 100644 --- a/plugins/down.py +++ b/plugins/down.py @@ -1,7 +1,6 @@ -import urllib2 import urlparse -from util import hook +from util import hook, http @hook.command @@ -18,10 +17,7 @@ def down(inp): # http://mail.python.org/pipermail/python-list/2006-December/589854.html try: - request = urllib2.Request(inp) - request.get_method = lambda: "HEAD" - http_file = urllib2.urlopen(request) - head = http_file.read() + http.get(inp, get_method='HEAD') return inp + ' seems to be up' - except urllib2.URLError: + except http.URLError: return inp + ' seems to be down' diff --git a/plugins/drama.py b/plugins/drama.py index 463e9d8..8541930 100755 --- a/plugins/drama.py +++ b/plugins/drama.py @@ -1,17 +1,11 @@ '''Searches Encyclopedia Dramatica and returns the first paragraph of the article''' -import json -from lxml import html -import urllib2 +from util import hook, http -from util import hook - -api_url = "http://encyclopediadramatica.com/api.php?action=opensearch&search=" +api_url = "http://encyclopediadramatica.com/api.php?action=opensearch" ed_url = "http://encyclopediadramatica.com/" -ua_header = ('User-Agent', 'Skybot/1.0 http://bitbucket.org/Scaevolus/skybot/') - @hook.command('ed') @hook.command @@ -21,18 +15,13 @@ def drama(inp): if not inp: return drama.__doc__ - q = api_url + (urllib2.quote(inp, safe='')) - request = urllib2.Request(q) - request.add_header(*ua_header) - j = json.loads(urllib2.build_opener().open(request).read()) + j = http.get_json(api_url, search=inp) if not j[1]: return 'no results found' - article_name = j[1][0].replace(' ', '_') + article_name = j[1][0].replace(' ', '_').encode('utf8') - url = ed_url + (urllib2.quote(article_name)) - request = urllib2.Request(url) - request.add_header(*ua_header) - page = html.fromstring(urllib2.build_opener().open(request).read()) + url = ed_url + http.quote(article_name, '') + page = http.get_html(url) for p in page.xpath('//div[@id="bodyContent"]/p'): if p.text_content(): diff --git a/plugins/gcalc.py b/plugins/gcalc.py index 479a1bb..b467c41 100644 --- a/plugins/gcalc.py +++ b/plugins/gcalc.py @@ -1,7 +1,6 @@ -import urllib2 import re -from util import hook +from util import hook, http @hook.command @@ -10,10 +9,7 @@ def calc(inp): if not inp: return calc.__doc__ - url = "http://www.google.com/search?q=" - request = urllib2.Request(url + urllib2.quote(inp, '')) - request.add_header('User-Agent', 'skybot') - page = urllib2.build_opener().open(request).read() + page = http.get('http://www.google.com/search', q=inp) # ugh, scraping HTML with regexes m = re.search(r'

(.*?)', page) diff --git a/plugins/google.py b/plugins/google.py index 85b3855..6f394f1 100644 --- a/plugins/google.py +++ b/plugins/google.py @@ -1,18 +1,14 @@ -import urllib import random -from lxml import html -import json -from util import hook +from lxml import html + +from util import hook, http def api_get(kind, query): - req_url = 'http://ajax.googleapis.com/ajax/services/search/%s?' \ - 'v=1.0&safe=off&q=%s' - query = query.encode('utf8') - url = req_url % (kind, urllib.quote(query, safe='')) - page = urllib.urlopen(url).read() - return json.loads(page) + url = 'http://ajax.googleapis.com/ajax/services/search/%s?' \ + 'v=1.0&safe=off' + return http.get_json(url % kind, q=query) @hook.command diff --git a/plugins/goonsay.py b/plugins/goonsay.py deleted file mode 100644 index c25e574..0000000 --- a/plugins/goonsay.py +++ /dev/null @@ -1,65 +0,0 @@ -import urllib2 -import json - -from util import hook - -#Scaevolus: factormystic if you commit a re-enabled goonsay I'm -# going to revoke your commit access -#@hook.command -#def goonsay(inp, say=None): -# say(' __________ /') -# say('(--[. ]-[ .] /') -# say('(_______o__)') - - -@hook.command -@hook.command('gs') -def goonsay(inp): - ".gs/.goonsay -- Get's the goonsay.com result for " - " or add a new :goonsay: to the database. With no args, random result." - - url = "http://goonsay.com/api/goonsays" - - req_headers = { - 'User-Agent': 'Skybot/1.0 http://bitbucket.org/Scaevolus/skybot/', - 'Content-Type': 'application/json', - } - - q = inp.split(' ', 1) - print q - - if len(q) == 2: - cmd = q[0] - args = q[1] - - if cmd == 'add': - try: - data = json.dumps({'text': args}) - req = urllib2.Request('%s/' % (url,), data, req_headers) - j = json.loads(urllib2.urlopen(req).read()) - except urllib2.HTTPError, e: - return e - return '#%d - %s' % (j['id'], j['text']) - else: - return goonsay.__doc__ - - if len(inp): - try: - req = urllib2.Request('%s/%d/' % (url, int(inp)), None, - req_headers) - j = json.loads(urllib2.urlopen(req).read()) - except urllib2.HTTPError, e: - if e.code == 410 or e.code == 404: - return 'There is no :goonsay: by that id' - return e - except ValueError: - return goonsay.__doc__ - return '#%d - %s' % (j['id'], j['text']) - - try: - req = urllib2.Request('%s/random/' % (url,), None, req_headers) - j = json.loads(urllib2.urlopen(req).read()) - except urllib2.HTTPError, e: - return e - - return '#%d - %s' % (j['id'], j['text']) diff --git a/plugins/mtg.py b/plugins/mtg.py index 85d56c0..20bb469 100644 --- a/plugins/mtg.py +++ b/plugins/mtg.py @@ -1,18 +1,21 @@ -from lxml import html import re -import urllib2 -from util import hook +from lxml import html + +from util import hook, http @hook.command def mtg(inp): ".mtg -- gets information about Magic the Gathering card " - url = 'http://magiccards.info/query.php?cardname=' - url += urllib2.quote(inp, safe='') - h = html.parse(url) - name = h.find('/body/table/tr/td/span/a') + if not inp: + return mtg.__doc__ + + url = 'http://magiccards.info/query?v=card&s=cname' + h = http.get_html(url, q=inp) + + name = h.find('body/table/tr/td/span/a') if name is None: return "no cards found" card = name.getparent().getparent().getparent() @@ -37,7 +40,7 @@ def mtg(inp): rarity_abbrevs.get(x[1], x[1])) for x in printings) - name.make_links_absolute() + name.make_links_absolute(base_url=url) link = name.attrib['href'] name = name.text_content().strip() type = type.strip() diff --git a/plugins/pyexec.py b/plugins/pyexec.py index 3887779..b6d0e3e 100644 --- a/plugins/pyexec.py +++ b/plugins/pyexec.py @@ -1,7 +1,6 @@ -import urllib import re -from util import hook +from util import hook, http re_lineends = re.compile(r'[\r\n]*') @@ -14,12 +13,12 @@ def py(inp): if not inp: return py.__doc__ - res = urllib.urlopen("http://eval.appspot.com/eval?statement=%s" % - urllib.quote(inp, safe='')).readlines() + res = http.get("http://eval.appspot.com/eval", statement=inp).splitlines() + if len(res) == 0: return res[0] = re_lineends.split(res[0])[0] if not res[0] == 'Traceback (most recent call last):': - return res[0] + return res[0].decode('utf8', 'ignore') else: - return res[-1] + return res[-1].decode('utf8', 'ignore') diff --git a/plugins/religion.py b/plugins/religion.py index 995a216..a627381 100644 --- a/plugins/religion.py +++ b/plugins/religion.py @@ -1,8 +1,4 @@ -import urllib - -from lxml import html - -from util import hook +from util import hook, http @hook.command('god') @@ -13,13 +9,14 @@ def bible(inp): if not inp: return bible.__doc__ - base_url = 'http://www.esvapi.org/v2/rest/passageQuery?key=IP&' \ - 'output-format=plain-text&include-heading-horizontal-lines&' \ - 'include-headings=false&include-passage-horizontal-lines=false&' \ - 'include-passage-references=false&include-short-copyright=false&' \ - 'include-footnotes=false&line-length=0&passage=' + base_url = ('http://www.esvapi.org/v2/rest/passageQuery?key=IP&' + 'output-format=plain-text&include-heading-horizontal-lines&' + 'include-headings=false&include-passage-horizontal-lines=false&' + 'include-passage-references=false&include-short-copyright=false&' + 'include-footnotes=false&line-length=0&' + 'include-heading-horizontal-lines=false') - text = urllib.urlopen(base_url + urllib.quote(inp)).read() + text = http.get(base_url, passage=inp) text = ' '.join(text.split()) @@ -38,11 +35,9 @@ def koran(inp): if not inp: return koran.__doc__ - base_url = 'http://quod.lib.umich.edu/cgi/k/koran/koran-idx?type=simple&q1=' + url = 'http://quod.lib.umich.edu/cgi/k/koran/koran-idx?type=simple' - raw_data = urllib.urlopen(base_url + urllib.quote(inp, '')).read() - - results = html.fromstring(raw_data).xpath('//li') + results = http.get_html(url, q1=inp).xpath('//li') if not results: return 'No results for ' + inp diff --git a/plugins/suggest.py b/plugins/suggest.py index ec39c81..e38762d 100644 --- a/plugins/suggest.py +++ b/plugins/suggest.py @@ -1,10 +1,8 @@ -import random -import urllib -import urllib2 -import re import json +import random +import re -from util import hook +from util import hook, http @hook.command @@ -23,8 +21,7 @@ def suggest(inp, inp_unstripped=''): else: num = 0 - url = 'http://google.com/complete/search?q=' + urllib.quote(inp, safe='') - page = urllib2.urlopen(url).read() + page = http.get('http://google.com/complete/search', q=inp) page_json = page.split('(', 1)[1][:-1] suggestions = json.loads(page_json)[1] if not suggestions: diff --git a/plugins/tf.py b/plugins/tf.py index cd6401b..04dc778 100644 --- a/plugins/tf.py +++ b/plugins/tf.py @@ -3,10 +3,7 @@ # This skybot plugin retreives the number of items # a given user has waiting from idling in Team Fortress 2. -import json -import urllib - -from util import hook +from util import hook, http @hook.command('hats') @@ -17,14 +14,16 @@ def tf(inp): if not inp: return tf.__doc__ - if inp.isdigit(): link = 'profiles' - else: link = 'id' + if inp.isdigit(): + link = 'profiles' + else: + link = 'id' + url = 'http://steamcommunity.com/%s/%s/tfitems?json=1' % \ - (link,urllib.quote(inp, safe='')) - raw_data = urllib.urlopen(url).read().decode('utf-8') + (link, http.quote(inp.encode('utf8'), safe='')) try: - inv = json.loads(raw_data) + inv = http.get_json(url) except ValueError: return '%s is not a valid profile' % inp @@ -41,4 +40,4 @@ def tf(inp): hats += 1 return '%s has had %s items and %s hats drop (%s total hats)' % \ - (inp,dropped,dhats,dhats+hats) \ No newline at end of file + (inp, dropped, dhats, dhats + hats) diff --git a/plugins/tinyurl.py b/plugins/tinyurl.py index 9285451..8c6c7f5 100644 --- a/plugins/tinyurl.py +++ b/plugins/tinyurl.py @@ -1,16 +1,9 @@ -import re -import urllib2 - -from util import hook +from util import hook, http -tinyurl_re = (r'http://(?:www\.)?tinyurl.com/([A-Za-z0-9\-]+)', - re.IGNORECASE) - - -@hook.regex(*tinyurl_re) +@hook.regex(r'(?i)http://(?:www\.)?tinyurl.com/([A-Za-z0-9\-]+)') def tinyurl(match): try: - return urllib2.urlopen(match.group()).url.strip() - except urllib2.URLError: + return http.open(match.group()).url.strip() + except http.URLError, e: pass diff --git a/plugins/twitter.py b/plugins/twitter.py index 16b5cc8..2b33401 100644 --- a/plugins/twitter.py +++ b/plugins/twitter.py @@ -3,13 +3,11 @@ twitter.py: written by Scaevolus 2009 retrieves most recent tweets """ -import re import random -import urllib2 -from lxml import etree +import re from time import strptime, strftime -from util import hook +from util import hook, http def unescape_xml(string): @@ -89,8 +87,8 @@ def twitter(inp): return 'error: invalid request' try: - xml = urllib2.urlopen(url).read() - except urllib2.HTTPError, e: + tweet = http.get_xml(url) + except http.HTTPError, e: errors = {400: 'bad request (ratelimited?)', 401: 'tweet is private', 404: 'invalid user/id', @@ -102,11 +100,9 @@ def twitter(inp): if e.code in errors: return 'error: ' + errors[e.code] return 'error: unknown' - except urllib2.URLerror, e: + except http.URLerror, e: return 'error: timeout' - tweet = etree.fromstring(xml) - if searching_hashtag: ns = '{http://www.w3.org/2005/Atom}' tweets = tweet.findall(ns + 'entry/' + ns + 'id') diff --git a/plugins/urbandictionary.py b/plugins/urbandictionary.py new file mode 100644 index 0000000..29cfc59 --- /dev/null +++ b/plugins/urbandictionary.py @@ -0,0 +1,27 @@ +import re + +from util import hook, http + + +@hook.command('u') +@hook.command +def urban(inp): + '''.u/.urban -- looks up on urbandictionary.com''' + if not inp: + return urban.__doc__ + + url = 'http://www.urbandictionary.com/define.php' + page = http.get_html(url, term=inp) + words = page.xpath("//td[@class='word']") + defs = page.xpath("//div[@class='definition']") + + if not defs: + return 'no definitions found' + + out = words[0].text_content().strip() + ': ' + ' '.join( + defs[0].text_content().split()) + + if len(out) > 400: + out = out[:out.rfind(' ', 0, 400)] + '...' + + return out diff --git a/plugins/urlhistory.py b/plugins/urlhistory.py index 396bdb2..fe839da 100644 --- a/plugins/urlhistory.py +++ b/plugins/urlhistory.py @@ -69,6 +69,7 @@ def urlinput(match, nick='', chan='', db=None, bot=None): db_init(db) url = urlnorm.normalize(match.group().encode('utf-8')) if url not in ignored_urls: + url = url.decode('utf-8') history = get_history(db, chan, url) insert_history(db, chan, url, nick) if nick not in dict(history): diff --git a/plugins/util/http.py b/plugins/util/http.py new file mode 100644 index 0000000..4baf039 --- /dev/null +++ b/plugins/util/http.py @@ -0,0 +1,69 @@ +# convenience wrapper for urllib2 & friends + +import json +import urllib +import urllib2 +import urlparse + +from urllib import quote, quote_plus +from urllib2 import HTTPError, URLError + +import lxml + +user_agent = 'Skybot/1.0 http://bitbucket.org/Scaevolus/skybot' + +ua_firefox = 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.6) ' \ + 'Gecko/20070725 Firefox/2.0.0.6' +ua_internetexplorer = 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)' + + +def get(*args, **kwargs): + return open(*args, **kwargs).read() + + +def get_html(*args, **kwargs): + return lxml.html.fromstring(get(*args, **kwargs)) + + +def get_xml(*args, **kwargs): + return lxml.etree.fromstring(get(*args, **kwargs)) + + +def get_json(*args, **kwargs): + return json.loads(get(*args, **kwargs)) + + +def open(url, query_params={}, user_agent=user_agent, post_data=None, + get_method=None, **kwargs): + query_params.update(kwargs) + + url = prepare_url(url, query_params) + + request = urllib2.Request(url, post_data) + + if get_method is not None: + request.get_method = lambda: get_method + + request.add_header('User-Agent', user_agent) + return urllib2.build_opener().open(request) + + +def prepare_url(url, queries): + if queries: + scheme, netloc, path, query, fragment = urlparse.urlsplit(url) + + query = dict(urlparse.parse_qsl(query)) + query.update(queries) + query = urllib.urlencode(dict((to_utf8(key), to_utf8(value)) + for key, value in query.iteritems())) + + url = urlparse.urlunsplit((scheme, netloc, path, query, fragment)) + + return url + + +def to_utf8(s): + if isinstance(s, str): + return s + else: + return s.encode('utf8', 'ignore') diff --git a/plugins/validate.py b/plugins/validate.py index fb8dae2..e41d373 100644 --- a/plugins/validate.py +++ b/plugins/validate.py @@ -4,17 +4,14 @@ Runs a given url through the w3c validator by Vladi ''' -import urllib -import urllib2 - -from util import hook +from util import hook, http @hook.command('val') @hook.command('valid') @hook.command def validate(inp): - '''.val/.valid/.validate -- runs url through w3c markup validator''' + ".val/.valid/.validate -- runs url through w3c markup validator" if not inp: return validate.__doc__ @@ -22,10 +19,9 @@ def validate(inp): if not inp.startswith('http://'): inp = 'http://' + inp - url = 'http://validator.w3.org/check?uri=%s' % urllib.quote(inp, '') - info = dict(urllib2.urlopen(url).info()) + url = 'http://validator.w3.org/check?uri=' + http.quote_plus(inp) + info = dict(http.open(url).info()) - print info status = info['x-w3c-validator-status'].lower() if status in ("valid", "invalid"): errorcount = info['x-w3c-validator-errors'] diff --git a/plugins/weather.py b/plugins/weather.py index c60acc2..aa8e51e 100644 --- a/plugins/weather.py +++ b/plugins/weather.py @@ -1,9 +1,6 @@ "weather, thanks to google" -from lxml import etree -import urllib - -from util import hook +from util import hook, http @hook.command @@ -25,9 +22,8 @@ def weather(inp, nick='', server='', reply=None, db=None): return weather.__doc__ loc = loc[0] - data = urllib.urlencode({'weather': loc.encode('utf-8')}) - url = 'http://www.google.com/ig/api?' + data - w = etree.parse(url).find('weather') + w = http.get_xml('http://www.google.com/ig/api', weather=loc) + w = w.find('weather') if w.find('problem_cause') is not None: return "Couldn't fetch weather data for '%s', try using a zip or " \ diff --git a/plugins/wikipedia.py b/plugins/wikipedia.py index 22f9d8f..08667e3 100644 --- a/plugins/wikipedia.py +++ b/plugins/wikipedia.py @@ -1,15 +1,13 @@ '''Searches wikipedia and returns first sentence of article Scaevolus 2009''' -import urllib2 -from lxml import etree import re -from util import hook +from util import hook, http api_prefix = "http://en.wikipedia.org/w/api.php" -search_url = api_prefix + "?action=opensearch&search=%s&format=xml" +search_url = api_prefix + "?action=opensearch&format=xml" paren_re = re.compile('\s*\(.*\)$') @@ -23,14 +21,7 @@ def wiki(inp): if not inp: return wiki.__doc__ - q = search_url % (urllib2.quote(inp, safe='')) - - request = urllib2.Request(q) - request.add_header('User-Agent', - 'Skybot/1.0 http://bitbucket.org/Scaevolus/skybot/') - opener = urllib2.build_opener() - xml = opener.open(request).read() - x = etree.fromstring(xml) + x = http.get_xml(search_url, search=inp) ns = '{http://opensearch.org/searchsuggest2}' items = x.findall(ns + 'Section/' + ns + 'Item') @@ -60,4 +51,10 @@ def wiki(inp): if len(desc) > 300: desc = desc[:300] + '...' - return '%s -- %s' % (desc, url) + return '%s -- %s' % (desc, http.quote(url, ':/')) + + +@hook.command +def dict(inp): + ".dict/.define -- gets definition of from Wiktionary" + pass diff --git a/plugins/wolframalpha.py b/plugins/wolframalpha.py index 6161623..aefcfe0 100644 --- a/plugins/wolframalpha.py +++ b/plugins/wolframalpha.py @@ -1,9 +1,6 @@ import re -import urllib2 -from lxml import html - -from util import hook +from util import hook, http @hook.command @@ -15,9 +12,9 @@ def wolframalpha(inp): if not inp: return wolframalpha.__doc__ - url = "http://www.wolframalpha.com/input/?i=%s&asynchronous=false" + url = "http://www.wolframalpha.com/input/?asynchronous=false" - h = html.parse(url % urllib2.quote(inp, safe='')) + h = http.get_html(url, i=inp) pods = h.xpath("//div[@class='pod ']") diff --git a/plugins/youtube.py b/plugins/youtube.py index bb80955..59aa463 100644 --- a/plugins/youtube.py +++ b/plugins/youtube.py @@ -1,11 +1,8 @@ -import json import locale import re import time -import urllib2 -from util import hook -from urllib import quote_plus +from util import hook, http locale.setlocale(locale.LC_ALL, '') @@ -15,12 +12,12 @@ youtube_re = (r'(?:youtube.*?(?:v=|/v/)|youtu\.be/|yooouuutuuube.*?id=)' base_url = 'http://gdata.youtube.com/feeds/api/' url = base_url + 'videos/%s?v=2&alt=jsonc' -search_api_url = base_url + 'videos?v=2&alt=jsonc&max-results=1&q=%s' +search_api_url = base_url + 'videos?v=2&alt=jsonc&max-results=1' video_url = "http://youtube.com/watch?v=%s" def get_video_description(vid_id): - j = json.load(urllib2.urlopen(url % vid_id)) + j = http.get_json(url % vid_id) if j.get('error'): return @@ -67,8 +64,7 @@ def youtube(inp): if not inp: return youtube.__doc__ - inp = quote_plus(inp) - j = json.load(urllib2.urlopen(search_api_url % (inp))) + j = http.get_json(search_api_url, q=inp) if 'error' in j: return 'error performing search'