Общие принципы
API принимает GET и POST HTTP запросы. В случае успешного запроса сервер отвечает статусом 200.
Формат JSON ответа от сервера:
{
"data": {},
"errors": [],
"status": "ok"
}
- data - [] или {}
- errors - список ошибок
- status - ok или bad
При авторизации система выдает sid, все последующие запросы выполняются передачей этого идентификатора. Cрок жизни идентификатора 15 минут. Обновлять его требуется только при получении ошибки WrongSIDException в поле errors.
Следующие сценарии будут расценены сервером как избыточные и могут отбрасываться:
- Авторизация и получение SID перед каждым запросом;
- Обращение к серверу со скоростью чаще, чем 10 вызовов в минуту;
Для обеспечения равномерной нагрузки на сетевое и серверное оборудование, компания SAURES оставляет за собой право ограничивать количество запросов в единицу времени, а также может создавать БАН листы IP адресов нарушителей. Необходимо использовать принцип необходимого и достаточного объема обмена данными с сервером!
Пример получения списка объектов
Python3.7/aiohttp
import asyncio
from aiohttp import ClientSession, ClientOSError
API_URL = 'https://api.saures.ru/1.0'
EMAIL = 'demo@saures.ru'
PASSWORD = 'demo'
def api_limits(func):
async def wrapped(*args, **kwargs):
n = 3 # кол-во попыток
for i in range(n):
try:
return await func(*args, **kwargs)
except ClientOSError:
await asyncio.sleep(10)
raise ValueError('Максимальное количество попыток')
return wrapped
@api_limits
async def get_sid(email, password):
params = {
'email': email,
'password': password
}
async with ClientSession() as session:
async with session.request('POST', API_URL + '/login',
data=params) as request:
response = await request.json()
if response['status']=='ok':
return response['data']['sid']
elif 'WrongCredsException' in [e['name'] for e in response['errors']]:
raise ValueError('Неправильный email или пароль')
@api_limits
async def user_objects(sid):
n = 3 # кол-во попыток
for i in range(n):
async with ClientSession() as session:
async with session.request('GET', API_URL + '/user/objects',
params={'sid': sid}) as request:
response = await request.json()
if response['status']=='ok':
print(response['data'])
return response['data']
elif 'WrongSIDException' in [e['name'] for e in response['errors']]:
if i < n - 1: sid = await get_sid()
async def main():
sid = await get_sid(email=EMAIL, password=PASSWORD)
objects = await user_objects(sid=sid)
print(objects)
asyncio.run(main())