(set(emails.keys()) - set(groups.keys()))) print("In Groups but not Users: %r" % (set(groups.keys()) - set(emails.keys()))) raise Exception("Different username sets") for username in emails.keys(): groups[username].update(emails[username]) return groups def print_groups_and_emails(session): by_group = {} users = fetch_groups_and_emails(session) for user in users.values(): groups = [name for name, group_id in user['groups']] for group in groups or ['no group']: by_group.setdefault(group, []).append(user) for group_name in sorted(by_group.keys()): print("%s:\n" % group_name) group_users = by_group[group_name] group_users = sorted(group_users, key=lambda u: (u['role'], u['first_name'], u['last_name'])) for user in group_users: print("\"%s %s\" <%s>," % (user['first_name'], user['last_name'], user['email'])) print('') if __name__ == "__main__": blackboard.wrapper(print_groups_and_emails)
return [row[title_col] for row in rows] def get_thread_ids(session, forum_id): url = ('https://bb.au.dk/webapps/discussionboard/do/forum' + '?action=list_threads&nav=discussion_board' + '&course_id=%s' % session.course_id + '&conf_id=%s&forum_id=%s' % forum_id + '&showAll=true') r = session.get(url) document = html5lib.parse(r.content, encoding=r.encoding) return parse_thread_ids(document) def parse_thread_ids(document): form = document.find('.//h:form[@name="forumForm"]', NS) # Seemingly used by BB to cache requests/prevent spam nonce_field = form.find( './/h:input[@name="blackboard.platform.security.NonceUtil.nonce"]', NS) nonce = nonce_field.get('value') thread_fields = form.findall('.//h:input[@name="formCBs"]', NS) threads = [] for f in thread_fields: threads.append((f.get('value'), f.get('title'))) return nonce, threads if __name__ == "__main__": blackboard.wrapper(print_forum_posts)
def get_thread_ids(session, forum_id): url = ( 'https://bb.au.dk/webapps/discussionboard/do/forum' + '?action=list_threads&nav=discussion_board' + '&course_id=%s' % session.course_id + '&conf_id=%s&forum_id=%s' % forum_id + '&showAll=true' ) r = session.get(url) document = html5lib.parse(r.content, encoding=r.encoding) return parse_thread_ids(document) def parse_thread_ids(document): form = document.find('.//h:form[@name="forumForm"]', NS) # Seemingly used by BB to cache requests/prevent spam nonce_field = form.find( './/h:input[@name="blackboard.platform.security.NonceUtil.nonce"]', NS) nonce = nonce_field.get('value') thread_fields = form.findall('.//h:input[@name="formCBs"]', NS) threads = [] for f in thread_fields: threads.append((f.get('value'), f.get('title'))) return nonce, threads if __name__ == "__main__": blackboard.wrapper(print_forum_posts)
url = ( 'https://blackboard.au.dk/webapps/blackboard/execute/userManager' + '?context=userPicker&course_id=_13158_1&enrollTypeString=UnEnrolled' + '&sortCol=userFirstName&sortDir=ASCENDING' + '&userInfoSearchKeyString=UserName' + '&userInfoSearchOperatorString=Contains&userInfoSearchText=a') response, keys, rows = fetch_datatable(session, url, 'get_all_users.csv') with open('all_users.html', 'wb') as fp: fp.write(url.encode('ascii') + b'\n') for r in list(response.history) + [response]: fp.write(('%s %s\n' % (r.status_code, r.url)).encode('ascii')) fp.write(response.content) return parse_all_users(keys, rows) def parse_all_users(keys, rows): first_name = keys.index('userFirstName') last_name = keys.index('userLastName') username = keys.index('username') email_address = keys.index('userEmailAddress') return [{ 'first': row[first_name], 'last': row[last_name], 'id': row[username], 'email': row[email_address] } for row in rows] if __name__ == "__main__": blackboard.wrapper(get_all_users)
def fetch_groups_and_emails(session): emails = fetch_users(session) groups = fetch_groups(session) if emails.keys() != groups.keys(): print("In Users but not Groups: %r" % (set(emails.keys()) - set(groups.keys()))) print("In Groups but not Users: %r" % (set(groups.keys()) - set(emails.keys()))) raise Exception("Different username sets") for username in emails.keys(): groups[username].update(emails[username]) return groups def print_groups_and_emails(session): by_group = {} users = fetch_groups_and_emails(session) for user in users.values(): groups = [name for name, group_id in user['groups']] for group in groups or ['no group']: by_group.setdefault(group, []).append(user) for group_name in sorted(by_group.keys()): print("%s:\n" % group_name) group_users = by_group[group_name] group_users = sorted(group_users, key=lambda u: (u['role'], u['first_name'], u['last_name'])) for user in group_users: print("\"%s %s\" <%s>," % (user['first_name'], user['last_name'], user['email'])) print('') if __name__ == "__main__": blackboard.wrapper(print_groups_and_emails)
import blackboard from blackboard.backend import fetch_groups def print_groups(session): users = fetch_groups(session) for user in users: print("%s %s (%s, %s) is in %s" % (user['first_name'], user['last_name'], user['username'], user['role'], user['groups'])) if __name__ == "__main__": blackboard.wrapper(print_groups)
import blackboard from blackboard.datatable import fetch_datatable def get_visit_stats(session): url = ( 'https://bb.au.dk/webapps/blackboard/content/manageDashboard.jsp' + '?course_id=%s' % session.course_id + '&sortCol=LastLoginCol&sortDir=D') response, keys, rows = fetch_datatable(session, url) # for r in list(response.history) + [response]: # print("%s %s" % (r.status_code, r.url)) return parse_visit_stats(keys, rows) def parse_visit_stats(keys, rows): first = keys.index('FirstNameCol') last = keys.index('LastNameCol') time = keys.index('LastLoginCol') data = [('%s %s' % (r[first], r[last]), r[time]) for r in rows] return data def print_visit_stats(session): for name, time in get_visit_stats(session): print("%s %s" % (time, name)) if __name__ == "__main__": blackboard.wrapper(print_visit_stats)
import blackboard from blackboard.datatable import fetch_datatable def get_visit_stats(session): url = ('https://bb.au.dk/webapps/blackboard/content/manageDashboard.jsp' + '?course_id=%s' % session.course_id + '&sortCol=LastLoginCol&sortDir=D') response, keys, rows = fetch_datatable(session, url) # for r in list(response.history) + [response]: # print("%s %s" % (r.status_code, r.url)) return parse_visit_stats(keys, rows) def parse_visit_stats(keys, rows): first = keys.index('FirstNameCol') last = keys.index('LastNameCol') time = keys.index('LastLoginCol') data = [('%s %s' % (r[first], r[last]), r[time]) for r in rows] return data def print_visit_stats(session): for name, time in get_visit_stats(session): print("%s %s" % (time, name)) if __name__ == "__main__": blackboard.wrapper(print_visit_stats)
import blackboard from blackboard.backend import fetch_groups def print_groups(session): users = fetch_groups(session) for user in users.values(): print("%s %s (%s, %s) is in %s" % (user['first_name'], user['last_name'], user['username'], user['role'], user['groups'])) if __name__ == "__main__": blackboard.wrapper(print_groups)
'https://bb.au.dk/webapps/blackboard/execute/userManager' + '?context=userPicker&course_id=_13158_1&enrollTypeString=UnEnrolled' + '&sortCol=userFirstName&sortDir=ASCENDING' + '&userInfoSearchKeyString=UserName' + '&userInfoSearchOperatorString=Contains&userInfoSearchText=a') response, keys, rows = fetch_datatable(session, url, 'get_all_users.csv') with open('all_users.html', 'wb') as fp: fp.write(url.encode('ascii') + b'\n') for r in list(response.history) + [response]: fp.write(('%s %s\n' % (r.status_code, r.url)).encode('ascii')) fp.write(response.content) return parse_all_users(keys, rows) def parse_all_users(keys, rows): first_name = keys.index('userFirstName') last_name = keys.index('userLastName') username = keys.index('username') email_address = keys.index('userEmailAddress') return [ {'first': row[first_name], 'last': row[last_name], 'id': row[username], 'email': row[email_address]} for row in rows ] if __name__ == "__main__": blackboard.wrapper(get_all_users)