25

我需要一些身份验证才能访问特定的 url。在浏览器中我只需要登录一次,至于其他可以使用 cookie 中的会话 id 的相关 url 不需要进入登录页面。--cookies-file=cookies.txt同样,我可以在 phantomjs 的命令行中使用 cookie 文件中生成的 cookie来打开需要相同 cookie 详细信息的其他页面。

请建议。

4

2 回答 2

29

幻影 JS 和 cookie

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

会话 cookie 呢?

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

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

  1. 从 cookiejar 加载 cookie
  2. 点击 URL 以检查用户是否已登录
  3. 如果没有登录

    登录,将 cookie 保存到 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
 }


});
于 2014-06-12T12:10:24.110 回答
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 管理逻辑并不难。

于 2013-09-11T12:25:45.433 回答