# APIClients for grabbing data from popular web services # By Scott Gilbertson # Copyright is lame, take what you want, except for those portions noted # Dependencies: import sys, urllib import xml.etree.cElementTree as xml_parser DEBUG = 0 """ base class -- handles GoodReads.com, but works for any rss feed, just send an empty string for anything you don't need """ class APIClient: def __init__(self, base_path, api_key): self.api_key = api_key self.base_path = base_path def __getattr__(self, method): def method(_self=self, _method=method, **params): url = "%s%s?%s&" % (self.base_path, self.api_key, urllib.urlencode(params)) if DEBUG: print url data = self.fetch(url) return data return method def fetch(self, url): u = urllib.FancyURLopener(None) usock = u.open(url) rawdata = usock.read() if DEBUG: print rawdata usock.close() return xml_parser.fromstring(rawdata) """ Extend APIClient to work with the ma.gnolia.com API (http://wiki.ma.gnolia.com/Ma.gnolia_API) Adds some error handling as well """ class MagnoliaError(Exception): def __init__(self, code, message): self.code = code self.message = message def __str__(self): return 'Magnolia Error %s: %s' % (self.code, self.message) class MagnoliaClient(APIClient): def __getattr__(self, method): def method(_self=self, _method=method, **params): url = "%s%s?%s&api_key=%s" % (self.base_path, _method, urllib.urlencode(params), self.api_key) if DEBUG: print url data = APIClient.fetch(self, url) return data return method """ Extend APIClient to work with the Flickr API (http://www.flickr.com/services/api/) Adds error handling as well """ class FlickrError(Exception): def __init__(self, code, message): self.code = code self.message = message def __str__(self): return 'Flickr Error %s: %s' % (self.code, self.message) class FlickrClient(APIClient): def __getattr__(self, method): def method(_self=self, _method=method, **params): _method = _method.replace("_", ".") url = "%s?method=%s&%s&api_key=%s" % (self.base_path, _method, urllib.urlencode(params), self.api_key) if DEBUG: print url data = APIClient.fetch(self, url) return data return method class TumblrClient: def __init__(self, base_path): self.base_path = base_path def __getattr__(self, method): def method(_self=self, _method=method, **params): url = "%s" % (self.base_path) if DEBUG: print url data = self.fetch(url) return data return method def fetch(self, url): u = urllib.FancyURLopener(None) usock = u.open(url) rawdata = usock.read() if DEBUG: print rawdata usock.close() return xml_parser.fromstring(rawdata)