如何运行tampermonkey脚本,加载多个页面并等待其内容?



我想创建一个在一个页面上注册的篡改猴脚本(称为A)。从这个页面(这是一个概览页面),它提取了一系列的链接(比如[B, C, D])。

现在,我想做以下事情:

  1. 导航到位置B
  2. 等待DOM准备好,这样我就可以提取进一步的信息
  3. 解析页面中的一些信息,并将它们存储在某个对象/数组中。使用urlCD
  4. 重复步骤1到3返回地址A
  5. 复制out的内容到剪贴板

我可以通过window.openwindow.location完成的任务1。但是我现在在第二步和第三步都失败了。

这可能吗?我不确定等待另一个页面是否会终止并卸载当前脚本。

你能给我指出解决那个问题的正确方向吗?

如果你有更好的主意,我愿意听听。我使用带有tampermonkey的浏览器的原因是页面使用某种CSRF保护意味着不允许我使用例如curl来提取相关数据。

我看过这个答案。据我所知,这将在每次调用上启动一个新脚本,并且我必须手动使用URL参数传递所有信息。这可能是可行的(除非服务器弄乱了参数),但似乎需要一些努力。有没有更简单的解决办法?

要传递信息,有几个选项。

  • URL参数,如您所提到的-但这可能会变得混乱
  • 使用GM_setValue将值和标志保存在Tampermonkey的共享存储中
  • 如果您使用window.open打开窗口来抓取,您可以让子窗口调用.postMessage,而父窗口侦听消息(包括来自其他域的消息)。(BroadcastChannel是一个很灵活的选项,但在这里可能有点过头了)

听起来您的用户脚本需要能够在任意页面上运行,因此您可能需要// @match *://*/*,以及一种向脚本指示自动导航到的页面是要抓取的页面的方法。

当您想要开始抓取时,使用window.open打开目标页面。(iframe会更加用户友好,但由于目标站点的安全限制,这有时会失败。)当页面打开时,您的userscript可以让目标页面检查window.opener是否存在,或者是否有URL参数(如scrape=true),以表明这是一个要抓取的页面。抓取信息,然后使用.postMessage将其发送回父节点。然后,父节点可以对其他链接重复这个过程。(你甚至可以并行处理所有的链接,如果他们在不同的域名,它不会超载你的浏览器。)

等待DOM准备好应该是微不足道的。如果在HTML解析结束时页面被完全填充,那么您的脚本所需要的就是而不是具有@run-at document-start,并且它将在HTML加载后运行。如果在HTML解析结束时页面没有完全填充,并且需要等待其他内容,则只需设置一个超时循环,直到所需元素存在。

保护意味着不允许我使用例如curl来提取相关数据。

比起用户脚本,在您自己的服务器上运行它更可靠,更容易管理,如果可能的话。考虑检查一些更复杂的curl是否可以工作-例如,puppeteer,它可以模拟一个完整的浏览器。

最新更新