Javascript 谷歌应用程序脚本-如何登录和获取数据?

Javascript 谷歌应用程序脚本-如何登录和获取数据?,javascript,post,login,google-apps-script,urlfetch,Javascript,Post,Login,Google Apps Script,Urlfetch,简介: 我非常缺乏经验,但最近我一直在尝试使用谷歌应用程序脚本访问网站上的一些数据。但是,要访问数据,我必须登录该网站。事实上,以前有很多关于类似问题的帖子,但在我来到这里之前,没有一篇是非常有用的:。接受的答案给出了保存cookies并在第二个请求中再次发送它们的方法。我基本上把代码复制粘贴到我自己的GAS文件中。因为那篇文章的问题是登录Wordpress,所以我先尝试了一下,结果成功了。我必须删除检查响应代码的if语句,因为即使我输入了正确的组合,也会返回200。我不知道这是否仅仅是邮政编码

简介:
我非常缺乏经验,但最近我一直在尝试使用谷歌应用程序脚本访问网站上的一些数据。但是,要访问数据,我必须登录该网站。事实上,以前有很多关于类似问题的帖子,但在我来到这里之前,没有一篇是非常有用的:。接受的答案给出了保存cookies并在第二个请求中再次发送它们的方法。我基本上把代码复制粘贴到我自己的GAS文件中。因为那篇文章的问题是登录Wordpress,所以我先尝试了一下,结果成功了。我必须删除检查响应代码的if语句,因为即使我输入了正确的组合,也会返回200。我不知道这是否仅仅是邮政编码中的一个错误或是什么。在任何情况下,我都验证了我发出的第二个请求是否返回了信息,就好像我已登录一样

有关特定站点的详细信息:
我试图登录的实际网站有一种奇怪的哈希方法,我在任何其他登录页面上都没有见过这种方法。单击“提交”时,密码会在转到另一个页面之前很长一段时间更改。开始表单标记如下所示:

<form action="/guardian/home.html" method="post" name="LoginForm" target="_top" id="LoginForm" onsubmit="doPCASLogin(this);">
javascript:
document.forms['LoginForm']['account'].value="username";
document.forms['LoginForm']['pw'].value="value in field that browser sent once";
document.forms['LoginForm']['ldappassword'].value="password";
document.forms['LoginForm'['dbpw'].value="value in field that browser sent once";
document.forms['LoginForm'['contextData'].value="value in field that browser sent once";
document.forms['LoginForm'].submit();
没用。因此,我在一个名为“md5.js”的javascript文件中找到了函数“doPCASLogin()。我相信md5是某种散列算法,但这并不重要。“doPCASLogin()”的重要部分是:

还有一些其他的东西,但我发现这与我的登录无关。很明显,这只是使用“pskey”(存储在隐藏输入中,每次重新加载时不同)作为键,通过另一个函数运行密码几次,并将这些输入放在原始形式上(“dbpw”和“ldappassword”是隐藏输入,“pw”是可见的密码输入)。完成此操作后,它将提交。我找到了另一个“hex_hmac_md5()”函数,它实际上连接到一大堆其他函数来散列密码。无论如何,这并不重要,因为我可以从地址栏中键入的javascript调用“hex_hmac_md5()”。这是我提出的工作代码,我只是为了可读性而打乱了思路:

javascript:
document.forms['LoginForm']['account'].value="username";
document.forms['LoginForm']['pw'].value="hex_hmac_md5(pskey, b64_md5('password');)";
document.forms['LoginForm']['ldappassword'].value="password";
document.forms['LoginForm']['dbpw'].value="hex_hmac_md5(pskey, 'password')";
document.forms['LoginForm'].submit();
无论你在哪里看到“用户名”或“密码”,这只意味着我在这些位置输入了用户名和密码,但显然我已经删除了它们。当我发现这是可行的,我写了一个小的Chrome扩展,当我去网站时,它会自动让我登录(登录过程很奇怪,Chrome不记得我的用户名和密码)。这很好,但这不是我的最终目标

困境:
在发现了关于散列的所有这些之后,我尝试将所有这些值放入GAS文件中的HTTP有效负载中,尽管我怀疑它是否会起作用。事实并非如此,我怀疑这是因为这些值只是作为字符串读取,而javascript并没有实际运行。这是有道理的,因为运行实际的javascript可能是一个安全问题。然而,为什么它会在地址栏中工作呢?作为一个补充说明,我得到了一个200响应代码,而且看起来一个cookie也被发送回来了,尽管它可能是无效的。当我读到实际的响应时,它又只是一个登录页面

在看到以下内容后,我还考虑尝试在自己的代码中复制整个函数:,但由于每次重新加载时“pskey”都不同,因此我认为散列必须在第二次UrlFetch时使用新键完成。因此,即使我将所有函数复制到GAS文件中,我也不认为我能够成功登录,因为在实际发送请求之前,我需要知道为特定请求生成的“pskey”,这是不可能的。唯一可行的方法是,我可以在发送数据之前,以某种方式维护一个页面并阅读它,但我不知道如何使用GAS

编辑:我发现了另一个名为“contextData”的输入,它与加载页面时的“pskey”相同。但是,如果我登录一次并查看使用Chrome Developers工具发出的POST请求,我可以复制所有输入值,包括“contextData”,并且可以再次发送另一个请求。在地址栏中使用javascript,如下所示:

<form action="/guardian/home.html" method="post" name="LoginForm" target="_top" id="LoginForm" onsubmit="doPCASLogin(this);">
javascript:
document.forms['LoginForm']['account'].value="username";
document.forms['LoginForm']['pw'].value="value in field that browser sent once";
document.forms['LoginForm']['ldappassword'].value="password";
document.forms['LoginForm'['dbpw'].value="value in field that browser sent once";
document.forms['LoginForm'['contextData'].value="value in field that browser sent once";
document.forms['LoginForm'].submit();
我可以以这种方式登录网站任意次数,无论“pskey”是什么,因为我直接提交所有内容,没有进行哈希运算。然而,这对我来说仍然不起作用,所以我有点被卡住了。我应该注意,我已经检查了其他隐藏的输入字段,即使在清除表单中的每个输入之后,我仍然可以使用上面的javascript成功登录

问题:
-我是否正确地假设我发送的代码被解释为字符串?
-为什么我最近编写的下面的新代码不起作用?
-作为将来的参考,我将如何使用GAS登录到像谷歌这样的网站,在那里,随机生成的字符串以登录形式发送,并且必须返回

function getData() {
  var loginURL = 'login page';
  var dataURL = 'page with data';
  var loginPayload = {
     'account':'same as in previous code block',
     'pw':"same as in previous code block",
     'ldappassword':'same as in previous code block',
     'dbpw':"same as in previous code block",
     "contextData":"same as in previous code block",
  };
  var loginOptions = {'method':'post','payload':loginPayload,'followredirects':false};
  var loginResponse = UrlFetchApp.fetch(loginURL,loginOptions);

  var loginHeaders = loginResponse.getAllHeaders();
  var cookie = [loginResponse.getAllHeaders()["Set-Cookie"]];
  cookie[0] = cookie[0].split(";")[0];
  cookie = cookie.join(";");

  var dataHeaders = {'Cookie':cookie};
  var dataOptions = {'method':'get','headers':dataHeaders};
  var dataResponse = UrlFetchApp.fetch(dataURL,dataOptions);

  Logger.log(dataResponse);
}
某种奇怪的哈希方法,我在任何其他登录页面上都没有见过

此登录使用众所周知的from密码(值得注意的是,它使用相同的密码,但小写,用于数据库访问
dbpw
,并且可以选择发送用于登录的密码的纯文本(!)版本)

在实际发送请求之前,知道将为特定请求生成的“pskey”,这是不可能的

pskey
只存储用于计算HMAC签名的密钥。无论何时何地(显然,在计算之前),都不会阻止您硬编码、从磁盘读取、生成或从远程获取数据

运行实际的javascript可能是一个安全问题

阿尔斯