Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How can I use Canvas Data REST API using python?

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?

like image 914
fernandosjp Avatar asked Mar 07 '17 19:03

fernandosjp


People also ask

Can we use Python for REST 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.


1 Answers

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)
like image 154
fernandosjp Avatar answered Sep 29 '22 09:09

fernandosjp