· 4 years ago · Oct 18, 2020, 07:46 PM
1import asyncio
2
3import aiohttp
4from aiohttp import ClientError
5
6from config import API_TOKEN, API_SECRET_TOKEN, API_BASE_URL
7
8
9class CargolinkAPI:
10 """
11 Класс для взаимодействия с API http://api.cargolink.ru
12 """
13 _OAUTH_TOKEN = API_TOKEN
14 _OAUTH_SECRET_TOKEN = API_SECRET_TOKEN
15 _API_URL = API_BASE_URL
16 _HEADERS = {'Content-Type': 'application/x-www-form-urlencoded',
17 'Authorization': f'OAuth {_OAUTH_SECRET_TOKEN}',
18 }
19 loop = asyncio.new_event_loop()
20 asyncio.set_event_loop(loop)
21 _timeout = aiohttp.ClientTimeout(total=2*20, connect=30, sock_connect=None, sock_read=None)
22 _session = aiohttp.ClientSession(loop=loop, timeout=_timeout, headers=_HEADERS)
23
24 # def __init__(self):
25 # loop = asyncio.get_event_loop()
26 # coro = asyncio.start_server(self.TCPRequestHandler, host, port, loop=loop)
27 # server = loop.run_until_complete(coro)
28 # try:
29 # loop.run_forever()
30 # except:
31 # server.close()
32 # loop.run_until_complete(server.wait_closed())
33 # loop.close()
34
35 async def __aexit__(self):
36 await self._session.close()
37
38 async def _request(self, method, request_url, **kwargs):
39 try:
40 async with self._session.request(method=method,
41 url=request_url,
42 params=kwargs.get('params'),
43 data=kwargs.get('data'),
44 json=kwargs.get('json')
45 ) as response:
46 return await self._response(response)
47 except ClientError as e:
48 raise ClientError(e)
49
50 async def _response(self, response):
51 if response.status in [200, 201]:
52 try:
53 response_json = await response.json()
54 return response_json
55 except AttributeError:
56 return response
57 else:
58 e = {response.status_code: f'Ошибка: {response}'}
59 raise ValueError(e, response.text)
60
61 async def search_city(self, city_name: str, is_city=None):
62 """
63 Метод для получения данных по населённому пункту.
64 :param city_name: city name
65 :param is_city: Optional. Binary 1 or 0
66 :return:
67 Example return:
68 Array (
69 [0] => Array
70 (
71 [city_id] => ChIJ7WVKx4w3lkYR_46Eqz9nx20
72 [name] => Санкт-Петербург, Russia
73 )
74 [1] => Array
75 (
76 [city_id] => ChIJrxHfwIw3lkYRYNv-Lsu0aR8
77 [name] => Санкт-Петербург, Saint Petersburg, Russia
78 )
79 )
80 """
81 method = 'post'
82 request_url = self._API_URL + '/mobileloadsapi/countries'
83 json_data = dict()
84 json_data['cityname'] = city_name
85 json_data['is_city'] = is_city
86 return await self._request(method, request_url, json=json_data)
87
88 async def search_offers_cargo(self, place_id_from=None, place_id_to=None, car_type=None,
89 loadtypes=None, weight_min=None, weight_max=None, v_qube_min=None,
90 v_qube_max=None, date_from=None, date_to=None, only_new=None,
91 viewed=None, phoned=None, faved=None, ids=None,
92 offset=None, limit=None):
93 """
94 Методо возвращает данные по всем грузам с учётом фильтров.
95 :param place_id_from:
96 :param place_id_to:
97 :param car_type:
98 :param loadtypes:
99 :param weight_min:
100 :param weight_max:
101 :param v_qube_min:
102 :param v_qube_max:
103 :param date_from:
104 :param date_to:
105 :param only_new:
106 :param viewed:
107 :param phoned:
108 :param faved:
109 :param ids:
110 :param offset:
111 :param limit:
112 :return:
113 """
114 method = 'get'
115 request_url = self._API_URL + '/mobileloadsapi/searchofferscargo'
116 json_data = dict()
117 json_data['place_id_from'] = place_id_from
118 json_data['place_id_to'] = place_id_to
119 json_data['car_type'] = car_type
120 json_data['loadtypes'] = loadtypes
121 json_data['weight_min'] = weight_min
122 json_data['weight_max'] = weight_max
123 json_data['v_qube_min'] = v_qube_min
124 json_data['v_qube_max'] = v_qube_max
125 json_data['date_from'] = date_from
126 json_data['date_to'] = date_to
127 json_data['only_new'] = only_new
128 json_data['viewed'] = viewed
129 json_data['phoned'] = phoned
130 json_data['faved'] = faved
131 json_data['ids'] = ids
132 json_data['offset'] = offset
133 json_data['cityname'] = limit
134 return await self._request(method, request_url, json=json_data)
135
136 async def offer_cargo(self, cargo_id):
137 """
138 Метод возвращает по id данные по грузу.
139 :param cargo_id:
140 :return:
141 """
142 method = 'get'
143 request_url = self._API_URL + '/mobileloadsapi/offerscargo/' + cargo_id
144 return await self._request(method, request_url)
145