浏览器客户端智能自动化:如何取得页面中JavaScript运行时动态生成的URL?

浏览器客户端智能自动化:如何取得页面中JavaScript运行时动态生成的URL?

需求

“页面智能拼接”指的是通过启发式查询DOM树,判断出“下一页”链接,取出其href属性。Chromium的官方插件DOM Distiller完成类似的工作,主要目的就是为了将多页点击流程变成单页的Ajax连续阅读体验。

问题是,现在有些网站为了阻止浏览器客户端这么做,将href属性设置为"#"(或javascript:void()),然后在其onclick事件里绑定一个JS handler,动态生成下一页的URL。

这种情况下,如何还能完成客户端自动化地取得下一页的URL呢?

方法1:用JS实现一个JavaScript源代码解释器

如果能够获得onclick handler的JS源代码,则可以实现一个JavaScript源代码解释器,JS解释器实际上早就有人实现过了(需要虚拟一个假的全局window对象、执行上下文、代理DOM树的访问,以及最后截获window.open请求或location赋值语句)。

关键问题是,无法获得onclick handler的JS源代码!你只能得到一个JS Function对象。不过Function对象的prototype.ToString好像是可以得到源代码的?(待测试验证)

方法2:设置特定的“期望”数据结构,但网络模块底层拦截这个请求

这个方法则需要在内核里做修改。实现难度可能简单一点:

  1. 当分析到链接元素的href=‘#‘时,向元素发送一个虚拟的click事件(非真实用户发出的UI交互操作),
  2. 同时向网络层net模块IPC发送一个expect数据结构:“请捕获接下来的一个main document网络请求,其referer是当前URL,把这个请求URL发给我”
    这里似乎可能发生错误的匹配,请参考信息论/编码论相关理论。
  3. 链接元素的click handler将正常执行,同时触发新URL请求,由于之前设置了期望匹配,此URL请求将被捕获
  4. Browser UI主线程收到这个新URL,执行接下来的处理

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-11-25 00:37:39

浏览器客户端智能自动化:如何取得页面中JavaScript运行时动态生成的URL?的相关文章

Html5 页面中 JavaScript 启动调用的三种方法比较

太阳火神的美丽人生 (http://blog.csdn.net/opengl_es) 本文遵循"署名-非商业用途-保持一致"创作公用协议 转载请保留此句:太阳火神的美丽人生 -  本博客专注于 敏捷开发及移动和物联设备研究:iOS.Android.Html5.Arduino.pcDuino,否则,出自本博客的文章拒绝转载或再转载,谢谢合作. 首先,来看一下 Html5 页面引用 JavaScript 代码的几种方式: 1.Html5 页面中使用 <script>  标签容纳

在vue中利用vue-qr插件动态生成二维码并嵌入LOGO

收到需求要生成二维码的时候刚进项目组不久,接触vue也才一两个星期,还处于懵逼状态. 本小白的第一反应就是百度二维码的生成方法,网上有很多大神给出解决方案,最开始本小白以为是在后台生成图片然后传到前台页面,后来发现可以直接在前端用js生成,网上查到的大部分都是用jquery.qrcode.js配合utf.js(为了支持中文)和jquery-1.8.0.js来实现,亲测可行(但本白只在原生HTML中实现,vue中死活报错:"找不到qrcode方法",是不是本小白没找准姿势,哪位大神求告知

在Amazon FreeRTOS V10中使用运行时统计信息

在MCU on Eclipse网站上看到Erich Styger在8月2日发的博文,一篇关于在Amazon FreeRTOS V10中使用运行时统计信息的文章,本人觉得很有启发,特将其翻译过来以备参考.原文网址:https://mcuoneclipse.com/2018/08/02/tutorial-using-runtime-statistics-with-amazon-freertos-v10/ FreeRTOS包含一个很好的功能,可以向我提供有关每个任务在系统上运行的时间的信息: Free

WebView点击加载的页面中的按钮时不弹出新窗口以及在加载后执行javascript

mWebView.setWebViewClient(new WebViewClient() { //点击网页中按钮时,在原页面打开 public boolean shouldOverrideUrlLoading(WebView view, String url) { view.loadUrl(url); return true; } //页面加载完成后执行 @Override public void onPageFinished(WebView view, String url) { super

Android中Activity运行时屏幕方向与显示方式详解

现在我们的手机一般都内置有方向感应器,手机屏幕会根据所处位置自动进行横竖屏切换(前提是未锁定屏幕方向).但有时我们的应用程序仅限在横屏或者竖屏状态下才可以运行,此时我们需要锁定该程序Activity运行时的屏幕方向.还有就是在我们用手机观看视频时,随意的进行横竖屏切换,但播放进度不会随着屏幕的转换而从头开始播放,为了实现这个功能,我们就需要在Activity转换时对当前数据进行保存. 现在根据以上两种需求,个人提出以下解决方案: 一.锁定Activity运行时屏幕方向,如下图(演示锁定横屏):

虚拟机中的运行时栈帧

每个人都知道,各种各样的动画视频,都是由一帧一帧图片连续切换结果的结果而产生的,其实虚拟机的运行和动画也类似,每个在虚拟机中运行的程序也是由许多的帧的切换产生的结果,只是这些帧里面存放的是方法的局部变量,操作数栈,动态链接,方法返回地址和一些额外的附加信息组成,在虚拟机中包含这些信息的帧称为"栈帧",每个方法的执行,在虚拟机中都是对应的栈帧在虚拟机栈中的入栈到出栈的过程.其中比较重要的一点时,如果虚拟机中同时有多个线程在执行,那么各个线程的栈帧都是相互独立,互不侵犯的,所以这也实现了局

MFC中的运行时类型识别(RTTI)

RTTI是Runtime Type Identification的缩写,中文名为"运行时类型识别". MFC早在编译器支持RTTI之前,就有了这种能力.我们现在要以相同的手法,在Console程序中仿真出来.我希望我的类库具备IsKindOf 的能力,能在执行期侦测到某个对象是否属于某个类,并传回TRUE 或 FALSE.以形状 Shape为例 ,我希望: 即 长方形属于"长方形类",正方形属于"长方形类",圆不属于"长方形类"

ASP.NET Core3.0 中的运行时编译

运行时编译 通过 Razor 文件的运行时编译补充生成时编译. 当 .cshtml 文件的内容发生更改时,ASP.NET Core MVC 将重新编译 Razor 文件 . 通过 Razor 文件的运行时编译补充生成时编译. RazorViewEngineOptions AllowRecompilingViewsOnFileChange 获取或设置一个值,该值确定当磁盘上的文件发生更改时是否重新编译和更新 Razor 文件(Razor 视图和 Razor Pages). 对于以下项,默认值为 t

静态页面中导航切换时的当前状态(四中方法)

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>导航当前状态</title> <script src="jquery-1.8.2.min.js"></script> </head> <body > <div ></div