import http import os from urllib.parse import urljoin import requests from django.conf import settings from requests import Request os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'poizonstore.settings') class CDEKClient: AUTH_ENDPOINT = 'oauth/token' ORDER_INFO_ENDPOINT = 'orders' CALCULATOR_TARIFF_ENDPOINT = 'calculator/tariff' MAX_RETRIES = 2 def __init__(self, client_id, client_secret, grant_type='client_credentials'): self.api_url = 'https://api.cdek.ru/v2/' self.client_id = client_id self.client_secret = client_secret self.grant_type = grant_type self.session = requests.Session() def request(self, method, url, *args, **kwargs): joined_url = urljoin(self.api_url, url) request = Request(method, joined_url, *args, **kwargs) prepared = self.session.prepare_request(request) retries = 0 while retries < self.MAX_RETRIES: r = self.session.send(prepared) # TODO: handle/log errors if r.status_code == http.HTTPStatus.UNAUTHORIZED: self.authorize() continue return r def authorize(self): params = { 'client_id': self.client_id, 'client_secret': self.client_secret, 'grant_type': self.grant_type } r = self.request('POST', self.AUTH_ENDPOINT, params=params) if r: data = r.json() token = data['access_token'] self.session.headers.update({'Authorization': f'Bearer {token}'}) # FIXME: not working? def get_order_info(self, cdek_number): params = { 'cdek_number': str(cdek_number) } return self.request('GET', self.ORDER_INFO_ENDPOINT, params=params) def calculate_tariff(self, order_data): return self.request('POST', self.CALCULATOR_TARIFF_ENDPOINT, json=order_data) client = CDEKClient(settings.CDEK_CLIENT_ID, settings.CDEK_CLIENT_SECRET) client.authorize() order_data = { "type": "1", "currency": "1", "lang": "rus", "tariff_code": "137", "from_location": { "address": "Санкт-Петербург, Невский пр. 30" }, "to_location": { "address": "Тверь, ул 15 лет октября, дом 50, кВ 2" }, "packages": [ { "weight": 1200, "length": 35, "width": 26, "height": 14 } ] } r = client.calculate_tariff(order_data) print(r)