如何使用Google Apps脚本登录外部网站?

6
我正在尝试登录一个网站,以便从其中获取数据并将其导入到Google文档电子表格中。我已经阅读了这里的各种帖子,但是我无法确定需要发送哪些数据。
该网站的登录页面有一个带有以下字段的表单。
<form action="https://fantasyfootball.telegraph.co.uk/premierleague/log-in/" method="post" id='reg-form'>
        <fieldset class='login'>

            <div class="required">
                <label for="email">Email:</label>
                <input type="text" name="email" id="email" class="input-text" size="10" maxlength="50" value="my.name@address.com" />
            </div>

            <div class="required">
                <label for="pass">Password:</label>
                <input type="password" name="pass" id="pass" class="input-password" size="10" maxlength="15" value="some-password" />
            </div>
        </fieldset>
        <div id="remember-me-container">
                <input type="checkbox" checked="checked" id="remember-me" name="remember-me" value="remember-me" />
                <label for="remember-me" id="remember-lbl">Remember me</label>

        </div>

        <input type="submit" id="submit-btn" value="Login" name='Submit' class='btn'/>
    </form>

我尝试了以下脚本,但sessionDetails总是返回"Undefined"。
// Returns the html of the page.
function sGetPage (sUrl) {

var url = "https://fantasyfootball.telegraph.co.uk/premierleague/log-in/";

// logging in, following https://dev59.com/u2Ei5IYBdhLWcg3wIJFH
var payload =
{
 "email" : "ian.shaw@iee.org",
 "pass" : "asdf123",
 "submit-btn": "Login",
 "remember-me" : "remember-me" 
};

var options =
{
 "method" : "post",
 "payload" : payload,
 "followRedirects" : false
};

var login = UrlFetchApp.fetch( url, options);
var sessionDetails = login.getAllHeaders()['Set-Cookie'];
Logger.log(sessionDetails); 

var response = UrlFetchApp.fetch ("https://fantasyfootball.telegraph.co.uk/premierleague/leagues/view/8000912/4015677/", {"headers" : {"Cookie" : sessionDetails} });
var sHtml = response.getContentText();
Logger.log(sHtml); 

}

有什么建议将不胜感激。


这里有一个使用应用脚本处理cookies的例子,可能是你正在寻找的 https://dev59.com/tGIk5IYBdhLWcg3wIq5U - AshClarke
谢谢,我没有找到那个链接。我意识到需要包括所有表单字段,所以我已经在选项列表中添加了“submit-btn”:“登录”,但仍然没有起作用。 - Ian Shaw
我是否正确地假设需要将输入的“id”和“value”放入选项中?我得到了一个200的响应代码,在getAllHeaders()中没有cookie数据。我已经手动验证了密码是正确的,所以我仍然感到困惑。 - Ian Shaw
@ IanShaw 你解决了这个问题吗? - shivavelingker
1个回答

2
我从未能够直接发送sessionDetails回网站。我一直在使用正则表达式提取sessionDetails的相关部分,并创建一个新的cookie字符串,然后将其发送回网站。要找出哪些cookie是相关的,请使用浏览器的网络日志(在开发人员工具中)检查浏览器为cookie发布的内容,并将该字符串与sessionDetails进行比较。我在这里发布了一个示例(链接)。请注意,保留HTML标记。
var login = UrlFetchApp.fetch(url, options);
var sessionDetails = login.getAllHeaders()['Set-Cookie'];
Logger.log(sessionDetails); 
var cookie = sessionDetails.match(/Asp\.NetSessionId=[A-Z0-9]+;/)[0];  //modify this RegEx as needed

var response = UrlFetchApp.fetch(
  "https://example.com",
  {"headers" : {"Cookie" : cookie} }
);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接