|
本帖最后由 阿诺大大 于 2017-9-3 03:50 编辑
在一般情况下,如果直接使用易语言的 网页访问(),它是不会执行返回结果里面的JS代码的。 在开发美拍软件的过程中,发现直接 访问美拍的视频地址,是不会增加播放量的。 除非使用浏览器访问,因为浏览器会执行JS代码。
本次记录一下此加密算法的查找与调试和封装过程吧。
具体哪条URL访问后可以增加播放量就不在发抓的过程了,直接筛选一下就知道了。
URL:http://statistics.meipai.com/statistics/play_video.json?client_id=1089857306
POST_DATA :data=%7B%22id%22%3A%22786687553%22%2C%22source%22%3A%22web%22%2C%22sig%22%3A%22TVBEU0RFRkRTRkpFMk56ZzJOamczTlRVemQyVmlNVFV3TkRNMk1qSXpNQT09%22%2C%22time%22%3A%221504364812%22%7D
链接和POST的数据都抓到了,一共需要5个参数
client_id = 当前美拍用户的ID号
data = 视频的ID号
source = web 这个是固定的,可能是判断是否是网页还是APP形式
sig = 本节需要解剖
time = 本节需要解剖,看起来是时间戳,实际是经过处理的
5个参数全部就绪,已知明文参数3条,2条是经过加密。那么,就正式开始抓取了!
-------------------------------------------------------教程分割线---------------------------------------------------------------
因前面讲到,直接用易语言代码访问网页无法增加访问量,说明它引用了JS,那么就先查找到当前视频页面加载的所有JS文件(直接过滤JQ这类公共库)。
如上图所示,仅有2个JS文件加载,去掉前面2个公用库,就是只剩下最后一个:
<script src="//img.app.meitudata.com/meitumv/auto_compress/9cf62aae1ce2d4a292cf5534d8e4e1a7.meipai.pc.v1.min.js"></script>
我们先打开万能的F12(开发者工具),切换到Sources , 如下雨所示,找到这个JS文件。
按照国际惯例,Ctrl+F 进行搜索,搜索什么呢? 直接搜索POST时提交的参数试试。 比如 sig
搜索出来的结果很另外意外,只有1条,并且正是我们要找到的。
并且我们可以清晰的看到,4个参数全在上面了,id,source,sig,time
但是我们需要的是后面2个的来源,前面2个已经知道了,直接进行反查, sig是通过执行 d() 获取的。
这里我进行下断点跟踪,发现这个函数就在这代码的上面。。
但是,我们发现,最重要的是它的 return 里面又执行了一个 D 函数, 这个d是带参数的,不是现在这个d,别搞混了哦,继续在return处下断点看看跳到哪里·
跳到这里了,我们发现这只是一个字符的简单位移操作算法,用的都是JS原生代码,发现 e 的变量没有定义,查找了一下e的变量:
e = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
这些代码,可以直接自己新建个Html文档,复制进去就行了,我们只需要知道传的是什么内容,那么就要破案了。
我们返回到执行这个d函数的代码,在那里下断,通过下断的时候查看这个变量的内容是什么
通过下断后,我们知道 a,b,c 是由外部传进来的
c = "MPDSDEFDSFJE2" // 上面写有了
a = 当前视频的ID号
b = "web"
h = "" //空的
e = parseInt((new Date).getTime() / 1e3) //下面写有了,时间戳 / 1e3 1e3是个数值哦
到这里,我们可以总结归类了。
其实就是传递 当前视频的ID号,还有时间戳/1E3即可,这是经过改良后的代码,可以直接复制使用
最终程序代码(回复可见):
- [hide]
- <script>
- function calc(video_id,time) {
- var pass = "MPDSDEFDSFJE2";
- return jiami(pass + jiami(video_id+"web"+time))
- }
- function jiami(a){
- var d = "undefined" != typeof b ? b : window;
- var e = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
- for (var b, c, d = 0, g = e, h = ""; a.charAt(0 | d) || (g = "=", d % 1); h += g.charAt(63 & b >> 8 - d % 1 * 8)) {
- if (c = a.charCodeAt(d += .75),
- c > 255)
- throw f;
- b = b << 8 | c
- }
- return h
- }
- video_id = "786687553";
- time = parseInt((new Date).getTime() / 1e3);
- alert("计算结果:\n\n sign="+calc(video_id,time)+"\n\n time="+time);
- </script>
- [/hide]
复制代码
累死了:
|
-
-
评分
-
参与人数 3 | 好评 +3 |
精币 +9 |
收起
理由
|
Scorpion
| + 1 |
+ 3 |
希望多出这样技术贴 |
大飛
| + 1 |
+ 4 |
奉上小小红包希望笑纳 |
鐵憨憨
| + 1 |
+ 2 |
感谢解答!!!昨天看这个JS看的一头雾水,等级有限制没办法给太多 |
查看全部评分
|