import zephyr import feedparser import pycurl from BeautifulSoup import BeautifulSoup """Screen scrapes jira.mit.edu. Supposedly. Doesn't actually work yet. You need to have a personal certificate named cert.pem in this directory to run this script. You also need the abovementioned scripts. The zephyr bindings can be gotten from ebroder's GitHub repository located: http://github.com/ebroder/python-zephyr/tree/master SSL server CA authentication is disabled because we don't know how to make curl stop complaining. Current difficulty is we are causing a NullPointer exception on (we think) touchstone's servers.""" class Browser(object): def __init__(self, **kwargs): self.opts = kwargs self.lastResult = None def _callback(self, buf): self.lastResult += buf def get(self, url): c = pycurl.Curl() c.setopt(c.URL, url) c.setopt(c.WRITEFUNCTION, self._callback) for k,v in self.opts.items(): c.setopt(getattr(c, k), v) self.lastResult = '' c.perform() return self.lastResult def getPage(self, url): return Page(url, self.get(url), self) class Page(object): def __init__(self, url, contents, browser): self.url = url self.soup = BeautifulSoup(contents) self.browser = browser def submitForm(self, name, args ={}): form = self.soup.find(name='form', attrs={"name": name}) if form == None: return False dest = form.get('action', self.url) # this has a lot of edge-cases that don't work inputs = form.findAll(name='input') vals = {} for input in inputs: vals[input[name]] = input[value] for k,v in args.items(): vals[k] = v return self.browser.getPage() b = Browser( SSLCERT = "cert.pem", SSLKEY = "cert.pem", SSL_VERIFYPEER = 0, COOKIEJAR = "jirabot.cookie", FOLLOWLOCATION = 1, AUTOREFERER = 1, HTTPHEADER = ["Accept-Language: en-us,en;q=0.5"], ) b.get("https://jira.mit.edu/jira/secure/Dashboard.jspa") page = b.getPage("https://jira.mit.edu/jira/secure/mit_login.jsp?os_destination=/secure/Dashboard.jspa") print page.submitForm('wayfForm1') #c.setopt(c.URL, "https://jira.mit.edu/jira/sr/jira.issueviews:searchrequest-rss/temp/SearchRequest.xml?&pid=10185&updated%3Aprevious=-1w&sorter/field=updated&sorter/order=DESC&tempMax=1000") #d = feedparser.parse(t.contents) #print d