2013-09-21 51 views
0

我使用的是MinGW的代碼::塊,在Windows 7 我正在寫與libcurl的多線程網絡爬蟲,使用帶有CURL_LOCK_DATA_COOKIE一個CURLSH對象啓用分享不同的線程之間餅乾。 一旦一個句柄接收到一個cookie,它將在每個其他句柄之間成功共享。但是,我需要從Firefox或Chrome複製最初的一組Cookie。我發現他們使用sqlite存儲cookie,並且我已經能夠從我的程序中讀取它們兩個的cookie。問題是,我如何將這些cookie傳給libcurl?理想情況下,應該有一些方法將這些cookie提供給我的CURLSH對象,以便將它們分發到每個句柄。我找不到這樣的事情。導入Firefox和Chrome餅乾的libcurl

this document,我可以儘量節約,我從我的瀏覽器讀取到cookie.txt的文件,從而降低了尋找在火狐/ Chrome和Netscape的格式使用的數據庫中的字段之間的對應關係的餅乾。 Netscape使用以下格式:

域標誌路徑安全期滿名值

問題帶有標誌字段。我不知道該寫什麼。 Firefox使用以下字段(文件cookies.sqlite,表* moz_cookies *),它與網景格式的對應關係如下(這是正確的?):

主機???路徑的isSecure期滿名稱值

Chrome使用以下字段(文件餅乾,表餅乾):

host_key ???道路安全expires_utc名值

所以,要創建這個cookie.txt的文件,我只缺少的標誌字段。上面鏈接的文檔說:

flag - 一個TRUE/FALSE值,指示給定域 中的所有機器是否都可以訪問該變量。該值由 瀏覽器自動設置,具體取決於您爲域設置的值。

這其實並沒有告訴我該寫什麼。 然而,寫一個文件然後閱讀它似乎是不必要的工作,因爲我會先從RAM/Firefox中加載Firefox/Chrome中的cookies,並且我應該可以直接將它們提供給libcurl,而無需通過硬盤驅動器。我找到CURLOPT_COOKIE選項,但它缺少一些字段(即域)。此外,該選項似乎不會保存後續使用的Cookie。它看起來像我需要爲每個事務調用它只有相應的域的cookie(以及如果這些cookie被更改?如果libcurl可以做到這一點,我不想手動檢查更改)。

因此,鑑於我在內存中擁有來自Firefox/Chrome的所有Cookie,我如何將它們交給libcurl?如果唯一的選擇是使用cookies.txt文件,我應該在標誌字段中寫什麼?

回答

0

我找到了答案,CURLOPT_COOKIELIST(我很困惑它與CURLINFO_COOKIELIST,它只能用於讀取cookie)。使用CURLOPT_COOKIELIST,我可以將我的cookie作爲HTTP標頭輸入,而不需要該標誌字段。我只需要給出日期的格式。它看起來像指定任何句柄的cookie足以將它們設置在CURLSH對象中,因爲我可以將它們設置爲一個句柄並讀取其他任何句柄。