追不上的不追、不属于自己的不要、挽留不住的不留、生活哪有那么复杂。
1、前言
一、目标网站
aHR0cDovLzYwLjE3My4yNTQuMTI2Lw==
二、明确分析目标
打开网页,随意点击一个小区。
网页重开一个详情页面,如下图所示。
反复点击同一个小区,会发现详情页url每次都是变化的,变化的位置已用红框标记。
所以,文章分析的重点就是这一串数字的生成逻辑。
2、生成逻辑分析
一、查找点击事件
打开开发者模式,刷新页面,找到页面请求的接口,在响应中搜索小区名称,定位到如下图位置。
每个a标签下都有onclick,id属性,点击触发的事件名称为reurl,并且传入了this,但这里暂时还看不出this表示什么。
全局搜索reurl,如下图,40行打上断点。
点击小区名称,js正常断下。选中recode(),可以看到生成的结果就是需要的那一串数字。
继续选中参数,可以看到传入的参数即为a标签下id属性值。
二、分析recode()
点击进入recode函数,如下图。
整个逻辑很简单,就是调用了nscaler()和SetObjNum()两个函数,分别生成对应的值。
我们要做的,无非就是抠出对应的js代码,然后执行。
这里需要留意b的值,初次生成是提取了页面id=“iptstamp”标签中value的属性值,我的理解就是获取页面的加载时间。
从接口响应中直接搜索iptstamp可以查到。
放在代码中,可以从页面copy出来作为固定值,也可以从页面动态获取,但是不能自己凭空构造一个13位的时间戳。
三、抠出js代码
之前的文章中js比较简单都是转化成python实现,这里直接抠出对应的函数。
nscaler()部分,注意去除$.。
function nscaler(a) { var b = ""; each(a, function (i, e) { switch (e) { case "0": b += "0"; break; case "1": b += "2"; break; case "2": b += "5"; break; case "3": b += "8"; break; case "4": b += "6"; break; case "5": b += "1"; break; case "6": b += "3"; break; case "7": b += "4"; break; case "8": b += "9"; break; case "9": b += "7"; break } }); return b }
而nscaler()内部又调用了each()
接着抠出each(),里面有很多判断可以忽略,我这里直接全部copy下来了,懒得去调试分析。
function each ( obj, callback, args ) { var name, i = 0, length = obj.length, isObj = false; if ( args ) { if ( isObj ) { for ( name in obj ) { if ( callback.apply( obj[ name ], args ) === false ) { break; } } } else { for ( ; i < length; ) { if ( callback.apply( obj[ i++ ], args ) === false ) { break; } } } // A special, fast, case for the most common use of each } else { if ( isObj ) { for ( name in obj ) { if ( callback.call( obj[ name ], name, obj[ name ] ) === false ) { break; } } } else { for ( ; i < length; ) { if ( callback.call( obj[ i ], i, obj[ i++ ] ) === false ) { break; } } } } return obj;}
接着就是SetObjNum()
function SetObjNum(n) { var a = ""; for (var i = 0; i < n; i++) a += Math.floor(Math.random() * 10); return a }
接着就是入口函数了,首次生成b的值,作为参数value传递进来。
function recode(a,value) { var n = nscaler(a); var c = SetObjNum(a.length); var d = SetObjNum(a.length); n = parseInt(n) + parseInt(d); var b = value; var b = nscaler(b.toString()); return c + "-" + n + "-" + d + "-" + b }
3、代码展示
测试代码如下!
代码中没有动态获取页面的加载时间,直接从页面上复制了一个。
小区id也是随机取了一个,作为测试。
返回结果如下
ok,生成的数字串可以正常获取详情页面信息。 简单的一个网站,主要是抠出对应的js代码,注意缺啥补啥就行。