如何使用phantomjs从文件中使用持久性cookie

时间:2013-09-11 11:00:05

标签: authentication automation phantomjs

我需要一些身份验证才能访问特定的网址。在浏览器中我只需要登录一次,因为可以使用cookie中的会话ID的其他相关URL不需要转到登录页面。 同样,我可以使用phantomjs命令行中使用--cookies-file=cookies.txt在cookie文件中生成的cookie来打开需要相同cookie细节的其他页面。

请建议。

2 个答案:

答案 0 :(得分:28)

Phantom JS和cookies

--cookies-file=cookies.txt只会在Cookie jar中存储非会话Cookie。登录和身份验证通常基于会话cookie。

会话cookie怎么样?

要保存这些非常简单,但您应该考虑它们可能会很快过期。

您需要编写程序逻辑来考虑这一点。例如

  1. 从cookiejar加载Cookie
  2. 点击网址以检查用户是否已登录
  3. 如果未登录

    登录,将Cookie保存到cookiejar

  4. 继续处理
  5. 实施例

    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
     }
    
    
    });
    

答案 1 :(得分:9)

选项--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管理逻辑并不困难。