def get_syllabus_url(class_name, preview): """ Return the Coursera index/syllabus URL, depending on if we want to only preview or if we are enrolled in the course. """ class_type = 'preview' if preview else 'index' page = CLASS_URL.format(class_name=class_name) + '/lecture/' + class_type logging.debug('Using %s mode with page: %s', class_type, page) return page
def get_syllabus_url(class_name, preview): """ Return the Coursera index/syllabus URL. The returned result depends on if we want to only use a preview page or if we are enrolled in the course. """ class_type = "preview" if preview else "index" page = CLASS_URL.format(class_name=class_name) + "/lecture/" + class_type logging.debug("Using %s mode with page: %s", class_type, page) return page
def do_we_have_valid_cookies(session, class_name): """ Checks whether we have all the required cookies to authenticate on class.coursera.org, and if they are not yet stale. """ if not do_we_have_enough_cookies(session.cookies, class_name): return False url = CLASS_URL.format(class_name=class_name) + "/class" r = session.head(url, allow_redirects=False) if r.status_code == 200: return True else: logging.debug("Stale session.") return False
def login(session, class_name, username, password): """ Login on www.coursera.org with the given credentials. This adds the following cookies to the session: sessionid, maestro_login, maestro_login_flag """ try: session.cookies.clear('www.coursera.org') except KeyError: pass # Hit class url to obtain csrf_token class_url = CLASS_URL.format(class_name=class_name) r = requests.get(class_url, allow_redirects=False) try: r.raise_for_status() except requests.exceptions.HTTPError as e: logging.error(e) raise ClassNotFound(class_name) csrftoken = r.cookies.get('csrf_token') if not csrftoken: raise AuthenticationFailed('Did not recieve csrf_token cookie.') # Now make a call to the authenticator url. headers = { 'Cookie': 'csrftoken=' + csrftoken, 'Referer': 'https://www.coursera.org', 'X-CSRFToken': csrftoken, } data = { 'email_address': username, 'password': password } r = session.post(AUTH_URL, data=data, headers=headers, allow_redirects=False) try: r.raise_for_status() except requests.exceptions.HTTPError: raise AuthenticationFailed('Cannot login on www.coursera.org.') logging.info('Logged in on www.coursera.org.')
def validate_cookies(session, class_name): """ Checks whether we have all the required cookies to authenticate on class.coursera.org. Also check for and remove stale session. """ if not do_we_have_enough_cookies(session.cookies, class_name): return False url = CLASS_URL.format(class_name=class_name) + '/class' r = session.head(url, allow_redirects=False) if r.status_code == 200: return True else: logging.debug('Stale session.') try: session.cookies.clear('.coursera.org') except KeyError: pass return False
def login(session, class_name, username, password): """ Login on www.coursera.org with the given credentials. This adds the following cookies to the session: sessionid, maestro_login, maestro_login_flag """ try: session.cookies.clear("www.coursera.org") except KeyError: pass # Hit class url to obtain csrf_token class_url = CLASS_URL.format(class_name=class_name) r = requests.get(class_url, allow_redirects=False) try: r.raise_for_status() except requests.exceptions.HTTPError as e: logging.error(e) raise ClassNotFound(class_name) csrftoken = r.cookies.get("csrf_token") if not csrftoken: raise AuthenticationFailed("Did not recieve csrf_token cookie.") # Now make a call to the authenticator url. headers = {"Cookie": "csrftoken=" + csrftoken, "Referer": "https://www.coursera.org", "X-CSRFToken": csrftoken} data = {"email_address": username, "password": password} r = session.post(AUTH_URL, data=data, headers=headers, allow_redirects=False) try: r.raise_for_status() except requests.exceptions.HTTPError: raise AuthenticationFailed("Cannot login on www.coursera.org.") logging.info("Logged in on www.coursera.org.")
def login(session, username, password, class_name=None): """ Login on coursera.org with the given credentials. This adds the following cookies to the session: sessionid, maestro_login, maestro_login_flag """ logging.debug('Initiating login.') try: session.cookies.clear('.coursera.org') logging.debug('Cleared .coursera.org cookies.') except KeyError: logging.debug('There were no .coursera.org cookies to be cleared.') # Hit class url if class_name is not None: class_url = CLASS_URL.format(class_name=class_name) r = requests.get(class_url, allow_redirects=False) try: r.raise_for_status() except requests.exceptions.HTTPError as e: logging.error(e) raise ClassNotFound(class_name) # csrftoken is simply a 20 char random string. csrftoken = random_string(20) # Now make a call to the authenticator url. csrf2cookie = 'csrf2_token_%s' % random_string(8) csrf2token = random_string(24) cookie = "csrftoken=%s; %s=%s" % (csrftoken, csrf2cookie, csrf2token) logging.debug('Forging cookie header: %s.', cookie) headers = { 'Cookie': cookie, 'X-CSRFToken': csrftoken, 'X-CSRF2-Cookie': csrf2cookie, 'X-CSRF2-Token': csrf2token, } data = { 'email': username, 'password': password, 'webrequest': 'true' } # Auth API V3 r = session.post(AUTH_URL_V3, data=data, headers=headers, allow_redirects=False) try: r.raise_for_status() # Some how the order of cookies parameters are important # for coursera!!! v = session.cookies.pop('CAUTH') session.cookies.set('CAUTH', v) except requests.exceptions.HTTPError: raise AuthenticationFailed('Cannot login on coursera.org.') logging.info('Logged in on coursera.org.')