From 4f61d2a1977224db2af4f2319e6560cc62939be5 Mon Sep 17 00:00:00 2001 From: Jeniamakarchik Date: Wed, 5 Feb 2020 16:04:57 +0300 Subject: [PATCH] add script for working with api --- src/access.py | 162 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 162 insertions(+) create mode 100644 src/access.py diff --git a/src/access.py b/src/access.py new file mode 100644 index 0000000..9ecbab0 --- /dev/null +++ b/src/access.py @@ -0,0 +1,162 @@ +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}')