一个简单的登录脚本有时可以工作,有时也不会

时间:2017-07-22 03:32:16

标签: userscripts

我在Chrome中使用Tampermonkey执行以下代码,我用它来登录digitalocean.com

setTimeout (function() {
document.querySelector("input[type=submit]").click();
}, 3000);

出于某种原因,这段代码有时会起作用,有时它并不起作用:也就是说,有时我会登录,有时(大多数情况下)我得到DigitalOcean的 404 网页。

我的登录详细信息已保存在本地存储空间中,并显示在表单上。

原则上,可以通过注册到DigitalOcean,安装Tampermonkey并使用匹配执行代码来重现此问题:

https://cloud.digitalocean.com/login*

可能缺少某些东西以确保机器眼中的人类行为?

2 个答案:

答案 0 :(得分:0)

好的,需要一些挖掘,但我知道发生了什么。

  • 表单中有一个身份验证令牌。
  • 如果令牌不是服务器所期望的,则会导致您404处出现https://cloud.digitalocean.com/sessions错误。
  • 如果您的浏览器从缓存中加载登录页面(通常是因为您通过单击浏览器中的“后退”按钮来完成此操作),您将提交一个无效的令牌(当您放入页面时收到的令牌)缓存)。
  • 有时出于其他原因,我还没弄明白,这是错误的。

处理缓存加载的页面问题

我编辑脚本检查页面是否从缓存加载,并刷新页面而不是触发click事件:

if (window.performance.navigation.type === 2)
{
    location.reload();
} else {
    document.querySelector("input[type=submit]").click();
}

另一个问题可能是DigitalOcean后端的问题

我建议您报告他们的登录页面似乎偶尔会收到错误的身份验证令牌的事实,因为可以通过在新登录的“登录”按钮上单击(使用鼠标)来间歇性地再现该问题页面副本。
(我不会提到剧本,否则他们会责备它,然后你就会失去运气。)

平均时间

作为一个止损,直到他们解决问题,您可以制作一个匹配https://cloud.digitalocean.com/sessions的新脚本(它会将我发送到该页面,但如果需要,则添加*)如果您来自登录页面,则会收到404错误:

if (document.referrer.startsWith("https://cloud.digitalocean.com/login") && document.title.endsWith(" (404)"))
{
    history.back();
}

请注意document.title.endsWith(" (404)")仅适用,因为404页面<title>标记的内容以(404)结尾。

答案 1 :(得分:0)

这似乎是Tampermonkey中的一个错误,因为在Greasemonkey中没有发生报告的行为。

无论如何,3D1T0R的回答提供了一个有趣的解决方法,当前的情况(如果可能的话会大拇指)。