From 34ce175709e57a60ecbb51fbaf1bdc7b16e0567d Mon Sep 17 00:00:00 2001 From: Tue Herlau <tuhe@dtu.dk> Date: Mon, 10 Oct 2022 11:15:36 +0200 Subject: [PATCH] Initial commit refresh-token + put calendar event preliminary; api not stable --- .../__pycache__/learn_config.cpython-310.pyc | Bin 0 -> 3589 bytes src/unlearn/cache/cache.db | Bin 0 -> 32768 bytes src/unlearn/learn_config.py | 122 ++++++++++++++++++ src/unlearn/main.py | 84 ++++++++++++ src/unlearn/scrap.py | 27 ++++ 5 files changed, 233 insertions(+) create mode 100644 src/unlearn/__pycache__/learn_config.cpython-310.pyc create mode 100644 src/unlearn/cache/cache.db create mode 100644 src/unlearn/learn_config.py create mode 100644 src/unlearn/main.py create mode 100644 src/unlearn/scrap.py diff --git a/src/unlearn/__pycache__/learn_config.cpython-310.pyc b/src/unlearn/__pycache__/learn_config.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ca109eeec207a8ddacb2aa25dfc53294983e0f35 GIT binary patch literal 3589 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 literal 0 HcmV?d00001 diff --git a/src/unlearn/cache/cache.db b/src/unlearn/cache/cache.db new file mode 100644 index 0000000000000000000000000000000000000000..fd897644e84229987f58d420bff790a339e69599 GIT binary patch literal 32768 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 literal 0 HcmV?d00001 diff --git a/src/unlearn/learn_config.py b/src/unlearn/learn_config.py new file mode 100644 index 0000000..89b0aa5 --- /dev/null +++ b/src/unlearn/learn_config.py @@ -0,0 +1,122 @@ +import pickle +import diskcache +import requests +from diskcache import Cache +import os + +""" +Links +API: +""" + +def whoami(lc): + url = "https://testdtu.brightspace.com/d2l/api/lp/1.36/users/whoami" + payload = {} + headers = { + 'Authorization': 'Bearer eyJhbGciOiJSUzI1NiIsImtpZCI6IjRkZTk0ZWViLTU0NDctNDk4ZC1iMmNhLTU4NDg5MTU3OWI3YSIsInR5cCI6IkpXVCJ9.eyJuYmYiOjE2NjUxNTc5MTYsImV4cCI6MTY2NTE2MTUxNiwiaXNzIjoiaHR0cHM6Ly9hcGkuYnJpZ2h0c3BhY2UuY29tL2F1dGgiLCJhdWQiOiJodHRwczovL2FwaS5icmlnaHRzcGFjZS5jb20vYXV0aC90b2tlbiIsInN1YiI6IjMzOTciLCJ0ZW5hbnRpZCI6ImVmYTdjODJhLWExYzItNGZjOC1hZTgyLTgwOGJhNzhjZDkxYyIsImF6cCI6IjQ4MDFhNDc3LTExYzctNGNmYy04NzMyLTczNmYwNDE1NzhiZSIsInNjb3BlIjoiY29yZToqOioiLCJqdGkiOiJjNGVhOTRhZi0xODdmLTQ3MzEtOGZmMy1lM2RkOWJhN2ZlMTIifQ.ngh5rHtFro4DWf6mcYSPoRV4LyadE7QJfNeeLRbosrPC2rwrW-00kX1oHqnrFLnWeIw9wNpeXfwM8UwYUxWvmwPcSGS6TI8d7I5gAb3Lqq6PEGHUfvho577scU2s_Lubi0RG_VTfaoNxggzFbvDlCzJom9EXWwbxGuLGk49OxtLile1_bX0kit8zOJhFoOGPjiO-GSvH5Qi4tvjYoowrBkTIyYD6Jw81ET_q2uTHaB15kWpMTl2uHeED-aRWivtX_rfTnFq3Wed3SmAPdS5Tb9g46hURKwq11O_ubGjqFbtQCsY9bIJpH5GShUURoQvWsTlqSqEyr7zgzc0wlMXwVQ' + } + headers = lc.headers + response = requests.request("GET", url, headers=headers, data=payload) + print(response.text) + return response + pass + +class LearnConfig: + server = "testdtu.brightspace.com/" + lp_version = "1.36" + headers = { + 'Authorization': 'Bearer bla-bla' + } + + def get_header(self): + headers = { + # cc = Cache(directory="cache") + 'Authorization': f"Bearer {self.cc['access_token']}" + } + return headers + + def isodate(self, date): + d = date.isoformat() + return d.split(".")[0] + ".000Z" + + + + orgunitId = "8407" + def is_token_valid(self): + response = whoami(self) + json = response.json() + if "FirstName" in json: + print("Hello there", json['FirstName']) + return True + print("Authentication failed") + print(json) + return False + + def __init__(self): + + cc = Cache(directory= os.path.join( os.path.dirname(__file__), "cache") ) + self.cc = cc + while True: + if "access_token" in cc: + print("is there") + # Try to connect... + self.token = cc.get("access_token") + self.headers['Authorization'] = f"Bearer {self.token}" + if self.is_token_valid(): + print("Got a new token!") + a = 234 + break + else: + del cc['access_token'] + print("The token sucks.") + continue + + else: + if "refresh_token" in cc: + + url = "https://auth.brightspace.com/core/connect/token" + refresh_token = cc['refresh_token'] + # refresh_token = "rt.eu-west-1.SAmtMKD3oe094NV6Yc4F8UuROyRdHMJRz_XwpiYtwfI" + self.client_id = "4801a477-11c7-4cfc-8732-736f041578be" + self.client_secret = "niLXYwe9f_pQe2RzvZ8LtYE6Ls6DSiZ_0IeTCPhx4_8" + payload=f'grant_type=refresh_token&refresh_token={refresh_token}&client_id={self.client_id}&client_secret={self.client_secret}&scope=core%3A*%3A*' + headers = { + 'Content-Type': 'application/x-www-form-urlencoded' + } + + response = requests.request("POST", url, headers=headers, data=payload) + cc['refresh_token'] = response.json()['refresh_token'] + cc['access_token'] = response.json()['access_token'] + print("Authentication success.") + break + + # url = "https://auth.brightspace.com/core/connect/token" + # + # payload = 'grant_type=refresh_token&refresh_token=rt.eu-west-1.QLXytJ-TREfofv9xzbDcBEiEivw-_rogaSmS8XetScg&client_id=4801a477-11c7-4cfc-8732-736f041578be&client_secret=niLXYwe9f_pQe2RzvZ8LtYE6Ls6DSiZ_0IeTCPhx4_8&scope=core%3A*%3A*' + # headers = { + # 'Content-Type': 'application/x-www-form-urlencoded' + # } + # + # response = requests.request("POST", url, headers=headers, data=payload) + # + # print(response.text) + # + # + # print(response.text) + + else: + s = input("Please give me a refresh token") + cc['refresh_token'] = s + print("Saved refresh token", s) + print("no it is not there") + a = 234 + print("Phew! Authentication completed.") + # load refresh token file. + # test if login possible with current token. + # pkl.get + # rt.eu-west-1.tN5byZD8n0KHSowkDC2NnElZx0J0BJgIz57Fmj-ZhKs + pass + +if __name__ == '__main__': + print("Hello world") + c = LearnConfig() diff --git a/src/unlearn/main.py b/src/unlearn/main.py new file mode 100644 index 0000000..950cb8b --- /dev/null +++ b/src/unlearn/main.py @@ -0,0 +1,84 @@ +import datetime +import json +import requests +from learn_config import LearnConfig + +def get_calendar_events(lc): + """ https://{{server}}d2l/api/le/{{lp_version}}/{{orgunitId}}/calendar/events/ """ + # def whoami(lc): + url = f"https://{lc.server}d2l/api/le/{lc.lp_version}/{lc.orgunitId}/calendar/events/" + payload = {} + # headers = { + # 'Authorization': 'Bearer eyJhbGciOiJSUzI1NiIsImtpZCI6IjRkZTk0ZWViLTU0NDctNDk4ZC1iMmNhLTU4NDg5MTU3OWI3YSIsInR5cCI6IkpXVCJ9.eyJuYmYiOjE2NjUxNTc5MTYsImV4cCI6MTY2NTE2MTUxNiwiaXNzIjoiaHR0cHM6Ly9hcGkuYnJpZ2h0c3BhY2UuY29tL2F1dGgiLCJhdWQiOiJodHRwczovL2FwaS5icmlnaHRzcGFjZS5jb20vYXV0aC90b2tlbiIsInN1YiI6IjMzOTciLCJ0ZW5hbnRpZCI6ImVmYTdjODJhLWExYzItNGZjOC1hZTgyLTgwOGJhNzhjZDkxYyIsImF6cCI6IjQ4MDFhNDc3LTExYzctNGNmYy04NzMyLTczNmYwNDE1NzhiZSIsInNjb3BlIjoiY29yZToqOioiLCJqdGkiOiJjNGVhOTRhZi0xODdmLTQ3MzEtOGZmMy1lM2RkOWJhN2ZlMTIifQ.ngh5rHtFro4DWf6mcYSPoRV4LyadE7QJfNeeLRbosrPC2rwrW-00kX1oHqnrFLnWeIw9wNpeXfwM8UwYUxWvmwPcSGS6TI8d7I5gAb3Lqq6PEGHUfvho577scU2s_Lubi0RG_VTfaoNxggzFbvDlCzJom9EXWwbxGuLGk49OxtLile1_bX0kit8zOJhFoOGPjiO-GSvH5Qi4tvjYoowrBkTIyYD6Jw81ET_q2uTHaB15kWpMTl2uHeED-aRWivtX_rfTnFq3Wed3SmAPdS5Tb9g46hURKwq11O_ubGjqFbtQCsY9bIJpH5GShUURoQvWsTlqSqEyr7zgzc0wlMXwVQ' + # } + # headers = lc.headers + response = requests.request("GET", url, headers=lc.headers, data=payload) + print(response.text) + return response + pass + +def put_calendar_event(lc, start_date, end_date, title="Lecture", description="Do some stuff today", location_name="Auditorim 666"): + """ + [{'CalendarEventId': 131048, + 'OrgUnitId': 8407, + 'CreatorUserId': 3397, + 'Title': 'This even is a lecture! feel free to drop dead. ', + 'Description': 'Oy veh.', + 'CalendarEventViewUrl': 'https://testdtu.brightspace.com/d2l/le/calendar/8407/event/146759/detailsview', + 'IsAllDayEvent': False, + 'GroupId': None, + 'StartDateTime': '2022-10-26T23:00:00.000Z', + 'EndDateTime': '2022-10-27T01:00:00.000Z', + 'IsRecurring': False, + 'RecurrenceInfo': None, + 'StartDay': None, + 'EndDay': None, + 'LocationId': None, + 'LocationName': 'Auditorium', + 'OrgUnitName': 'Tue Herlau- Sandbox', + 'OrgUnitCode': 'OFFERING-SANDBOX-92378', + 'IsAssociatedWithEntity': False, + 'AssociatedEntity': None, + 'HasVisibilityRestrictions': False, + 'VisibilityRestrictions': {'Type': 1, + 'Range': None, + 'HiddenRangeUnitType': None, + 'StartDate': None, + 'EndDate': None}, + 'Presenters': []}] + """ + + + + url = f"https://testdtu.brightspace.com/d2l/api/le/{lc.lp_version}/{lc.orgunitId}/calendar/event/" + + payload = json.dumps({ + "Title": title, # "Today's Special 666b", + "Description": description, # "<p>Soup <b>is relly good</p><p>and also healthy</p>", + "StartDateTime": lc.isodate(start_date), # "2019-05-02T20:00:00.000Z", + "EndDateTime": lc.isodate(end_date), # "2019-05-02T20:30:00.000Z", + "StartDay": None, + "EndDay": None, + "GroupId": None, + "RecurrenceInfo": None, + "LocationId": None, + "LocationName": location_name, + "AssociatedEntity": None, + "VisibilityRestrictions": { + "Type": 1, + "Range": None, + "HiddenRangeUnitType": None, + "StartDate": None, + "EndDate": None + } + }) + headers = lc.get_header() + headers['Content-Type'] = 'application/json' + response = requests.request("POST", url, headers=headers, data=payload) + print(response.text) + +if __name__ == '__main__': + lc = LearnConfig() + get_calendar_events(lc) + from datetime import datetime, timedelta + put_calendar_event(lc, start_date=datetime.now(), end_date=datetime.now() + timedelta(hours=2), title="Do stuff for lecture 4", description="<p><b>MORE</b></p>", location_name="Room 022") diff --git a/src/unlearn/scrap.py b/src/unlearn/scrap.py new file mode 100644 index 0000000..9e96d59 --- /dev/null +++ b/src/unlearn/scrap.py @@ -0,0 +1,27 @@ +# Cartoon elk: https://community.desire2learn.com/d2l/home/14841 +""" +I will just copy the required information in again: + +Client ID + +4801a477-11c7-4cfc-8732-736f041578be + +Client Secret + +niLXYwe9f_pQe2RzvZ8LtYE6Ls6DSiZ_0IeTCPhx4_8 + + +Description + +Redirect URI +https://localhost:3434/redirecturi +Access Token Lifetime (seconds) +3600 +Scope +core:*:* + + +ACCESS CODE (learn) +tuhe / G(..)(!60 optional). + +""" \ No newline at end of file -- GitLab