将 Firefox 和 Chrome cookie 导入 libcurl

Importing Firefox and Chrome cookies to libcurl

本文关键字:导入 libcurl cookie Chrome Firefox      更新时间:2023-10-16

我在Windows 7下使用Code::Blocks与MinGW。我正在使用libcurl编写一个多线程网络爬虫,使用启用了CURL_LOCK_DATA_COOKIE的CURLSH对象在不同线程之间共享cookie。句柄收到 Cookie 后,它将在每个其他句柄之间成功共享。但是,我需要从Firefox或Chrome复制初始的cookie集。我发现他们使用 sqlite 存储 cookie,我已经能够从我的程序中读取它们中的 cookie。问题是,我如何将这些饼干提供给 libcurl?理想情况下,应该有某种方法将这些 cookie 提供给我的 CURLSH 对象,以便将它们分发到每个句柄。我没有发现这样的事情。

按照本文档,我可以尝试将从浏览器中读取的 cookie 保存到 cookie.txt 文件中,这简化为查找 Firefox/Chrome 使用的数据库中的字段与 Netscape 格式之间的对应关系。Netscape使用以下格式:

域标志路径安全过期名称值

问题出在标志字段上。我不知道在那里写什么。Firefox 使用以下字段(文件 cookie.sqlite,table *moz_cookies*),它们与 Netscape 格式相对应,如下所示(这是正确的吗?):

主机???路径是安全到期名称值

Chrome 使用以下字段(文件 Cookie、Table Cookie):

host_key ???路径安全expires_utc名称值

因此,要创建此cookie.txt文件,我只缺少该标志字段。上面链接的文件说:

flag - 一个 TRUE/FALSE 值,指示给定域中的所有计算机是否 可以访问该变量。此值由 浏览器,具体取决于您为域设置的值。

这并没有真正告诉我在那里写什么。但是,编写文件然后读取它似乎是不必要的工作,因为我将首先在 RAM 中加载来自 Firefox/Chrome 的 cookie,并且我应该能够将它们直接交给 libcurl,而无需通过硬盘驱动器。我找到了CURLOPT_COOKIE选项,但它缺少一些字段(即域)。此外,该选项似乎不会保存 cookie 以供以后使用。看起来我需要只使用相应域的 cookie 为每笔交易调用它(如果这些 cookie 被更改怎么办?我不想手动检查更改,因为 libcurl 可以做到这一点)。

那么,鉴于我在内存中拥有来自Firefox/Chrome的所有cookie,我如何将它们提供给libcurl?如果唯一的选择是使用 cookie.txt 文件,我应该在标志字段中写什么?

我已经找到了答案,CURLOPT_COOKIELIST(我把它与CURLINFO_COOKIELIST混淆了,它只能用于读取cookie)。使用 CURLOPT_COOKIELIST,我可以将我的 cookie 作为 HTTP 标头输入,它不需要该标志字段。我只需要为日期提供格式。看起来为任何句柄指定 cookie 就足以在 CURLSH 对象中设置它们,因为我可以在一个句柄中设置它们并在任何其他句柄中读取它们。