MilanoteUnofficialApi.milanote
1import logging 2import requests 3from .elements.board import Board 4from .exceptions import BoardNotFoundError, NotAuthorizedError, UnknownError 5 6BOARD_BASE_URL = "https://app.milanote.com/api/boards/" 7HOME_URL = "https://app.milanote.com/api/users/me" 8 9 10class MilanoteApi: 11 """ 12 Milanote API 13 """ 14 logger = logging.getLogger() 15 16 def __init__(self, cookies, headers, logging_level: int = logging.WARNING): 17 self.cookies = cookies 18 self.headers = headers 19 self.logger.setLevel(logging_level) 20 self.logger.debug("MilanoteApi initialized") 21 22 def get_home_board(self): 23 """ 24 Get the home board of the user. 25 Note: Only the top level elements are loaded. 26 """ 27 28 self.logger.debug("Getting boards from home") 29 response = requests.get(HOME_URL, headers=self.headers, cookies=self.cookies) 30 if response.status_code == 200: 31 return self.get_board_by_id(list(response.json()["elements"].keys())[0]) 32 else: 33 self.logger.error("Error getting boards from home. Status code: %s", response.status_code) 34 return None 35 36 def get_board_by_id(self, board_id): 37 """ 38 Get a board by its ID. 39 Note: Only the top level elements are loaded. Use get_board_sub_elements to get a Board's the sub elements. 40 """ 41 42 self.logger.debug("Getting board by id: %s", board_id) 43 response = requests.get(BOARD_BASE_URL + board_id, headers=self.headers, cookies=self.cookies, 44 params={"loadAncestors": "false"}) 45 46 if response.status_code == 200: 47 response_json = response.json() 48 if "errors" in response_json: 49 if board_id in response_json["errors"]: 50 if response_json["errors"][board_id]["error"]["code"] == "BOARD_NOT_FOUND": 51 raise BoardNotFoundError(response_json, "Board not found.") 52 else: 53 raise UnknownError(response_json, "Unknown error.") 54 55 if response_json["elements"][board_id]["elementType"] == "SKELETON": 56 raise NotAuthorizedError(response_json, "Not authorized. Please check your cookies and headers.") 57 58 board_json = response_json["elements"][board_id] 59 response_json["elements"].pop(board_id) 60 elements_json = response_json["elements"] 61 comments_json = response_json["comments"] 62 return Board(board_json, elements_json, comments_json) 63 else: 64 self.logger.error("Error getting board by id. Response status code: %s", response.status_code) 65 return None 66 67 def get_board_elements(self, board: Board): 68 """ 69 Get the elements of a board. 70 """ 71 72 self.logger.debug("Getting board sub elements") 73 response = requests.get(BOARD_BASE_URL + board.id, headers=self.headers, cookies=self.cookies, 74 params={"loadAncestors": "false"}) 75 if response.status_code == 200: 76 response_json = response.json() 77 response_json["elements"].pop(board.id) 78 elements_json = response_json["elements"] 79 comments_json = response_json["comments"] 80 board.init_elements(elements_json, comments_json) 81 else: 82 self.logger.error("Error getting board sub elements. Status code: %s", response.status_code) 83 return None
class
MilanoteApi:
11class MilanoteApi: 12 """ 13 Milanote API 14 """ 15 logger = logging.getLogger() 16 17 def __init__(self, cookies, headers, logging_level: int = logging.WARNING): 18 self.cookies = cookies 19 self.headers = headers 20 self.logger.setLevel(logging_level) 21 self.logger.debug("MilanoteApi initialized") 22 23 def get_home_board(self): 24 """ 25 Get the home board of the user. 26 Note: Only the top level elements are loaded. 27 """ 28 29 self.logger.debug("Getting boards from home") 30 response = requests.get(HOME_URL, headers=self.headers, cookies=self.cookies) 31 if response.status_code == 200: 32 return self.get_board_by_id(list(response.json()["elements"].keys())[0]) 33 else: 34 self.logger.error("Error getting boards from home. Status code: %s", response.status_code) 35 return None 36 37 def get_board_by_id(self, board_id): 38 """ 39 Get a board by its ID. 40 Note: Only the top level elements are loaded. Use get_board_sub_elements to get a Board's the sub elements. 41 """ 42 43 self.logger.debug("Getting board by id: %s", board_id) 44 response = requests.get(BOARD_BASE_URL + board_id, headers=self.headers, cookies=self.cookies, 45 params={"loadAncestors": "false"}) 46 47 if response.status_code == 200: 48 response_json = response.json() 49 if "errors" in response_json: 50 if board_id in response_json["errors"]: 51 if response_json["errors"][board_id]["error"]["code"] == "BOARD_NOT_FOUND": 52 raise BoardNotFoundError(response_json, "Board not found.") 53 else: 54 raise UnknownError(response_json, "Unknown error.") 55 56 if response_json["elements"][board_id]["elementType"] == "SKELETON": 57 raise NotAuthorizedError(response_json, "Not authorized. Please check your cookies and headers.") 58 59 board_json = response_json["elements"][board_id] 60 response_json["elements"].pop(board_id) 61 elements_json = response_json["elements"] 62 comments_json = response_json["comments"] 63 return Board(board_json, elements_json, comments_json) 64 else: 65 self.logger.error("Error getting board by id. Response status code: %s", response.status_code) 66 return None 67 68 def get_board_elements(self, board: Board): 69 """ 70 Get the elements of a board. 71 """ 72 73 self.logger.debug("Getting board sub elements") 74 response = requests.get(BOARD_BASE_URL + board.id, headers=self.headers, cookies=self.cookies, 75 params={"loadAncestors": "false"}) 76 if response.status_code == 200: 77 response_json = response.json() 78 response_json["elements"].pop(board.id) 79 elements_json = response_json["elements"] 80 comments_json = response_json["comments"] 81 board.init_elements(elements_json, comments_json) 82 else: 83 self.logger.error("Error getting board sub elements. Status code: %s", response.status_code) 84 return None
Milanote API
def
get_home_board(self):
23 def get_home_board(self): 24 """ 25 Get the home board of the user. 26 Note: Only the top level elements are loaded. 27 """ 28 29 self.logger.debug("Getting boards from home") 30 response = requests.get(HOME_URL, headers=self.headers, cookies=self.cookies) 31 if response.status_code == 200: 32 return self.get_board_by_id(list(response.json()["elements"].keys())[0]) 33 else: 34 self.logger.error("Error getting boards from home. Status code: %s", response.status_code) 35 return None
Get the home board of the user. Note: Only the top level elements are loaded.
def
get_board_by_id(self, board_id):
37 def get_board_by_id(self, board_id): 38 """ 39 Get a board by its ID. 40 Note: Only the top level elements are loaded. Use get_board_sub_elements to get a Board's the sub elements. 41 """ 42 43 self.logger.debug("Getting board by id: %s", board_id) 44 response = requests.get(BOARD_BASE_URL + board_id, headers=self.headers, cookies=self.cookies, 45 params={"loadAncestors": "false"}) 46 47 if response.status_code == 200: 48 response_json = response.json() 49 if "errors" in response_json: 50 if board_id in response_json["errors"]: 51 if response_json["errors"][board_id]["error"]["code"] == "BOARD_NOT_FOUND": 52 raise BoardNotFoundError(response_json, "Board not found.") 53 else: 54 raise UnknownError(response_json, "Unknown error.") 55 56 if response_json["elements"][board_id]["elementType"] == "SKELETON": 57 raise NotAuthorizedError(response_json, "Not authorized. Please check your cookies and headers.") 58 59 board_json = response_json["elements"][board_id] 60 response_json["elements"].pop(board_id) 61 elements_json = response_json["elements"] 62 comments_json = response_json["comments"] 63 return Board(board_json, elements_json, comments_json) 64 else: 65 self.logger.error("Error getting board by id. Response status code: %s", response.status_code) 66 return None
Get a board by its ID. Note: Only the top level elements are loaded. Use get_board_sub_elements to get a Board's the sub elements.
68 def get_board_elements(self, board: Board): 69 """ 70 Get the elements of a board. 71 """ 72 73 self.logger.debug("Getting board sub elements") 74 response = requests.get(BOARD_BASE_URL + board.id, headers=self.headers, cookies=self.cookies, 75 params={"loadAncestors": "false"}) 76 if response.status_code == 200: 77 response_json = response.json() 78 response_json["elements"].pop(board.id) 79 elements_json = response_json["elements"] 80 comments_json = response_json["comments"] 81 board.init_elements(elements_json, comments_json) 82 else: 83 self.logger.error("Error getting board sub elements. Status code: %s", response.status_code) 84 return None
Get the elements of a board.