只收藏不点赞的都是耍流氓

注意:目前pdd已经需要登陆,这篇文章是在未更改之前写的,如果需要实践需要先登陆pdd再进行操作即可

上周的pdd很多人说看了还不会找,都找我要写一篇来教教如何扣代码的,那就应大家要求,今天来写一篇详细的扣代码过程,完全从零到一,如果对你有帮助,还望大力分享,这样我会越写越多。

代码都放在我的Github上,还没有star的感觉star了,哈哈,可能今周会更新别的网站,由于网站太强给推迟了,还得需要时间,为了爬虫可谓掉光了头发。

Github:https://github.com/SergioJune/Spider-Crack-JS

其他不多说了,直接开始今天的主题,扣代码。

上篇文章我已经找到了加密位置了,就是下图这个位置

image

如果还不知道怎样找的话,可以看看https://sergiojune.com/2019/03/26/pinduoduo_anti_content/,微信的被举报删除了,暂时只能在我blog上看了,这里就不多说了。

1. 创建 HTML 文件

我们在扣代码之前,为了方便调试,可以先创建一个 html 文件,这样可以方便我们直接在 chrome 上直接进行调试,或者创建一个 js 文件也可以,不过进行调试时需要在 webstorm 上调试才可以。这里我就创建了一个 html 文件。

image

然后把我们扣下来的代码放到 script 标签里面即可,然后使用浏览器进行打开即可调试。

2. 开始正式扣代码

这里我们知道了 ep(“0xd2”, “jLF%”) 这个语句是生成 anti_content 的,所以可以直接打断点到这个语句进行查看它所需要的语句。

image

image

点击下一步,进入了这个函数内

image

如果你调试过多次之后,发现这个是将一些加密后的字符串解密为正常的函数名字。如果你第一次扣的话,估计是把这个函数直接给扣出来,但是后面会有很多麻烦,比如变量之间的关系,所以我们应该是把整个大函数给扣出来,即是包括这个函数的函数,看下图

image

但是当你扣的时候,发现刚才我们加密的那个方法也在这个函数里面,这时就得改改了,不扣大函数,因为扣了之后调用开始就难免会出错,还是直接把这个小函数扣出来先,如下图:

image

这时就可以用浏览器打开这个文件了,可以看到报错

image

这时不要慌,报错是正常的,因为我们只扣了一下部分,所以还需要继续找,接下来就是查看报错的地方并断点。

image

可以用这个和原网址上的运行作比较,发现这个变量是个数组,所以也直接扣下来。

image

image

你细心的话会发现,下面还有个打乱这个数组的函数,正确来说应该是还原数组,需要两个一起扣下来。

这时再次刷新文件即可正常得到结果了

image

我们再看下一个问题。

image

再次点击到达错误位置,再根据原网站对比

image

可以发现这是个函数,可以点击箭头所指函数直达函数位置,发现还是和加密的语句在同一个大函数内,所以我们还是直接扣出 Z 函数即可

image

再次刷新运行,出错的位置也变了

image

我们继续进入错误位置和原网址的对比

image

发现这个变量是个方法名,可以往上找找定义位置

image

估计这里面的变量都是有用的,所以直接全部扣了

image

再次刷新即可看到错误地方不一样了,继续找即可。

image

在出错地方断点的同时也需要在原文件中断点,然后将原文件的运行到该断点处就可以了。

image

接着就是查找这个对象的定义的地方了,然后把代码扣下来即可。

这里不止 F 对象, 还有 B,U,z等对象,定义位置都是在附近的,也都一起扣下来即可。

再次刷新看到少了个 data 属性,这里自己手动加上即可

image

接着运行就变成了这个错误

image

还是同样与原文件做对比即可。找到原文件的定义地方,然后全部扣出来他们的定义。

我这里是将整个大函数都扣出来,然后自调用来返回上面所需要的对象,这样封装可以避免很多变量的冲突。

image

再次刷新,错误就到了另外一个地方了。

image

也是一个函数,对比原文,很容易找到函数,直接扣出

image

继续保存文件刷新,错误也变了

image

对比原文件,知道这个是搜索的 url,这里我们直接赋值即可,可以在我们调用函数的时候传这个参数。

image

image

再次刷新,还是这些对象的data属性的问题

image

也是和上面的一样,看原文是什么值,直接赋值即可。

然后到了这个错误

image

还是比较原文,找出函数定义,并扣出来,就不多说了。

接着就是到这里的错误了。

image

这个错误比较麻烦,不过耐心点来还是可以的,还是来比较原文件中的JS看看那里不一样。

image

image

比较这个 Y 对象,发现我们的少了一个data,接着就是找 Y 这个 data 的生成位置了。根据上面的内容,很容易就可以知道定义的位置。

image

可以知道这个 l() 就是生成 data,可以打断点原文件并刷新就可以看到生成步骤了。

这里需要直接把 l 所在的位置的外部大函数都扣出来,并且自调用返回这个 l 函数即可。

接下来的还是重复之前的步骤,说多了也是废话,相信大家应该能举一反三,如果实在不会的话就多看几遍文章吧,自己动动手,总会有收获的。

image