add script for working with api

This commit is contained in:
Jeniamakarchik
2020-02-05 16:04:57 +03:00
parent 2803845a41
commit 4f61d2a197

162
src/access.py Normal file
View File

@@ -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}')