def download_majors(username, password): # Create target URL college_pages = {} parameters = copy.copy(URL_PARAMS) url = SOURCE_URL + '?' + urllib.parse.urlencode(parameters) parameters['changeCollege'] = 'Next' parameters['call'] = '4' # Get viewstate s = cmu_auth.authenticate(url, username, password) for college in COLLEGES: parameters['college'] = college url = SOURCE_URL + '?' + urllib.parse.urlencode(parameters) export_page = s.get(url).content soup = bs4.BeautifulSoup(export_page) # _.map_(soup.select('option'),lambda x:print(_.strip_tags(x).split(' in '))) college_pages[college] = _.chain( soup.select('option')).map(lambda x: _.strip_tags(x)).map( lambda x: { 'name': x, 'department': x.split(' in ')[1], 'type': x.split(' in ')[0] }).value() return {'data': college_pages, 'auth': s}
def authenticate(username, password): # Login s = cmu_auth.authenticate(LOGIN_URL, username, password) login_page = s.get(LOGIN_URL) soup = bs4.BeautifulSoup(login_page.text) # Parse needed authenication token login_link = soup.find('a', {'id': 'HyperLink1'})['href'] login_link_queries = urllib.parse.urlparse(login_link)[4] hdnPersonAuth = urllib.parse.parse_qs(login_link_queries)['a2e'][0] return hdnPersonAuth
def authenticate(username, password): # Login s = cmu_auth.authenticate(LOGIN_URL, username, password) login_page = s.get(LOGIN_URL) soup = bs4.BeautifulSoup(login_page.text, 'html.parser') # Parse needed authenication token login_link = soup.find('a', {'id': 'HyperLink1'})['href'] login_link_queries = urllib.parse.urlparse(login_link)[4] hdnPersonAuth = urllib.parse.parse_qs(login_link_queries)['a2e'][0] # Add auth token to the form submission formdata['_ctl0:hdnPersonAuth'] = hdnPersonAuth return s.cookies[SESSION_ID_COOKIE]
def download_fces(div, username, password, authtoken): # Create target URL parameters = copy.copy(URL_PARAMS) parameters['div'] = div url = SOURCE_URL + '?' + urllib.parse.urlencode(parameters) # Build form input formdata = copy.copy(FORM_DATA) formdata['_ctl0:hdnPersonAuth'] = authtoken # Get viewstate s = cmu_auth.authenticate(url, username, password) export_page = s.get(url, data=formdata).content soup = bs4.BeautifulSoup(export_page) viewstate = soup.find('input', {'id': '__VIEWSTATE'})['value'] formdata['__VIEWSTATE'] = viewstate # Download output MSXML pst2 = s.post(url, data=formdata) return pst2.text
def download_fces(div, username, password, authtoken): # Create target URL parameters = copy.copy(URL_PARAMS) parameters['div'] = div url = SOURCE_URL + '?' + urllib.parse.urlencode(parameters) # Build form input formdata = copy.copy(FORM_DATA) formdata['_ctl0:hdnPersonAuth'] = authtoken print('URL: ',url) # Get viewstate s = cmu_auth.authenticate(url, username, password) export_page = s.get(url, data=formdata).content soup = bs4.BeautifulSoup(export_page) viewstate = soup.find('input', {'id': '__VIEWSTATE'})['value'] formdata['__VIEWSTATE'] = viewstate # Download output MSXML pst2 = s.post(url, data=formdata) return pst2.text
def download_majors(username, password): # Create target URL college_pages={} parameters = copy.copy(URL_PARAMS) url = SOURCE_URL + '?' + urllib.parse.urlencode(parameters) parameters['changeCollege']='Next' parameters['call']='4' # Get viewstate s = cmu_auth.authenticate(url, username, password) for college in COLLEGES: parameters['college']=college url = SOURCE_URL + '?' + urllib.parse.urlencode(parameters) export_page=s.get(url).content soup = bs4.BeautifulSoup(export_page) # _.map_(soup.select('option'),lambda x:print(_.strip_tags(x).split(' in '))) college_pages[college]=_.chain(soup.select('option')).map(lambda x: _.strip_tags(x)).map(lambda x: {'name':x,'department':x.split(' in ')[1], 'type':x.split(' in ')[0] }).value() return {'data':college_pages,'auth':s }
def get_courses(username, password, semester = 'S16'): try: s = authenticate('https://s3.andrew.cmu.edu/sio/index.html', username, password ) except KeyError: print("Incorrect Password") return None except: print("An error has occurred") return None user_data = requests.get("http://apis.scottylabs.org/directory/v1/andrewID/{}".format(username)).json() ics_file = s.get('https://s3.andrew.cmu.edu/sio/secure/export/schedule/{0}_semester.ics?semester={0}'.format(semester)).text cal = Calendar.from_ical(ics_file) with open('classes.json') as data_file: classes = json.load(data_file) day_map = {'SU': 0, 'MO': 1, 'TU': 2, 'WE': 3, 'TH': 4, 'FR': 5, 'SA': 6} course_data = {'user': user_data, 'courses': {}, 'schedule': []} for event in cal.walk(): if event.name != 'VEVENT': continue days = list(map(lambda day: day_map[day], event.get('rrule').get('byday'))) begin = event.get('dtstart').dt end = event.get('dtend').dt course_title, tmp = event.get('summary').split(" :: ") course_number, course_section = tmp.split(" ") instructors = [x.strip() for x in (event.get('description').split('\n\n')[1].split(":")[1].split(';'))] location = event.get('location').strip() if not (course_number in course_data['courses']): if (course_number in classes['courses']): course_data['courses'][course_number] = classes['courses'][course_number] for day in days: delta = timedelta(days = day - begin.isoweekday()) start_time = begin + delta end_time = end + delta duration = end_time - start_time course_data['schedule'].append({ 'title': "{}: {}".format(course_number, course_title), 'start': start_time.isoformat(), 'end': end_time.isoformat(), 'location': location, 'duration': str(duration), 'course': course_number, 'section': course_section, 'instructors': instructors }) return course_data