Не удается преобразовать curl в запрос python

#python #curl #python-requests

#python #curl #python-запросы

Вопрос:

Я скопировал запрос как CURL с помощью dev-tools и получил:

 curl 'https://ok.ru/web-api/v2/search/suggestCommunities' 
  -H 'authority: ok.ru' 
  -H 'accept: application/json, text/javascript, */*; q=0.01' 
  -H 'dnt: 1' 
  -H 'strd: false' 
  -H 'ok-screen: searchResult' 
  -H 'content-type: text/plain;charset=UTF-8' 
  -H 'user-agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.75 Safari/537.36' 
  -H 'tkn: eezDYrXx08aiDcsqCCCheb1fGdGIvuJ9' 
  -H 'origin: https://ok.ru' 
  -H 'sec-fetch-site: same-origin' 
  -H 'sec-fetch-mode: cors' 
  -H 'sec-fetch-dest: empty' 
  -H 'referer: https://ok.ru/' 
  -H 'accept-language: ru-RU,ru;q=0.9,en-US;q=0.8,en;q=0.7' 
  -H 'cookie: bci=5639450919803662892; _statid=72da67cb-c979-4442-948d-b76b70d16b59; tmr_lvid=2ac18e93052a4516697406103a6db5b3; tmr_lvidTS=1575669087459; msg_conf=2468555756792551; _flashVersion=0; cudr=0; klos=0; AUTHCODE=EjUzQb4TKlF4mTbJklDGt-dg-65th4TTwrbLdAPrK8mvgyWCFTIdNoeMcBkVrvZruEBK9frXso45DCrvoq8K9p-7ZUcDvASmGvV13LQ5gxgls-AFQjI7ZEPmb6u08TLFJ57ZCb4R00LhHto_3; JSESSIONID=a381dc641575389c384c9c7eacd747d14853670edfe4c807.f00f63fb; LASTSRV=ok.ru; viewport=762; TZ=6; CDN=; nbp=; tmr_detect=1|1605813256183; tmr_reqNum=495; TZD=6.683; TD=683' 
  --data-binary $'{n  "id": 38,n  "parameters": {n    "category": "UNIVERSITY",n    "cityId": "10399843062",n    "query": "Рос"n  }n}' 
  --compressed
 

Скопированный запрос на консоль (curl работает нормально). Полученный результат

 {"id":"38","success":true,"result":[{"id":"6100259920","category":"UNIVERSITY","name":"СПбГУКиТ, Санкт-Петербургский государственный университет кино и телевидения (бывш. ЛИКИ)","badgeName":"СПбГУКиТ"},{"id":"6098569210","category":"UNIVERSITY","name":"СПбГУЭФ (ФИНЭК), Санкт-Петербургский государственный университет экономики и финансов (бывш. ЛФЭИ им. Н.А. Вознесенского)","badgeName":"СПбГУЭФ (ФИНЭК)"},{"id":"6101852454","category":"UNIVERSITY","name":"СПбГУКИ, Санкт-Петербургский государственный университет культуры и искусств (бывш. ЛГИК им. Н.К. Крупской, СПбГАК)","badgeName":"СПбГУКИ"},{"id":"6096539930","category":"UNIVERSITY", ....
 

Преобразовал curl в запросы python с помощью https://curl.trillworks.com / Получено:

 import requests

headers = {
    'authority': 'ok.ru',
    'accept': 'application/json, text/javascript, */*; q=0.01',
    'dnt': '1',
    'strd': 'false',
    'ok-screen': 'searchResult',
    'content-type': 'text/plain;charset=UTF-8',
    'user-agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.75 Safari/537.36',
    'tkn': 'eezDYrXx08aiDcsqCCCheb1fGdGIvuJ9',
    'origin': 'https://ok.ru',
    'sec-fetch-site': 'same-origin',
    'sec-fetch-mode': 'cors',
    'sec-fetch-dest': 'empty',
    'referer': 'https://ok.ru/',
    'accept-language': 'ru-RU,ru;q=0.9,en-US;q=0.8,en;q=0.7',
    'cookie': 'bci=5639450919803662892; _statid=72da67cb-c979-4442-948d-b76b70d16b59; tmr_lvid=2ac18e93052a4516697406103a6db5b3; tmr_lvidTS=1575669087459; msg_conf=2468555756792551; _flashVersion=0; cudr=0; klos=0; AUTHCODE=EjUzQb4TKlF4mTbJklDGt-dg-65th4TTwrbLdAPrK8mvgyWCFTIdNoeMcBkVrvZruEBK9frXso45DCrvoq8K9p-7ZUcDvASmGvV13LQ5gxgls-AFQjI7ZEPmb6u08TLFJ57ZCb4R00LhHto_3; JSESSIONID=a381dc641575389c384c9c7eacd747d14853670edfe4c807.f00f63fb; LASTSRV=ok.ru; viewport=762; TZ=6; CDN=; nbp=; tmr_detect=1|1605813256183; tmr_reqNum=495; TZD=6.683; TD=683',
}

data = '${\n "id": 38,\n "parameters": {\n "category": "UNIVERSITY",\n "cityId": "10399843062",\n "query": "u0420u043Eu0441"\n }\n}'

response = requests.post('https://ok.ru/web-api/v2/search/suggestCommunities', headers=headers, data=data)
print(response.content)
 

Попробовал этот код и получил ошибку

В теле недопустимый Latin-1. Используйте body.encode(‘utf-8’), если вы хотите отправить его в кодировке UTF-8.

Добавлено .encode(‘utf-8’))

 response = requests.post('https://ok.ru/web-api/v2/search/suggestCommunities', headers=headers, data=data.encode('utf-8'))
 

Но получен недопустимый результат:

b'{«success»:false,»error»:{«type»:1,»typeName»:»INVALID_REQUEST»,»errorCode»:»api.invalid-format»,»errorMessage»:» Недопустимый формат запроса: Нераспознанный токен ‘$’: ожидалось (‘true’, ‘false’ или ‘null’)n в [Источник: org.apache.catalina.connector.CoyoteInputStream@5399802b; строка: 1, столбец: 3]»},»результат»: null}’

Как я могу получить действительный результат?

 {"id":"38","success":true,"result":[{"id":"6100259920","category":"UNIVERSITY","name":"СПбГУКиТ, Санкт-Петербургский государственный университет кино и телевидения (бывш. ЛИКИ)","badgeName":"СПбГУКиТ"},{"id":"6098569210","category":"UNIVERSITY","name":"СПбГУЭФ (ФИНЭК), Санкт-Петербургский государственный университет экономики и финансов (бывш. ЛФЭИ им. Н.А. Вознесенского)","badgeName":"СПбГУЭФ (ФИНЭК)"},
 

Обновить

  1. Пытался использовать данные без $

    data = ‘{n «id»: 38,n «параметры»: {n «категория»: «УНИВЕРСИТЕТ»,n «CityId»: «10399843062»,n «запрос»: «u0420 u043E u0441″n } n}’

Получена ошибка

Ошибка UnicodeEncodeError: кодек ‘latin-1’ не может кодировать символы в позиции 99-101: тело (‘Рос’) недопустимо Latin-1. Используйте body.encode(‘utf-8’), если вы хотите отправить его в кодировке UTF-8.

  1. Пробовал

data = ‘{ «id»: 38, «параметры»: { «категория»: «УНИВЕРСИТЕТ», «CityId»: «10399843062», «запрос»: «u0420 u043E u0441» }}’

Получена ошибка:

Ошибка UnicodeEncodeError: кодек ‘latin-1’ не может кодировать символы в позиции 89-91: тело (‘Рос’) недопустимо Latin-1. Используйте body.encode(‘utf-8’), если вы хотите отправить его в кодировке UTF-8.

Комментарии:

1. Команда curl содержит знак доллара вне кавычек: --data-binary $'{...}' , но код python содержит знак доллара внутри кавычек: data = '${...}'

2. Спасибо. Но это не помогло. Смотрите обновления в описании

Ответ №1:

Я думаю, вы случайно скопировали $ в свой код python. Попробуйте изменить эту строку:

 data = '{\n "id": 38,\n "parameters": {\n "category": "UNIVERSITY",\n "cityId": "10399843062",\n "query": "u0420u043Eu0441"\n }\n}'
 

Вы могли бы даже удалить n ‘s:

 data = '{ "id": 38, "parameters": { "category": "UNIVERSITY", "cityId": "10399843062", "query": "u0420u043Eu0441" }}'
 

Редактировать

Что касается

Ошибка UnicodeEncodeError: кодек ‘latin-1’ не может кодировать символы в позиции 89-91: тело (‘Рос’) недопустимо Latin-1. Используйте body.encode(‘utf-8’), если вы хотите отправить его в кодировке UTF-8.

посмотрите конец этого форума

 a = "u13E0u19E0u1320"
a.encode('latin1')  # Throws UnicodeEncodeError, proves that this can't be expressed in ISO-8859-1.
a.encode('utf-8')  # Totally fine.
 

Так что вы, вероятно, могли бы попробовать что-то вроде:

 data = '{ "id": 38, "parameters": { "category": "UNIVERSITY", "cityId": "10399843062", "query": "Poc" }}'
 

или

 data = '{ "id": 38, "parameters": { "category": "UNIVERSITY", "cityId": "10399843062", "query": "u0420u043Eu0441" }}'
data = data.encode('utf-8')
 

Комментарии:

1. Спасибо. Но это не помогло. Смотрите обновления в описании

2. @mascai я соответствующим образом изменил ответ. Этот лучше?

3. Это не сработало для русских букв. Это работает только для английского слова «Рос». Как я могу это исправить?

4. Хм, попробуйте использовать оригинальный вариант с u0420u043Eu0441 , но после data = '... ввода новой строки data = data.encode('utf-8') ?