19

我正在尝试编写一个简单的脚本,从网页中获取文本并处理该字符串。但是,那个网站需要我登录。我成功登录了那个网站。这是我登录的方式:

var payload = {"name1":"val1","name2":val2"};

var opt ={"payload":payload,"method":"post"};

var respose = UrlFetchApp.fetch("http://website.com/login",opt);

登录后,网站将我置于http://website.com/home. 我检查了一下response.getContentText(),我可以确认我已经成功登录,因为它包含来自http://website.com/home. 现在我需要获取http://website.com/page并处理它的内容。我首先假设脚本可以自己处理 cookie 并继续

var pagedata = UrlFetchApp.fetch("http://website.com/page);//Did not work

这显然没有用,并pagedata.getContentText()说我先登录,这表明 cookie 没有成功通过..

然后,我尝试提取服务器在登录期间响应的 cookie,并将其与此请求一起发送。

var cookie = response.getAllHeaders()['Set-Cookie'];     

// variable cookie now contains  a legitimate cookie.

// It contains 'JSESSIONID=blabla;Path=/' and 
// it is the ONLY cookie that server responds.

我试图在我的页面请求中发送那个 cookie。

var header = {'Cookie':cookie};

var opt2 = {"header":header};

var pagedata = UrlFetchApp.fetch("http://website.com/page",opt2);

我认为即使是现在 cookie 也没有正确发送,因为内容再次要求我登录。

我是否正确传递了 cookie?我需要有关在请求中发送 cookie 的正确方法的帮助。

4

2 回答 2

10

在这里您可以找到 cookie 规范: http ://www.w3.org/Protocols/rfc2109/rfc2109

您的代码中存在潜在问题:如果从服务器发回多个 'set-cookie' 属性,则 response.getAllHeaders()['Set-Cookie'] 可以返回字符串或字符串表。

埃里克是对的,你不能在不消化它的情况下退回 cookie。

代码中的第二个错误:

var opt2 = {"header":header};

应该

var opt2 = {"headers":header};

另请注意,GAS 使用 Google IP。可能会发生两次连续提取使用不同 IP 的情况。您要连接的服务器可能依赖于会话 IP。

你确定服务器在认证后只给你发回一个cookie吗?

于 2012-06-05T08:37:06.597 回答
3

看起来您在 UrlFetchApp.fetch() 中正确设置了标题。

我相信 Set-Cookie 标头中的数据与 Cookie 标头中预期的数据格式不同。例如,Set-Cookie 包含过期等信息。

于 2012-06-04T16:50:33.063 回答