你一定不知道爬虫js逆向还能登录芒果TV吧!

本文介绍了一个使用Python进行JS逆向登录芒果TV的爬虫项目。通过分析登录流程,获取验证码,解密密码,最终实现自动化登录。文中详细讲解了项目思路,包括使用requests和execjs等工具,以及遇到的密码加密问题和解决方案。
摘要由CSDN通过智能技术生成

前言

最近在捣鼓js这一块的知识,顺便给大家分享一个练手学习的小项目,让自己在多了解一下爬虫的魅力,js逆向登录芒果TV

目标地址

网址:8ec200330de7c741bd39afc56e043e6f
image.pngimage.png

工具使用

开发工具:pycharm
开发环境:python3.7, Windows10
使用工具包:requests,time,execjs

项目思路解析

首先需要先明确登录的基本流程,网页登录时可以大致看到需要提交4个数据的from表单数据账户,密码,验证码,记住密码,以及有些网页还会有协议,账户或者电话号码一般是明文,密码是加密数据,验证码生成的方式会有点不确定,可能是前端的,也有可能是后端,或者是其他平台的,但是验证码也会传递到后端进行对比需要获取到验证码的cookie值,稍稍屡清楚之后开始进入正题,毕竟实践出真理,没有实践都是空谈好。

第一步找找对应的登录接口打开调试工具查看数据是否为动态请求用错误的请求尝试
image.png
需要传递的数据
image.png
跟我们的推断差不多账号,密码,验证码,其他两个固定参数
先解决验证码的问题,验证码也是在实时更新的,一定也会有验证码的接口
image.png
先请求验证码数据数据手动的进行验证码识别

    session = requests.session()
    captcha_url = f"https://i.mgtv.com/vcode?from=pcclient&time={
     int(time.time() * 1000)}"

    headers = {
   
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.87 Safari/537.36"
    }

    captcha_res = session.get(captcha_url, headers=headers)

    with open("captcha.jpg", "wb") as f:
        f.write(captcha_res.content)

获取到图片数据手动输入
现在唯一的问题是数据是密码的数据是加密,需要找到加密的位置在哪里,直接全局搜索这个词的关键值,
image.png
image.png
数据在解析的函数在这里,参数都是e传递过来的需要找到这个方法调用的位置
image.png
password是c参数生成的
image.png
image.png

honey是整个js密码的解析函数
我们复制整个代码带login.js文件

 function s(i, t, s) {
   
        this.e = c(i),
        this.d = c(t),
        this.m = c(s),
        this.chunkSize = 2 * B(this.m),
        this.radix = 16,
        this.barrett = new O(this.m)
    }

function login(i){
   
        return e(131),
        time = String(Date.parse(new Date)).substring(0, 10),
        rd = String(Math.random()),
        nonce = String(rd + time + time + rd).substring(0, 32),
        i = time + nonce + i,
        function(i, t) {
   
            var s = new Array
              , r = t.length
              , e = 0;
            for (; e < r; )
                s[e] = t.charCodeAt(e),
                e++;
            for (; s.length % i.chunkSize != 0; )
                s[e++] = 0;
            var g, n, d, u = s.length, o = "";
            for (e = 0; e < u; e += i.chunkSize) {
   
                for (d = new k,
                g = 0,
                n = e; n < e + i.chunkSize; ++g)
                    d.digits[g] = s[n++],
                    d.digits[g] += s[n++] << 8;
                var a = i.barrett.powMod(d, i.e)
                  , h = 16 == i.radix ? l(a) : f(a, i.radix);
                o += h + " "
            }
            return o.substring(0, o.length - 1)
        }(new s("10001","","A5245A4630DD7CE9D8A967E33A50EB52C2634FD042C4BFBCF5A5C1317A234FD0D1D2C75D083946AF70CE480C399FAD8EEBE9F5A904F30E4D3C91CDD7C27C4D07E27015D46B29A003E9D49834E19041A7BA45A95E6161697975721E88949E8023DA682895086223683593F054E7AAE0E07C40DB33BD80EE5909CE48D17C07D097"), i)
};
    var r, g, A, o = 16, D = o, E = 65536, b = E >>> 1, M = E * E, C = E - 1;
    function e(i) {
   
        r = new Array(i);
        for (var t = 0; t < r.length; t++)
            r[t] = 0;
        g = new k,
        (A = new k).digits[0] = 1
    }
    e(20);
    n(1e15);
    function k(i) {
   
        this.digits = "boolean" == typeof i && 1 == i ? null : r.slice(0),
        this.isNeg = !1
    }
    function y(i) {
   
        var t = new k(!0);
        return t.digits = i.digits.slice(0),
        t.isNeg = i.isNeg,
        t
    }
    function n(i) {
   
        var t = new k;
        t.isNeg = i < 0,
        i 
  • 37
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值