在两个 curl 请求之间保存 cookie

Posted

技术标签:

【中文标题】在两个 curl 请求之间保存 cookie【英文标题】:Save cookies between two curl requests 【发布时间】:2015-08-25 22:24:54 【问题描述】:

我知道使用 cURL 我可以看到我收到的 cookie / headers 通过使用

curl --head www.google.com

而且我知道我可以使用

向我的请求添加标头
curl --cookie "Key=Value" www.google.com

我目前正在测试一个需要持久 cookie 的问题,而且可能有很多。

如何有效地保留两个 cURL 请求之间的 cookie?

如果可能,使用临时文件进行存储。

【问题讨论】:

【参考方案1】:

使用--cookie-jar--dump-header 参数将接收到的cookies 保存到文件中。 --cookie 参数可以稍后从该文件中读回 cookie。

-b, --cookie

(HTTP) 将数据作为 cookie 传递给 HTTP 服务器。它应该是先前在“Set-Cookie:”行中从服务器接收到的数据。数据应采用“NAME1=VALUE1;NAME2=VALUE2”格式。

如果行中没有使用“=”符号,则将其视为文件名,用于从中读取先前存储的 cookie 行,如果它们匹配,则应在此会话中使用。使用此方法还会激活 cookie 引擎,它也会让 curl 记录传入的 cookie,如果您将其与 -L、--location 选项结合使用,这可能会很方便。要从中读取 cookie 的文件的文件格式应该是纯 HTTP 标头(Set-Cookie 样式)或 Netscape/Mozilla cookie 文件格式。

-b 指定的文件,--cookie 仅用作输入。不会将任何 cookie 写入文件。 要存储 cookie,请使用 -c, --cookie-jar 选项

如果您使用此选项,请谨慎行事,并且可能会发生多次转移。如果您使用 NAME1=VALUE1;格式,或者在文件中使用 Set-Cookie 格式并且不指定域,然后为任何域发送 cookie(即使在重定向之后)并且不能被服务器设置的 cookie 修改。如果启用了 cookie 引擎并且服务器设置了同名的 cookie,那么两者都将在未来传输到该服务器时发送,这可能不是您想要的。要解决这些问题,请在 Set-Cookie 中设置域(这样做将包括子域)或使用 Netscape 格式。

如果多次使用此选项,将使用最后一个。

-c, --cookie-jar

(HTTP) 指定您希望 curl 在完成操作后将所有 cookie 写入哪个文件。 Curl 写入之前从指定文件读取的所有 cookie 以及从远程服务器接收到的所有 cookie。如果不知道任何 cookie,则不会写入任何数据。该文件将使用 Netscape cookie 文件格式写入。如果您将文件名设置为单个破折号“-”,cookie 将被写入标准输出。

此命令行选项将激活制作 curl 记录和使用 cookie 的 cookie 引擎。另一种激活它的方法是使用 -b, --cookie 选项。

如果无法创建或写入cookie jar,则整个curl操作不会失败,甚至不会清楚地报告错误。使用 -v 将显示警告,但这是您获得的关于这种可能致命的情况的唯一可见反馈。

自 7.43.0 起,以 Set-Cookie 格式导入的不带域名的 cookie 不会由此选项导出。

如果多次使用此选项,将使用最后指定的文件名。

-D, --dump-header

将协议头写入指定文件。

当您想要存储 HTTP 站点发送给您的标头时,使用此选项非常方便。然后可以使用 -b, --cookie 选项在第二次 curl 调用中读取来自标头的 Cookie! -c, --cookie-jar 选项是存储 cookie 的更好方法

在 FTP 中使用时,FTP 服务器响应行被视为“标题”,因此保存在那里。

如果多次使用此选项,将使用最后一个

或者,不要使用命令行cURL app,而是编写一些使用libCurl library 的代码。这将使您更直接地控制 cookie 处理。 libCurl 有几个与 HTTP cookie 相关的特性:

curl_easy_getinfo() 的选项:

CURLINFO_COOKIELIST - 获取所有已知的 cookie

curl_easy_setopt() 的选项:

CURLOPT_COOKIE - 设置HTTP Cookie标头的内容

CURLOPT_COOKIEFILE - 从中​​读取 cookie 的文件名

CURLOPT_COOKIEJAR - 将 cookie 存储到的文件名

CURLOPT_COOKIESESSION - 开始一个新的 cookie 会话

CURLOPT_COOKIELIST - 添加或操作保存在内存中的 cookie

然后,您可以根据需要存储 cookie,并根据需要将它们分配给以后的 HTTP 会话。

【讨论】:

嘿,我很久以前就找到了-c 标志,在问了这个问题之后 - 从来没有意识到这里有一个答案。谢谢。 @dw1 是的,这就是要走的路 如果响应没有 Set-Cookie 标头,--cookie-jar(或-b)选项将不会保存任何内容,对吧?需要用re-captcha登录一个网站,但不得不求助a workaround by saving the curl command from Chrome that already had the cookies,只是添加了-b -(打印到stdout),但没有任何乐趣。【参考方案2】:

curl -b cookie.txt -c cookie.txt <url>curl --cookie cookie.txt --cookie-jar cookie.txt <url> 将存储和发送保存的 cookie。

【讨论】:

感谢您提供最简洁的示例。【参考方案3】:

只是为了扩展已接受的答案。使用 --cookie 和 --cookie-jar 标志可以在没有文件写入的情况下使用,使用进程替换:

    写入 STDOUT 并保存到 $cookie 变量中
cookie=$(curl -c - <url>)

    从 $cookie 变量中读取 cookie
curl --cookie <(echo "$cookie") <url>

【讨论】:

【参考方案4】:

感谢大家帮助我找到使用 CURL 登录我的 wordpress 网站的解决方案。这是我的一点贡献,希望对以后遇到这个问题的人也有帮助

对于高于 1706 的 Windows 10 版本,您可以从命令行使用 curl。

curl -c c:\Users\<your-name>\Desktop\cookie.txt -F "log=<your username>" -F "pwd=<your-pwd>" https://acme.net/wp-login.php

您不会在终端中看到任何响应。它只是自我刷新,但您的 cookie 已被存储。

然后在下面键入以读取并发送您刚刚存储的 cookie。

curl -b c:\Users\<your-name>\Desktop\cookie.txt -L https://acme.net/my-profile/

只有登录用户才能访问的整个网页将在您的终端内呈现,包括通过 javascript 动态加载的任何数据。

即使您的 WP 登录 URL 的端点是“/register/log-in”或“/login”,我仍然建议您使用“/wp-login.php”作为端点。这是因为某些 WP 主题在其登录页面的隐藏输入中具有登录随机数。原生 WP 登录页面没有这个。

您可以参考的其他来源:

https://wpmayor.com/login-to-wordpress-dashboard-via-curl/

https://gist.github.com/subfuzion/08c5d85437d5d4f00e58

https://www.youtube.com/watch?v=B4ilccLUQVs

https://makandracards.com/makandra/48262-how-to-use-cookies-with-curl

【讨论】:

以上是关于在两个 curl 请求之间保存 cookie的主要内容,如果未能解决你的问题,请参考以下文章

如果需要两个cookie发往客服端,需要的代码是

Cookie 和 Session

如何HttpOnly的cookie与AJAX请求工作

两个系统之间怎么实现单点登录?

cookie和session以及区别

Python爬虫为何可以这么叼?爬取百度云盘资源!并保存到自己云盘