我在 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文件,我应该在标志字段中写什么?