簡體   English   中英

無法將 curl 轉換為 python 請求

[英]Can't convert curl to python request

我在開發工具的幫助下將請求復制為 CURL 並收到:

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%7C1605813256183; 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", ....

https://curl.trillworks.com/ 的幫助下將 curl 轉換為 python 請求 收到:

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%7C1605813256183; tmr_reqNum=495; TZD=6.683; TD=683',
}

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

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

嘗試此代碼並收到錯誤

正文不是有效的 Latin-1。 如果您想以 UTF-8 編碼發送它,請使用 body.encode('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":"無效的請求格式:無法識別令牌'$':在[來源: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 "parameters": {\\n "category": "UNIVERSITY",\\n "cityId": "10399843062",\\n "query": "\Р\о \с"\\n }\\n}'

收到錯誤

UnicodeEncodeError: 'latin-1' 編解碼器無法對位置 99-101 的字符進行編碼:正文 ('Рос') 不是有效的 Latin-1。 如果您想以 UTF-8 編碼發送它,請使用 body.encode('utf-8')。

  1. 試過

數據 = '{ "id": 38, "parameters": { "category": "UNIVERSITY", "cityId": "10399843062", "query": "\Р\о\с" }}'

收到錯誤:

UnicodeEncodeError: 'latin-1' 編解碼器無法對位置 89-91 的字符進行編碼:正文 ('Рос') 不是有效的 Latin-1。 如果您想以 UTF-8 編碼發送它,請使用 body.encode('utf-8')。

我認為您不小心將$復制到您的 python 代碼中。 嘗試更改為這一行:

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

你甚至可以刪除\\n的:

data = '{ "id": 38, "parameters": { "category": "UNIVERSITY", "cityId": "10399843062", "query": "\u0420\u043E\u0441" }}'

編輯

至於

UnicodeEncodeError: 'latin-1' 編解碼器無法對位置 89-91 的字符進行編碼:正文 ('Рос') 不是有效的 Latin-1。 如果您想以 UTF-8 編碼發送它,請使用 body.encode('utf-8')。

看看這個論壇的結尾

a = "\u13E0\u19E0\u1320"
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": "\u0420\u043E\u0441" }}'
data = data.encode('utf-8')

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM