0

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

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

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

问题来自标志字段。我不知道在那里写什么。Firefox 使用以下字段(文件cookies.sqlite,表 *moz_cookies*),它们与 Netscape 格式对应如下(正确吗?):

主持人 ???路径 isSecure 到期名称值

Chrome 使用以下字段(文件Cookies、表cookie):

主机键???路径安全 expires_utc 名称值

所以,要创建这个cookies.txt文件,我只缺少那个标志字段。上面链接的文件说:

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

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

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

4

1 回答 1

0

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

于 2013-09-26T20:34:59.950 回答