Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- # A simple scratch wiki interface. Can:
- # * list pages in category
- # * read page (download wiki markup)
- # ~blob8108
- # http://wiki.scratch.mit.edu/
- import httplib2
- from urllib import urlencode
- import json
- class WikiError(Exception):
- def __init__(self, error):
- self.info = None
- self.__dict__.update(error)
- def __str__(self):
- return self.info
- class PermissionDenied(WikiError): pass
- ERRORS = {
- 'permissiondenied': PermissionDenied,
- }
- class Page(object):
- def __init__(self, wiki, **data):
- self.wiki = wiki
- self.title = None
- self.__dict__.update(data)
- def __repr__(self):
- return "<Page(%s)>" % repr(self.title)
- def __unicode__(self):
- return self.title
- def query_info(self, **kwargs):
- arguments = dict(
- action = "query",
- titles = self.title,
- )
- arguments.update(kwargs)
- data = self.wiki.request(**arguments)
- page_data = data["query"]["pages"].values()[0]
- return page_data
- def read(self):
- data = self.query_info(
- prop = "revisions",
- rvprop = "content",
- )
- return data["revisions"][0]["*"]
- def edit_token(self):
- data = self.query_info(
- prop = "info",
- intoken = "edit",
- )
- return data["edittoken"]
- def edit(self, content, summary):
- token = self.edit_token()
- return self.wiki.post_request(
- action = "edit",
- title = self.title,
- token = token,
- text = content,
- summary = summary,
- bot = 1,
- nocreate = 1,
- )
- class ScratchWiki(object):
- URL = "http://wiki.scratch.mit.edu/"
- API_ENDPOINT = URL + "api.php"
- USER_AGENT = "PythonBot ~blob8108"
- def __init__(self):
- self.http = httplib2.Http()
- def login(self, username, password):
- # Seems broken -- maybe API login is disabled?
- arguments = dict(
- action = "login",
- lgname = username,
- lgpassword = password,
- )
- data = self.post_request(**arguments)["login"]
- print data
- if data["result"] == "NeedToken":
- arguments["lgtoken"] = data["token"]
- data = self.post_request(**arguments)["login"]
- return data
- # Login using HTML form
- # return self.request(
- # _url = self.URL + "index.php",
- # _method = "POST",
- # _form = dict(
- # wpName = username,
- # wpPassword = password,
- # wpRemember = 1,
- # wpLoginattempt = "Log in",
- # wpLoginToken = "70a839b065603b5dfc4d5da213a3b197",
- # ),
- # title = "Special:UserLogin",
- # action = "submitlogin",
- # type = "login",
- # )
- def request(self, **arguments):
- arguments = dict(filter(lambda (arg, value): value is not None, arguments.items()))
- arguments["format"] = "json"
- is_json = True
- url = self.API_ENDPOINT + "?" + urlencode(arguments)
- arguments.setdefault("_url", url)
- url = arguments.pop("_url")
- arguments.setdefault("_method", "GET")
- method = arguments.pop("_method")
- arguments.setdefault("_headers", {
- "User-Agent": self.USER_AGENT,
- })
- headers = arguments.pop("_headers")
- body = None
- arguments.setdefault("_form", None)
- form = arguments.pop("_form")
- if form:
- body = urlencode(form)
- headers.update({
- "Content-Type": "application/x-www-form-urlencoded",
- })
- is_json = False
- (response, data) = self.http.request(url, method, body, headers)
- assert response["status"] == "200"
- if is_json:
- data = json.loads(data)
- if 'error' in data:
- error = data['error']
- error_code = error['code']
- if error_code in ERRORS:
- error_cls = ERRORS[error_code]
- else:
- raise WikiError(error)
- raise error_cls(error)
- return data
- def post_request(self, **arguments):
- return self.request(_method = "POST", **arguments)
- def category_members(self, title, limit = 500):
- if not title.startswith("Category:"):
- title = "Category:" + title
- start_from = None
- while 1:
- data = self.request(
- action = "query",
- list = "categorymembers",
- cmtitle = title,
- cmlimit = limit,
- cmcontinue = start_from,
- )
- for page in data["query"]["categorymembers"]:
- yield Page(self, **page)
- if "query-continue" in data:
- start_from = data["query-continue"]["categorymembers"]["cmcontinue"]
- else:
- break
- wiki = ScratchWiki()
- #for page in wiki.category_members("Redirects"):
- # print page.title
- page = wiki.category_members("Redirects").next()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement