82 lines
3.0 KiB
Python
82 lines
3.0 KiB
Python
import requests, json, os
|
|
from pathlib import Path
|
|
|
|
# STRIKE
|
|
# Strategic Transfer of Resources Incase (K)anvas Extinct
|
|
|
|
token = input('Paste your token here: ').replace(' ','') # the whole thing to the right of token, including 13377~
|
|
|
|
apikey = {'Authorization' : f'Bearer {token}'}
|
|
|
|
|
|
canvasURL = 'https://learn.ontariotechu.ca/'
|
|
|
|
|
|
filecount = 0
|
|
|
|
def getCourses():
|
|
url = f'{canvasURL}api/v1/courses/?per_page=100'
|
|
re = requests.get(url, headers=apikey)
|
|
courses = json.loads(re.content.decode())
|
|
courseids = {}
|
|
for course in courses:
|
|
if len(course) > 4:
|
|
CourseName = course['name'].replace("\\", ' ').replace("/", ' ')
|
|
courseids[CourseName] = course['id']
|
|
return courseids
|
|
|
|
def saveAnnouncements(courseid, name): ## IDK kinda broken seems to not
|
|
try:
|
|
os.makedirs(str(name))
|
|
except: pass
|
|
file = open(f'{name}/announcements.txt', 'w+')
|
|
url = f'{canvasURL}/api/v1/courses/{courseid}/activity_stream'
|
|
re = requests.get(url, headers=apikey)
|
|
announcements = json.loads(re.content.decode())
|
|
for a in announcements:
|
|
if a['type'] == 'Announcement':
|
|
file.write(f"{a['type']}{a['title']} @ {a['created_at']}\n{a['message']}\n\n")
|
|
file.close()
|
|
|
|
### https://learn.ontariotechu.ca/api/v1/courses/16750/assignments/95412/ submissions API ???
|
|
|
|
def getModules(course, name):
|
|
global filecount
|
|
try:
|
|
os.makedirs(str(name))
|
|
except: pass
|
|
try:
|
|
os.makedirs(str(f'{name}/files/'))
|
|
except: pass
|
|
url = f'{canvasURL}api/v1/courses/{course}/modules/'
|
|
re = requests.get(url, headers=apikey).content
|
|
modules = json.loads(re.decode())
|
|
for module in modules: ## Each Module
|
|
items = json.loads(requests.get(module['items_url'], headers=apikey).content)
|
|
for item in items: ## For each item attached
|
|
if item['type'] == 'File':
|
|
if not os.path.isfile(f"{name}/files/{item['title']}"):
|
|
filecount += 1
|
|
print(f"\t \t Downloading {item['title']}")
|
|
## Grab the attachment for the module
|
|
attachment = json.loads(requests.get(item['url'], headers=apikey).content)
|
|
## Write File that was at the URL
|
|
try:
|
|
file = requests.get(attachment['url']).content
|
|
Path(f"{name}/files/{attachment['display_name']}").write_bytes(file)
|
|
except:
|
|
print('****Download Failed****')
|
|
else:
|
|
filecount += 1
|
|
print(f"File {item['title']} Exists SKIPPING")
|
|
def main():
|
|
courses = getCourses()
|
|
for course in courses:
|
|
print('+'*20)
|
|
print(f'Downloading Content for {course}...')
|
|
print('+'*20)
|
|
saveAnnouncements(courses[course], course)
|
|
getModules(courses[course],course)
|
|
print(f'Archive Completed, downloaded {str(filecount)} files for {str(len(courses))} Courses')
|
|
|
|
main() |