#!/usr/bin/env python3 import requests import getpass import os BASE_URL = 'https://www.gradescope.com' class APIClient: def __init__(self): self.session = requests.Session() def post(self, *args, **kwargs): return self.session.post(*args, **kwargs) def log_in(self, email, password): url = "{base}/api/v1/user_session".format(base=BASE_URL) form_data = { "email": email, "password": password } r = self.post(url, data=form_data) self.token = r.json()['token'] def upload_pdf_submission(self, course_id, assignment_id, student_email, filename): url = "{base}/api/v1/courses/{0}/assignments/{1}/submissions".format( course_id, assignment_id, base=BASE_URL ) form_data = { "owner_email": student_email } files = {'pdf_attachment': open(filename, 'rb')} request_headers = {'access-token': self.token} r = self.post(url, data=form_data, headers=request_headers, files=files) return r def replace_pdf_submission(self, course_id, assignment_id, student_email, filename): url = "{base}/api/v1/courses/{0}/assignments/{1}/submissions/replace_pdf".format( course_id, assignment_id, base=BASE_URL ) form_data = { "owner_email": student_email } files = {'pdf_attachment': open(filename, 'rb')} request_headers = {'access-token': self.token} r = self.post(url, data=form_data, headers=request_headers, files=files) return r def upload_programming_submission(self, course_id, assignment_id, student_emails, filenames): url = "{base}/api/v1/courses/{0}/assignments/{1}/submissions".format( course_id, assignment_id, base=BASE_URL ) form_data = { "owner_email": student_emails } files = [('files[]', (filename, open(filename, 'rb'))) for filename in filenames] request_headers = {'access-token': self.token} r = self.post(url, data=form_data, headers=request_headers, files=files) return r if __name__ == '__main__': client = APIClient() email = input("Please provide the email address on your Gradescope account: ") password = getpass.getpass('Password: ') client.log_in(email, password) # Use the APIClient to upload submissions after logging in, e.g: # client.upload_pdf_submission(1234, 5678, 'student@example.edu', 'submission.pdf') # client.upload_programming_submission(1234, 5678, 'student@example.edu', ['README.md', 'src/calculator.py']) # You can get course and assignment IDs from the URL, e.g. # https://www.gradescope.com/courses/1234/assignments/5678 # course_id = 1234, assignment_id = 5678 # # https://www.gradescope.com/courses/173690/assignments/746268/submissions course_id = 173690 assignment_id = 746268 submissions = open("submissions.txt","r") os.chdir('../'); for submission in submissions: parts = submission.split() submission_email = parts[0] submission_folder = parts[1] os.chdir(submission_folder) try: client.upload_programming_submission(course_id, assignment_id, submission_email, ['BinarySearchTree.java']) print('Successfully uploaded: '+submission_folder) except: print('Error uploading '+submission_folder+': ') os.chdir('../..')