import json import os import time import requests from threading import Event class Access: PENDING = 1 PROCESS = 2 GENERATE = 3 FINISH = 4 ERROR = 5 url = None username = None password = None token = None refresh = None refresh_time = None headers = None refreshing = Event() def __init__(self): self.read_credentials() self.get_token() self.refreshing.set() def read_credentials(self): folder_path = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) config_path = os.path.join(folder_path, "config/api_config.json") with open(config_path, "r") as f: params = json.load(f) self.refreshing.clear() self.url = params['url'] self.username = params['username'] self.password = params['password'] self.refreshing.set() def format_header(self): self.headers = { 'Authorization': f'Bearer {self.token}' } def is_time_for_refreshing(self): return self.refresh_time < time.time() def get_token(self): json_form = { 'grantType': 'password', 'username': self.username, 'password': self.password } response = requests.post(f'{self.url}/token', json=json_form) if response.status_code == 400: raise Exception('400 Bad request: invalid login and/or password.') elif response.status_code == 200: self.refreshing.clear() self.token = response.json()['accessToken'] self.refresh = response.json()['refreshToken'] self.refresh_time = response.json()['expiresIn'] self.format_header() self.refreshing.set() else: raise Exception(f'{response.status_code}') def refresh_token(self): json_form = { 'grantType': 'refresh_token', 'refreshToken': self.refresh } response = requests.post(f'{self.url}/token', json=json_form) if response.status_code == 400: raise Exception('400 Bad request: wrong request parameters for refreshing.') elif response.status_code == 401: self.get_token() elif response.status_code == 200: self.refreshing.clear() self.token = response.json()['accessToken'] self.refresh = response.json()['refreshToken'] self.refresh_time = response.json()['expiresIn'] self.format_header() self.refreshing.set() else: raise Exception(f'{response.status_code}') def get_doc(self, doc_id): if self.is_time_for_refreshing(): self.refresh_token() self.refreshing.wait() response = requests.get(f'{self.url}/doc-convert/{doc_id}/file', headers=self.headers) if response.status_code == 404: raise FileNotFoundError('404 Not Found: file have not found.') elif response.status_code == 200: content = response.content else: raise Exception(f'{response.status_code}') return content def send_image(self, img, doc_id): if self.is_time_for_refreshing(): self.refresh_token() self.refreshing.wait() with open(img, 'rb') as img_file: files = { 'image': (os.path.basename(img), img_file) } response = requests.post(f'{self.url}/doc-convert/image', files=files, headers=self.headers) if response.status_code == 400: self.update_status(doc_id, self.ERROR) raise Exception(f'400 Bad request: {response.json()["message"]}.') elif response.status_code == 200: img_url = response.json()['imageUrl'] else: self.update_status(doc_id, self.ERROR) raise Exception(f'{response.status_code}') return img_url def send_book(self, doc_id, content): if self.is_time_for_refreshing(): self.refresh_token() self.refreshing.wait() json_content = { 'json': json.dumps(content) } response = requests.post(f'{self.url}/doc-convert/{doc_id}/import', json=json_content, headers=self.headers) if response.status_code == 400: self.update_status(doc_id, self.ERROR) raise Exception(f'400 Bad request') elif response.status_code == 200: pass else: self.update_status(doc_id, self.ERROR) raise Exception(f'{response.status_code}') def update_status(self, doc_id, status): if self.is_time_for_refreshing(): self.refresh_token() self.refreshing.wait() response = requests.patch(f'{self.url}/doc-convert/{doc_id}/status/{status}', headers=self.headers) if response.status_code == 400: raise Exception(f'400 Bad request') elif response.status_code == 200: pass else: raise Exception(f'{response.status_code}')