import urllib
import urllib2
+__author__ = 'Ian Weller <ian@ianweller.org>'
+__version__ = '1.0.2'
+DEFAULT_UA = ('python-simplemediawiki/%s '
+ '+https://github.com/ianweller/python-simplemediawiki') \
+ % __version__
+
class MediaWiki():
"""
_high_limits = None
_namespaces = None
_psuedo_namespaces = None
+ _mediawiki_version = None
- def __init__(self, api_url, cookie_file=None):
+ def __init__(self, api_url, cookie_file=None, user_agent=DEFAULT_UA):
self._api_url = api_url
if cookie_file:
self._cj = cookielib.MozillaCookieJar(cookie_file)
self._cj.load()
else:
self._cj = cookielib.CookieJar()
- self._opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(self._cj))
+ self._opener = urllib2.build_opener(
+ urllib2.HTTPCookieProcessor(self._cj)
+ )
+ self._opener.addheaders = [('User-agent', user_agent)]
- def call(self, params):
- """
- Make a call to the wiki. Returns a dictionary that represents the JSON
- returned by the API.
- """
- params['format'] = 'json'
- request = urllib2.Request(self._api_url, urllib.urlencode(params))
+ def _fetch_http(self, url, params):
+ request = urllib2.Request(url, urllib.urlencode(params))
request.add_header('Accept-encoding', 'gzip')
response = self._opener.open(request)
if isinstance(self._cj, cookielib.MozillaCookieJar):
data = gzipper.read()
else:
data = response.read()
- return json.loads(data)
+ return data
+
+ def call(self, params):
+ """
+ Make a call to the wiki. Returns a dictionary that represents the JSON
+ returned by the API.
+ """
+ params['format'] = 'json'
+ return json.loads(self._fetch_http(self._api_url, params))
+
+ def normalize_api_url(self):
+ """
+ This function checks the given URL for a correct API endpoint and
+ returns that URL, while also helpfully setting this object's API URL to
+ it. If it can't magically conjure an API endpoint, it returns False.
+ """
+ data, data_json = self._normalize_api_url_tester(self._api_url)
+ if data_json:
+ return self._api_url
+ else:
+ # if there's an index.php in the URL, we might find the API
+ if 'index.php' in self._api_url:
+ test_api_url = self._api_url.split('index.php')[0] + 'api.php'
+ print test_api_url
+ test_data, test_data_json = \
+ self._normalize_api_url_tester(test_api_url)
+ print (test_data, test_data_json)
+ if test_data_json:
+ self._api_url = test_api_url
+ return self._api_url
+ return False
+
+ def _normalize_api_url_tester(self, api_url):
+ data = self._fetch_http(api_url, {'action': 'query',
+ 'meta': 'siteinfo',
+ 'siprop': 'general',
+ 'format': 'json'})
+ try:
+ data_json = json.loads(data)
+ # may as well set the version
+ try:
+ version_string = data_json['query']['general']['generator']
+ self._mediawiki_version = version_string.split(' ', 1)[1]
+ except KeyError:
+ pass
+ return (data, data_json)
+ except ValueError:
+ return (data, None)
def login(self, user, passwd, token=None):
"""
data['lgtoken'] = token
result = self.call(data)
if result['login']['result'] == 'Success':
+ self._high_limits = None
return True
elif result['login']['result'] == 'NeedToken' and not token:
return self.login(user, passwd, result['login']['token'])
else:
return False
+ def logout(self):
+ """
+ Conveinence function for logging out of the wiki.
+ """
+ data = {'action': 'logout'}
+ self.call(data)
+ self._high_limits = None
+ return True
+
def limits(self, low, high):
"""
Convenience function for determining appropriate limits in the API. If
objects.
"""
return iso8601.parse_date(date)
-
-
-__author__ = 'Ian Weller <ian@ianweller.org>'
-__version__ = '1.0'