web-dev-qa-db-ja.com

phantomjsを使用してファイルから永続的なCookieを使用するにはどうすればよいですか

特定のURLにアクセスするために必要な認証がいくつかあります。ブラウザでは、一度ログインするだけで済みます。CookieのセッションIDを使用できる他の関連URLについては、ログインページに移動する必要はありません。同様に、phantomjsのコマンドラインで--cookies-file=cookies.txtを使用してCookieファイルで生成されたCookieを使用して、同じCookieの詳細が必要な他のページを開くことができますか?.

提案してください。

24
Arun

ファントムJSとクッキー

--cookies-file=cookies.txtは、非セッションCookieのみをCookie jarに格納します。ログインと認証は、より一般的にはセッションCookieに基づいています。

セッションCookieについてはどうですか?

これらを保存するのは非常に簡単ですが、すぐに期限切れになる可能性が高いことを考慮する必要があります。

これを考慮するには、プログラムロジックを記述する必要があります。例えば

  1. Cookiejarからcookieをロードする
  2. URLを押して、ユーザーがログインしているかどうかを確認します
  3. ログインしていない場合

    ログイン、cookiesをcookiejarに保存

  4. 処理を続行

var fs = require('fs');
var CookieJar = "cookiejar.json";
var pageResponses = {};
page.onResourceReceived = function(response) {
    pageResponses[response.url] = response.status;
    fs.write(CookieJar, JSON.stringify(phantom.cookies), "w");
};
if(fs.isFile(CookieJar))
    Array.prototype.forEach.call(JSON.parse(fs.read(CookieJar)), function(x){
        phantom.addCookie(x);
    });

page.open(LoginCheckURL, function(status){
 // this assumes that when you are not logged in, the server replies with a 303
 if(pageResponses[LoginCheckURL] == 303)
 {  
    //attempt login
    //assuming a resourceRequested event is fired the cookies will be written to the jar and on your next load of the script they will be found and used
 }


});
28
Jason

オプション--cookies-file=cookies.txtで作成されたファイルはCookieJarからシリアル化されます。余分な文字があり、解析が難しい場合があります。

次のようになります。

[General]
cookies="@Variant(\0\0\0\x7f\0\0\0\x16QList<QNetworkCookie>\0\0\0\0\x1\0\0\0\v\0\0\0{__cfduid=da7fda1ef6dd8b38450c6ad5632...

過去に使った phantom.cookies 。この配列には、PhantomJS起動設定/コマンドラインオプションで指定されたCookieファイルに保存されている既存のCookieデータが事前に入力されます。ただし、 phantom.addCookie を使用して動的Cookieを追加することもできます。

基本的な例は

phantom.addCookie({
    'name':     'Valid-Cookie-Name',   /* required property */
    'value':    'Valid-Cookie-Value',  /* required property */
    'domain':   'localhost',           /* required property */
    'path':     '/foo',
    'httponly': true,
    'secure':   false,
    'expires':  (new Date()).getTime() + (1000 * 60 * 60)   /* <-- expires in 1 hour */
});

これらのメソッドを使用すると、独自のCookie管理ロジックを実装することはそれほど難しくありません。

9
Cybermaxs