Stu*_*ens 5 curl google-chrome http devtools
我正在尝试复制来自 Chrome 浏览器的请求。当我打开 url https://ticket.bolshoi.ru/shows时,有一个对https://ticket.bolshoi.ru/api/v1/client/shows的 GET 请求返回 json。我从 DevTools 复制了 cURL 请求。这是我得到的:
curl 'https://ticket.bolshoi.ru/api/v1/client/shows' \
-H 'Accept: application/json, text/plain, */*' \
-H 'Accept-Language: ru-RU,ru;q=0.9,en-US;q=0.8,en;q=0.7' \
-H 'Connection: keep-alive' \
-H 'Cookie: skipped for security reason' \
-H 'Referer: https://ticket.bolshoi.ru/shows' \
-H 'Sec-Fetch-Dest: empty' \
-H 'Sec-Fetch-Mode: cors' \
-H 'Sec-Fetch-Site: same-origin' \
-H 'User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36' \
-H 'sec-ch-ua: "Chromium";v="118", "Google Chrome";v="118", "Not=A?Brand";v="99"' \
-H 'sec-ch-ua-mobile: ?0' \
-H 'sec-ch-ua-platform: "Windows"' \
--compressed
Run Code Online (Sandbox Code Playgroud)
但是当我在 bash shell 中运行此命令时,我得到一个 html 页面而不是 json 响应。为什么会发生这种情况?如何复制请求?
更新-Lkv如果我将密钥添加到curl命令中
,这是输出
* Trying 185.169.155.232:443...
* Connected to ticket.bolshoi.ru (185.169.155.232) port 443 (#0)
* ALPN, offering h2
* ALPN, offering http/1.1
* successfully set certificate verify locations:
* CAfile: /Users/xxx/opt/anaconda3/ssl/cacert.pem
* CApath: none
* TLSv1.3 (OUT), TLS handshake, Client hello (1):
* TLSv1.3 (IN), TLS handshake, Server hello (2):
* TLSv1.3 (IN), TLS handshake, Encrypted Extensions (8):
* TLSv1.3 (IN), TLS handshake, Certificate (11):
* TLSv1.3 (IN), TLS handshake, CERT verify (15):
* TLSv1.3 (IN), TLS handshake, Finished (20):
* TLSv1.3 (OUT), TLS change cipher, Change cipher spec (1):
* TLSv1.3 (OUT), TLS handshake, Finished (20):
* SSL connection using TLSv1.3 / TLS_AES_256_GCM_SHA384
* ALPN, server accepted to use http/1.1
* Server certificate:
* subject: CN=ticket.bolshoi.ru
* start date: Oct 11 23:02:07 2023 GMT
* expire date: Jan 9 23:02:06 2024 GMT
* issuer: C=US; O=Let's Encrypt; CN=R3
* SSL certificate verify ok.
> GET /shows HTTP/1.1
> Host: ticket.bolshoi.ru
> Accept-Encoding: deflate, gzip
> Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7
> Accept-Language: ru-RU,ru;q=0.9,en-US;q=0.8,en;q=0.7
> Cache-Control: no-cache
> Connection: keep-alive
> Cookie: spid=xxx; lang=xxx; sails.sid=xxx; spsc=xxx
> Pragma: no-cache
> Sec-Fetch-Dest: document
> Sec-Fetch-Mode: navigate
> Sec-Fetch-Site: cross-site
> Sec-Fetch-User: ?1
> Upgrade-Insecure-Requests: 1
> User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36
> sec-ch-ua: "Chromium";v="118", "Google Chrome";v="118", "Not=A?Brand";v="99"
> sec-ch-ua-mobile: ?0
> sec-ch-ua-platform: "macOS"
>
* TLSv1.3 (IN), TLS handshake, Newsession Ticket (4):
* TLSv1.3 (IN), TLS handshake, Newsession Ticket (4):
* old SSL session ID is stale, removing
* Mark bundle as not supporting multiuse
< HTTP/1.1 200 OK
< Server: nginx
< Date: Wed, 15 Nov 2023 19:09:06 GMT
< Transfer-Encoding: chunked
< Connection: keep-alive
< Keep-Alive: timeout=15
< access-control-allow-origin: *
< cache-control: no-cache
< expires: Wed, 15 Nov 2023 19:0905 GMT
< pragma: no-cache
< content-type: text/html
< X-SP-CRID: xxx:1
<
<!DOCTYPE html>
...
</html>
* Connection #0 to host ticket.bolshoi.ru left intact
Run Code Online (Sandbox Code Playgroud)
命令的详细输出curl确认已成功连接到ticket.bolshoi.ru端口 443,这意味着基本连接没有问题。
请求标头似乎设置得当。但是,Accept标头设置为接受 HTML ( text/html)、XML、图像和其他类型,但不接受显式 JSON。这可能就是服务器使用 HTML 页面而不是 JSON 响应进行响应的原因。
响应标头表明服务器正在以 内容类型进行响应text/html,该内容类型与您获得的 HTML 响应而不是 JSON 匹配。
因此,请尝试更改AcceptcURL 请求中的标头以明确请求 JSON。
例如:-H 'Accept: application/json'。这会通知服务器您正在等待 JSON 响应。
假设 cURL 命令 ( ) 中的 URLhttps://ticket.bolshoi.ru/api/v1/client/shows是获取 JSON 数据的正确端点,则 cURL 命令的更新版本将是:
curl 'https://ticket.bolshoi.ru/api/v1/client/shows' \
-H 'Accept: application/json' \
-H 'Accept-Language: ru-RU,ru;q=0.9,en-US;q=0.8,en;q=0.7' \
-H 'Connection: keep-alive' \
-H 'Cookie: [Your Cookie Data]' \
-H 'Referer: https://ticket.bolshoi.ru/shows' \
-H 'User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36' \
-Lkv
Run Code Online (Sandbox Code Playgroud)
尝试过这个但没有成功。响应仍然是 HTML 页面。
如果通过浏览器访问时相同的 URL 返回 JSON,请考虑浏览器可能正在发送 cURL 命令中未包含的其他会话数据或 cookie。有时,API 会根据特定于会话的数据提供不同的内容。如果您还没有这样做,请尝试复制浏览器请求中的所有 cookie 并将它们包含在您的 cURL 命令中。
服务器可能会区分浏览器(通常可以处理 HTML 和 JavaScript)发出的请求和 cURL 等非浏览器客户端(通常需要 JSON 等原始数据)发出的请求。这种区分可以基于其他标头Accept,例如User-Agent. 尝试更改User-AgentcURL 命令中的 来模仿不同的浏览器,然后查看响应是否发生变化。
使用浏览器开发人员工具中的网络检查器来检查访问 URL 时发出的确切请求。这可以深入了解浏览器请求和 cURL 命令之间的任何差异。
确保浏览器发送的所有标头都复制到您的 cURL 请求中,而不仅仅是Accept标头。其中包括 cookie、用户代理和任何其他可能影响服务器响应的标头。
如果页面https://ticket.bolshoi.ru/shows执行 JavaScript 来获取 JSON 数据,则 cURL 命令不会复制此行为,因为它不执行 JavaScript。如果在初始页面加载后通过 JavaScript 动态加载 JSON 数据,这一点尤其重要。
您提供的屏幕截图显示了成功的浏览器请求,https://ticket.bolshoi.ru/api/v1/client/shows该请求返回 JSON,如Content-Type响应标头所示application/json;charset=UTF-8。
它还表明服务器正在使用gzip内容编码。确保curl可以使用 来处理 gzip 响应--compressed。
响应标头指示no-cache, no-store, must-revalidate和keep-alive。虽然curl默认情况下不缓存,但确保连接持久性-H 'Connection: keep-alive'可以更准确地反映浏览器行为。
服务器可以根据User-Agent字符串提供不同的内容。如果尚未这样做,请在命令中匹配User-Agent来自浏览器请求的。curl
如果浏览器会话中涉及的 cookie 未出现在您的curl命令中,则这可能是服务器正确响应所必需的。您可以尝试在命令中包含浏览器请求中的所有 cookie curl。
尽管屏幕截图中未显示,但有时服务器会检查Referer和Origin标头来处理请求。如果您的浏览器请求包含这些,您还应该将它们包含在您的curl命令中。
您可以修改以下curl命令模板以包含浏览器请求中的所有相关标头:
curl 'https://ticket.bolshoi.ru/api/v1/client/shows' \
-H 'Accept: application/json' \
-H 'Accept-Encoding: gzip, deflate, br' \
-H 'Accept-Language: ru-RU,ru;q=0.9,en-US;q=0.8,en;q=0.7' \
-H 'Cache-Control: no-cache' \
-H 'Connection: keep-alive' \
-H 'Cookie: [all cookies from browser]' \
-H 'Host: ticket.bolshoi.ru' \
-H 'Referer: [referer from the browser]' \
-H 'User-Agent: [user-agent from the browser]' \
-H 'X-Requested-With: XMLHttpRequest' \
--compressed \
-Lkv
Run Code Online (Sandbox Code Playgroud)
将占位符(例如,[all cookies from browser]、[referer from the browser]、[user-agent from the browser])替换为浏览器请求中的实际值。
该-L标志将遵循重定向,-k将忽略 SSL 验证(谨慎使用),并将-v提供详细的调试输出。
| 归档时间: |
|
| 查看次数: |
202 次 |
| 最近记录: |