Интеграция с CDEK. Калькулятор. Расчет по доступным тарифам

Сергей С

Новичок
Пользователь
Апр 25, 2023
7
1
3
Добрый день, пробую делать запрос на тестовый сервис CDEK, по API https://api-docs.cdek.ru/63345519.html
Код:
import requests

session = requests.Session()
response_token = session.post('https://api.edu.cdek.ru/v2/oauth/token?parameters', {
    'grant_type': 'client_credentials',
    'client_id': 'EMscd6r9JnFiQ3bLoyjJY6eM78JrJceI',
    'client_secret': 'PjLZkKBHEiLK3YsjtNrt3TGNG0ahs3kG',
}).json()


headers = {
    "Content-Type": "application/json",
    "Accept": "application/json",
    "Authorization": "Bearer " + response_token['access_token']
}

print(headers)

url = "    https://api.edu.cdek.ru/v2/calculator/tarifflist"
data = {
    "type": 1,
    "currency": 1,
    "lang": "rus",
    "from_location": {
        "code": 270
    },
    "to_location": {
        "code": 44
    },
    "packages": [
        {
            "height": 10,
            "length": 10,
            "weight": 4000,
            "width": 10
        }
    ]
}
print(data)
x = session.post(url=url, data=data, headers=headers)

print(x.text)

Сервис возвращает ошибку
{"errors":[{"code":"v2_bad_request","message":"Bad request"}]}

Не очень информационная ошибка))) Помогите пожалуйста разобраться, что не так с запросом.
 

regnor

Модератор
Команда форума
Модератор
Июл 7, 2020
2 581
457
83
не разбирался в апи, попробуйте на боевом отправить запрос, возможно там ошибка будет лучше описана
так же в документации есть пример запроса, попробуйте отправить его
 

Сергей С

Новичок
Пользователь
Апр 25, 2023
7
1
3
не разбирался в апи, попробуйте на боевом отправить запрос, возможно там ошибка будет лучше описана
так же в документации есть пример запроса, попробуйте отправить его
Пробывал и с боевыми настройками, ошибка такая же, боевые данные для токена не могу предоставить.
так же запрос в DATA я взял из примера который в API CDEK указан.
 

robisho

Активный пользователь
Пользователь
Окт 19, 2020
151
26
28
в postman запрос отработал норм с таким хэдером

Python:
headers = {
    "Content-Type": "application/json",
    "Content-Length": "подставляется автоматически Postman",
    "Host": "https://cdek.ru",
    "User-Agent": "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36",
    "Accept": "*/*",
    "Accept-Encoding": "gzip, deflate, br",
    "Connection": "keep-alive",
    "Authorization": f"Bearer {тут токен}"
}

нужно разобраться с Content-Length - что туда запихать...
 

Сергей С

Новичок
Пользователь
Апр 25, 2023
7
1
3
в postman запрос отработал норм с таким хэдером

Python:
headers = {
    "Content-Type": "application/json",
    "Content-Length": "подставляется автоматически Postman",
    "Host": "https://cdek.ru",
    "User-Agent": "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36",
    "Accept": "*/*",
    "Accept-Encoding": "gzip, deflate, br",
    "Connection": "keep-alive",
    "Authorization": f"Bearer {тут токен}"
}

нужно разобраться с Content-Length - что туда запихать...
"Content-Length" я так понимаю не нужно передавать, его сервер рассчитывает

указал так

Код:
headers = {
    "Content-Type": "application/json",
    "Host": "https://cdek.ru",
    "User-Agent": "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36",
    "Accept": "*/*",
    "Accept-Encoding": "gzip, deflate, br",
    "Connection": "keep-alive",
    "Authorization": "Bearer" + response_token['access_token']
}

возникла ошибка
<html>
QRATOR HTTP 400
</html>

<!-- a padding to disable MSIE and Chrome friendly error page -->
<!-- a padding to disable MSIE and Chrome friendly error page -->
 

robisho

Активный пользователь
Пользователь
Окт 19, 2020
151
26
28
Postman без Content-Length тоже не хотел работать. значит нужен этот ключ при запросе.
 

Сергей С

Новичок
Пользователь
Апр 25, 2023
7
1
3
Postman без Content-Length тоже не хотел работать. значит нужен этот ключ при запросе.
Добрый день, дело точно не в Content-Length

тк get запрос проходит к запросу на список населенных пунктов в виде
Код:
import requests

session = requests.Session()
response_token = session.post('https://api.edu.cdek.ru/v2/oauth/token?parameters', {
    'grant_type': 'client_credentials',
    'client_id': 'EMscd6r9JnFiQ3bLoyjJY6eM78JrJceI',
    'client_secret': 'PjLZkKBHEiLK3YsjtNrt3TGNG0ahs3kG',
}).json()


headers = {
    "Content-Type": "application/json",
    "Accept": "application/json",
    "Authorization": "Bearer " + response_token['access_token']
}

print(headers)

url = "https://api.edu.cdek.ru/v2/location/cities/?country_codes=RU"
x = session.get(url=url,headers=headers)

print(x.text)
 
Последнее редактирование:

Сергей С

Новичок
Пользователь
Апр 25, 2023
7
1
3
Нашел решение, оказалось оно было банальным
Я писал x = session.post(url=url,headers=headers,data=data)
а нужно было
x = session.post(url=url,headers=headers,json=data)

Итого работающий запрос на тестовую среду имеет вид

Python:
import requests

session = requests.Session()
response_token = session.post('https://api.edu.cdek.ru/v2/oauth/token?parameters', {
    'grant_type': 'client_credentials',
    'client_id': 'EMscd6r9JnFiQ3bLoyjJY6eM78JrJceI',
    'client_secret': 'PjLZkKBHEiLK3YsjtNrt3TGNG0ahs3kG',
}).json()


headers = {
    "Content-Type": "application/json",
    "Accept": "application/json",
    "Authorization": "Bearer " + response_token['access_token']
}

url = "    https://api.edu.cdek.ru/v2/calculator/tarifflist"
data = {
    "type": 1,
    "date": "2020-11-03T11:49:32+0700",
    "currency": 1,
    "lang": "rus",
    "from_location": {
        "code": 270
    },
    "to_location": {
        "code": 44
    },
    "packages": [
        {
            "height": 10,
            "length": 10,
            "weight": 4000,
            "width": 10
        }
    ]
}
print(url,headers,data)
x = session.post(url=url,headers=headers,json=data)

print(x.text)
 
  • Мне нравится
Реакции: robisho

Форум IT Специалистов