0

Windows 7 で、MinGW で Code::Blocks を使用しています。CURL_LOCK_DATA_COOKIE を有効にしたCURLSHオブジェクトを使用して、libcurl でマルチスレッド Web クローラーを作成して、異なるスレッド間で 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 形式に対応します (これは正しいですか?)。

ホスト ???パスはセキュアな有効期限の名前の値

Chrome は次のフィールドを使用します (ファイルCookie、テーブルCookie ):

ホスト_キー??? パスセキュア expires_utc 名前 値

したがって、このcookies.txtファイルを作成するには、そのフラグ フィールドが欠けているだけです。上にリンクされたドキュメントには次のように書かれています。

flag - 特定のドメイン内のすべてのマシンが変数にアクセスできるかどうかを示す TRUE/FALSE 値。この値は、ドメインに設定した値に応じて、ブラウザーによって自動的に設定されます。

そこに何を書くべきかを本当に教えてくれません。ただし、最初に Firefox/Chrome から RAM に Cookie をロードし、ハード ドライブを経由せずに libcurl に直接渡すことができるはずであることを考えると、ファイルを書き込んでから読み取るのは不必要な作業のように思えます。CURLOPT_COOKIEオプションを見つけましたが、いくつかのフィールド (つまり、ドメイン) がありません。また、そのオプションは、後で使用するために Cookie を保存していないようです。対応するドメインの Cookie のみを使用するすべてのトランザクションでそれを呼び出す必要があるようです (これらの Cookie が変更された場合はどうなりますか? libcurl がそれを実行できることを考えると、手動で変更を確認したくありません)。

では、Firefox/Chrome からのすべての Cookie がメモリにあるとすれば、それらを libcurl に渡すにはどうすればよいでしょうか? 唯一のオプションがcookies.txtファイルを使用することである場合、フラグ フィールドに何を記述すればよいですか?

4

1 に答える 1

0

CURLOPT_COOKIELISTを使用して答えを見つけました( Cookieの読み取りにのみ使用できるCURLINFO_COOKIELISTと混同していました)。CURLOPT_COOKIELIST を使用すると、フラグ フィールドを必要としない HTTP ヘッダーとして Cookie を入力できます。日付にフォーマットを指定するだけです。CURLSH オブジェクトに Cookie を設定するには、任意のハンドルに Cookie を指定するだけで十分なようです。

于 2013-09-26T20:34:59.950 に答える