The organization I work for is starting to use Canvas LMS and I was in charged of pulling out the platform's data and in order to help with data insights.
It's great that Canvas LMS offers a Data API but I had a hard time fiding a Python wrapper to use. I wanted to interact with it using Python which is part of our official stack here.
I know there is the official documentation in (https://portal.inshosteddata.com/docs/api) but I'm not really used with the authorization method and it would be so much easier to have a sample code.
So, how should I start my python code to interact with the Canvas LMS Data API?
One of the most popular ways to build APIs is the REST architecture style. Python provides some great tools not only to get data from REST APIs but also to build your own Python REST APIs.
Here we go!
I finally got it done with the help of the Canvas community through their website (https://community.canvaslms.com/thread/7423). I'm also posting question and answer here because I believe StackOverflow is easier to find answers.
Hope this will be useful to someone else!
#!/usr/bin/python
#imports
import datetime
import requests
import hashlib
import hmac
import base64
import json
#Get the current time, printed in the right format
def nowAsStr():
currentTime = datetime.datetime.utcnow()
prettyTime = currentTime.strftime('%a, %d %b %Y %H:%M:%S GMT')
return prettyTime
#Set up the request pieces
apiKey = 'your_key'
apiSecret = 'your_secret'
method = 'GET'
host = 'api.inshosteddata.com'
path = '/api/account/self/dump'
timestamp = nowAsStr()
requestParts = [
method,
host,
'', #content Type Header
'', #content MD5 Header
path,
'', #alpha-sorted Query Params
timestamp,
apiSecret
]
#Build the request
requestMessage = '\n'.join(requestParts)
print (requestMessage.__repr__())
hmacObject = hmac.new(apiSecret, '', hashlib.sha256)
hmacObject.update(requestMessage)
hmac_digest = hmacObject.digest()
sig = base64.b64encode(hmac_digest)
headerDict = {
'Authorization' : 'HMACAuth ' + apiKey + ':' + sig,
'Date' : timestamp
}
#Submit the request/get a response
uri = "https://"+host+path
print (uri)
print (headerDict)
response = requests.request(method='GET', url=uri, headers=headerDict, stream=True)
#Check to make sure the request was ok
if(response.status_code != 200):
print ('Request response went bad. Got back a ', response.status_code, ' code, meaning the request was ', response.reason)
else:
#Use the downloaded data
jsonData = response.json()
print json.dumps(jsonData, indent=4)
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With