东莞市网站建设分站,想在网上做设计接单有没有网站,企业网站平台建设咨询合同,网站搭建网题目#xff1a;采集全部5页的彩票数据#xff0c;计算全部中奖的总金额#xff08;包含一、二、三等奖#xff09; 地址#xff1a;https://match.yuanrenxue.cn/match/6
本题比较简单#xff0c;只是容易踩坑。话不多说请看分析。 两个参数#xff0c;一个m一个f采集全部5页的彩票数据计算全部中奖的总金额包含一、二、三等奖 地址https://match.yuanrenxue.cn/match/6
本题比较简单只是容易踩坑。话不多说请看分析。 两个参数一个m一个f与cookie无关但是这里会遇到第一个坑在响应数据中。 可以发现只有三等奖的金额并没有一等奖和二等奖的金额。所以我们需要找到三者的关系。直接来到source中查看。 直接搜索value一共17个结果一个一个观察。在第12个时其相关的内容。 这里意思是总金额为三等奖的24倍具体是不是这样呢我们来验证一下。 还真是那么就是说总中奖金额就是总三等奖金额的24倍。第一个坑解决。接下来开始逆向参数刚刚已经知道了需要的参数就两个m和q传书的是parmas参数所以我们直接来跟栈。 跟到请求时的栈代码非常简单如下 找到之后直接打上断点先看m的值。 这里就是入口函数可以看到当window.o的值大于等于6的时候就会重新加载页面那估计这个window.o可能是会增加的并且有可能和页数有关。 现在它的值为1访问下一页看看。 果然变成2了那也就是说我们在本地运行的时候他不可能大于等于6因为我们最多就循环五次爬个五页根本不说手抖戳它这么多下。所以这里的代码我们就可以稍微简化一下不要r函数了直接一步到位到z函数。 z函数其实熟悉js的话一看就知道这就是webpack的调用的方式。翻到最上方 果然就是一个webpack那还不简单模块加载器如此的标准我都不好意思去删删改改了直接全部copy。接下来就调用z函数看看会出现什么样的问题了。 window没有定义那我们就给他定义一个window。在最开头加上一个var window global;然后再执行就会发现一样的错误这个时候大家就会发现了报的是window.o 1这个位置的window没有定义。那问题来了大家ctrlf搜索看看这代码里面有没有window.o呢答案是没有。
所以window.o在肯定是在代码中至于为什么搜不到那当然就是被混淆了所以我们就来看看混淆的代码就在最开头的位置一个很明显的AA混淆将它还原一下这种混淆由专门的工具还原手动还原的话就直接去掉最后的括号然后执行就可以了。 去掉最后的括号后可以看到这混淆的代码就是一个匿名函数这个函数的逻辑就是给window.o进行赋值值为1所以我们将这段混淆代码替换成window.o 1就可以了。 接下来就是下一个错误了关键词ASN1这个相当于也是考了一下对js的熟悉程度就看大家平时经验的积累了ASN1就是一个js的解码器它能够解码任何有效的base64的编码或者十六进制编码的DER或BER结构这个玩意儿在浏览器中一般都是存在的但问题是nodejs不存在啊。所以既然这个问题出现了那肯定就是代码中出现了nodejs无法解码的存在了那我们就来慢慢找一下这些代码都在什么地方。一直翻一直翻。 找到了1161行大家和我的误差应该就几行的误差自己找很废时间反正我眼睛看瞎了已经。这很明显又是一段混淆代码jsfuck的混淆老规矩还原一下。直接全部复制到console中执行一下看看结果是什么。 就是一个false…那就直接替换了吧。再执行代码会发现还是这个错误。 那证明这里面可能还有已经找到过一次有经验了知道了是jsfuck混淆那我们就搜一下特殊符号![ 果然又来了。直接还原替换 啥也不是那就直接删掉。然后再执行还是会报了这个错误但是这个时候代码中已经没有混淆代码了那问题来了什么原因导致的呢定位到报错的2559行看下能不能删除这个逻辑 好吧根本删不掉关联度太高。那问题来了从这里来看的话ASN1是在本地赋值进去的那么就是说就算本地nodejs本身没有的话这里应该也赋值进去了为啥还会报这样的错呢那就是说window.ASN1压根没有去赋值要么就是直接没有window了。那就有点意思了我们来搜索一下window。 一共是14个但是…webpack里面那个window是来捣乱的吧。前面先用了window.o要我们先赋值了你自执行里面又要置空这不闹呢嘛直接删掉。 完事直接出结果。这里其实就涉及的是浏览器的环境和nodejs环境的不同在浏览器中window是不能被重新赋值的所以webpack中的这个置空并没有任何意义但是在nodejs中就不一样了window可以被重新赋值因此就直接导致了上方我们看到的错误信息了。
搞定之后我们来对比一下浏览器中的值和本地执行的结果是否能够匹配上了。将浏览器中传入的参数复制下来运行一下(刷新了下页面重新获取的两个参数值)。 两个结果完全一致那么到这里参数m就完成了。
接下来就是q参数q参数从逻辑来看 就是其拼接出来的格式就是1-1692867522000|这样的但是这里需要注意由于我们会话并没有保持相当于每一次都是一个新的请求同时浏览器中window.o能够每次执行js代码的时候自增但本地可不会所以我们就按照每次都是全新的请求来实现参数q如果是浏览器中那样的格式的话最终会将前面的值拼接起来如下 但我们本地的话就不能再拼接了否则是会触发这个页面的风控的接下来就给大家看一下这两种情况在本地的时候的结果一个能够成功获取值一个则触发风控。先来写一个js代码的入口函数。
function run(o) {t Date.parse(new Date())res z(t, o);return {m: res,t: t,}
}第一种情况触发风控。 这就是按照浏览器模式来实现q值时的结果所以直接全新请求即可不用拼接前面的值。 最后将所有的value加起来再乘以24就获取到正确答案了答案为6883344
完整代码请转https://gitee.com/shuailiuquan/spider-code/tree/master