【问题标题】:How to use curl to get a GET request exactly same as using Chrome?如何使用 curl 获取与使用 Chrome 完全相同的 GET 请求?
【发布时间】:2015-04-29 21:45:47
【问题描述】:

我有一个 web api http://something.com/api,我想使用 GET 来获取响应正文。

这是我的命令:

curl "http://something.com/api"

当然,它会失败并给出错误消息。

当我使用 Chrome 并输入上述网址时,一切都正确。但是我用 Firefox 做同样的事情,url 给了我同样的错误信息。我尝试使用 Chrome 扩展 DHC 重复该操作,请求再次给出正确响应。经过一番搜索,我相信 curl 选项 --user-agent 会有所作为。将用户代理设置为 Chrome 的正确方法是什么?或者这不是重点,问题来自其他领域?非常感谢。

【问题讨论】:

    标签: curl browser httprequest user-agent simulate


    【解决方案1】:

    如果需要在 curl 请求中设置用户头字符串,可以使用-H 选项设置用户代理,如:

    curl -H "user-agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.182 Safari/537.36" http://stackoverflow.com/questions/28760694/how-to-use-curl-to-get-a-get-request-exactly-same-as-using-chrome
    

    在 2021 年 2 月 22 日从最新的 Chrome 中更新了用户代理


    使用像Charles Proxy 这样的代理工具确实有助于缩短您所要求的工作。以下是我所做的,以这个 SO 页面为例(截至 2015 年 7 月,使用 Charles 版本 3.10):

    1. 让 Charles Proxy 运行
    2. 使用浏览器发出网络请求
    3. 在 Charles Proxy 中查找所需的请求
    4. 在 Charles Proxy 中右键单击请求
    5. 选择“复制 cURL 请求”

    您现在有一个 cURL 请求,您可以在终端中运行该请求,该请求将反映您的浏览器发出的请求。这是我对该页面的请求的样子(删除了 cookie 标头):

    curl -H "Host: stackoverflow.com" -H "Cache-Control: max-age=0" -H "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8" -H "User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.89 Safari/537.36" -H "HTTPS: 1" -H "DNT: 1" -H "Referer: https://www.google.com/" -H "Accept-Language: en-US,en;q=0.8,en-GB;q=0.6,es;q=0.4" -H "If-Modified-Since: Thu, 23 Jul 2015 20:31:28 GMT" --compressed http://stackoverflow.com/questions/28760694/how-to-use-curl-to-get-a-get-request-exactly-same-as-using-chrome
    

    【讨论】:

    • 如果Charles支持一次性复制/导出多个cURL请求就更好了
    • 某些 API,例如 ArcGIS,只会尊重 Accept: text/html 标头来强制 HTML 输出。
    • curl -A agent_name 是一个捷径
    【解决方案2】:

    打开 Chrome 开发者工具,转到网络选项卡,提出您的请求(如果页面刷新,您可能需要检查“保留日志”)。找到左侧的请求,右键,“复制为cURL”。

    【讨论】:

    • 但是“复制为 cURL”中的 cookie 会在几分钟内过期。至少在大多数网站的情况下。我怎样才能自动化它来获取新的cookie?
    【解决方案3】:

    检查 chrome 随请求发送的 HTTP 标头(使用浏览器扩展程序或代理),然后尝试使用 CURL 发送相同的标头 - 可能一次一个,直到您确定哪个标头使请求工作。

    curl -A [user-agent] -H [headers] "http://something.com/api"

    【讨论】:

    • 我不熟悉。您能给我一些将用户代理设置为 chrome 和可能的标题的真实示例吗?
    猜你喜欢
    • 2016-01-24
    • 2019-02-27
    • 2013-04-13
    • 1970-01-01
    • 2018-03-30
    • 1970-01-01
    • 2021-05-05
    • 2021-03-17
    • 1970-01-01
    相关资源
    最近更新 更多