前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Python 爬虫进阶必备 | 某视频数据分析平台加密参数分析(终于我还是手把手扣了代码)

Python 爬虫进阶必备 | 某视频数据分析平台加密参数分析(终于我还是手把手扣了代码)

作者头像
咸鱼学Python
发布2020-08-28 15:38:02
6600
发布2020-08-28 15:38:02
举报
文章被收录于专栏:咸鱼学Python咸鱼学Python

今日目标网站

aHR0cHMlM0EvL3hkLm5ld3JhbmsuY24vZGF0YS90aWt0b2svcmFuay9vdmVyYWxs

这个网站是昨天在系列课的交流群里看到的,正好缺少案例就拿来练手了。

抓包分析与加密定位

这里要分析的是指数排行榜这一栏的数据

首先看下请求是怎么样的

看到这里分析的是xyznonce两个加密参数

如何定位加密参数的位置?

1、直接检索是可以找到的,xyz这个参数名称很有标志性

2、 通过xhr断点分析,不过这个网站的xhr分析的话,追堆栈很容易就追丢了。

接下来我们简单分析一下

先下一个断点,可以直接断在请求发出的位置

在这个位置,需要分析的参数已经全部生成好了,所以需要向上分析堆栈

因为有异步请求,所以先在下图这个位置打上断点,继续分析堆栈

继续不停的分析,断点重放请求,直到找到下面这个位置

在之前的文章有介绍过这个拦截器的用法,所以这里就不再废话一遍了。

在这个位置继续追两步就到了加密位置了。

这里的i.a就是我们具体的加密算法的位置了。

加密分析

从上面一路追下来到了这个位置,可以看到传入的参数就是我们请求的url

而且加密的逻辑看似也非常简单,我们继续分析

先来看看nonce的加密,打上断点追进去发现这个c方法是一环套一环,让人有点难受,所以咸鱼偷懒了

经过多次刷新分析这个nonce是由上面传入的i数组随机生成的字符串,生成的长度就是9,明白这个算法的实现之后,咸鱼直接百度了一个

代码语言:javascript
复制
function getRandomArrayElements(arr, count) {
    var shuffled = arr.slice(0), i = arr.length, min = i - count, temp, index;
    while (i-- > min) {
        index = Math.floor((i + 1) * Math.random());
        temp = shuffled[index];
        shuffled[index] = shuffled[i];
        shuffled[i] = temp;
    }
    return shuffled.slice(min);
}
var items = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "a", "b", "c", "d", "e", "f"];

解决了nonce之后,可以看到xyz是由nonce和上面的url拼接生成并经有a方法加密生成的,所以直接下上断点口一波代码

那么问题来了,这个代码要怎么扣?

先一步步跟着代码调试走一遍流程,然后开始顺着这个流程走过的地方,把他经过的代码都复制到编辑器当中,就像这样

先把这个g复制过来

代码语言:javascript
复制
function g(e, t, n) {
        return t ? (n ? y(t, e) : h(y(t, e))) : n ? m(e) : h(m(e));
}

然后追进去F11,再复制m(e)

代码语言:javascript
复制
function m(e) {
        return (function (e) {
          return d(s(p(e), 8 * e.length));
        })(v(e));
}
function g(e, t, n) {
        return t ? (n ? y(t, e) : h(y(t, e))) : n ? m(e) : h(m(e));
}

然后再复制v(e)

代码语言:javascript
复制
function v(e) {
        return unescape(encodeURIComponent(e));
}
function m(e) {
        return (function (e) {
          return d(s(p(e), 8 * e.length));
        })(v(e));
}
function g(e, t, n) {
        return t ? (n ? y(t, e) : h(y(t, e))) : n ? m(e) : h(m(e));
}

再复制下一个执行的函数

代码语言:javascript
复制
function p(e) {
    var t,
        n = [];
    for (n[(e.length >> 2) - 1] = void 0, t = 0; t < n.length; t += 1)
        n[t] = 0;
    var r = 8 * e.length;
    for (t = 0; t < r; t += 8)
        n[t >> 5] |= (255 & e.charCodeAt(t / 8)) << t % 32;
    return n;
}

function v(e) {
    return unescape(encodeURIComponent(e));
}

function m(e) {
    return (function (e) {
        return d(s(p(e), 8 * e.length));
    })(v(e));
}
function g(e, t, n) {
        return t ? (n ? y(t, e) : h(y(t, e))) : n ? m(e) : h(m(e));
}

扣代码就是不停的重复,如果你不小心跟丢了,那就重新来过,再调试,最好要结合console.log方法穿插的调试

重复这个过程,直到你在webstorm中执行g不会提示错误为止,

如果报错了,你就把报错粘贴到谷歌翻译里翻译一下,认真百度一下,然后再认真看看是不是括号没复制全啊,变量名是不是重复啊等等问题,这个加密真的不难啊

最后再结合前面的nonce的方法你就会得到下面这个结果

这个时候就可以把这个js拿去Python里面调用了。

偷懒直接拿postman生成一下请求的代码,把参数修改成从js生成就可以了。

直接上结果

完事儿~

以上就是今天的全部内容啦,咱们下次再会~

Love&Share

[ 完 ]

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-08-18,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 咸鱼学Python 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 今日目标网站
    • 抓包分析与加密定位
      • 如何定位加密参数的位置?
    • 加密分析
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档