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

MilanoteApi(cookies, headers, logging_level: int = 30)
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")
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.

def get_board_elements(self, board: MilanoteUnofficialApi.elements.board.Board):
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.