某资讯之base64加密

目标网站:aHR0cHMlM0EvL3d3dy4zNjBrdWFpLmNvbS85ZGVmOTkyYzYxNjNkYTJjMw==
我们需要拿到该链接下的资讯内容,本以为一个xpath就轻松搞定,可在页面解析之后,并没有拿到我们想要的内容,打开源码查看,原来是给我们需要的内容进行了加密,放张图:在这里插入图片描述
真是给了我一个惊喜啊!!!!!
话不多说,直接搞他。
首先我们看到在加密内容之前有一个变量名:window.INITIAL_DATA,我们直接拿到__INITIAL_DATA__在全局进行搜索,发现以下几处地方出现了这个变量名:在这里插入图片描述
我们观察第一个看起来比较像,打开看看,在detail.js文件下再次搜索window.INITIAL_DATA,会发现好多处都有这个字段,我们在当前处下一个断点,重新刷新这个页面,发现了我们需的字段已经是解过密之后的正常内容在这里插入图片描述
控制台输出看一下:在这里插入图片描述
显然这不是我们想要的结果,我们想要的是从加密之前到加密之后的整个过程,所以我们直接拉到该js文件的第一行处再下一个断点重新刷新整个页面
在这里插入图片描述
在这里插入图片描述
接下来就是比耐心时候了,我们一路F10按下去发现当前的位置我们的__INITIAL_DATA__字段发生了变化在这里插入图片描述
在这里插入图片描述
找到这里我们离成功已经进了一大步了,接下来我们只要进入在这里插入图片描述
这个函数他究竟在里面干了什么???
打好断点重新刷新页面,F11我们进入这个函数一探究竟,接下来还是比耐心的时候,注意观察我们需要的加密内容在哪里出现。
找到这里出现了我们需要的加密内容在这里插入图片描述
继续跟进,进入到了 这个函数在这里插入图片描述
至此我们的解密位置寻找已经基本结束了,接下来就是需要什么找什么。
成果展示:

import requests
import execjs
import re


def js_fun(encrypt):
    decrypt = '''
            var s = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
            u = String.fromCharCode
            o = function(e) {
                var t = {};
                for (var n = 0, r = e.length; n < r; n++)
                    t[e.charAt(n)] = n;
                return t
            }(s)
            b = function(e) {
                var t = e.length
                    , n = t % 4
                    , r = (t > 0 ? o[e.charAt(0)] << 18 : 0) | (t > 1 ? o[e.charAt(1)] << 12 : 0) | (t > 2 ? o[e.charAt(2)] << 6 : 0) | (t > 3 ? o[e.charAt(3)] : 0)
                    , i = [u(r >>> 16), u(r >>> 8 & 255), u(r & 255)];
                return i.length -= [0, 0, 2, 1][n],
                    i.join("")
            }
            m = new RegExp(["[A-B]"].join("|"),"g")
            g = function(e) {
                switch (e.length) {
                    case 4:
                        var t = (7 & e.charCodeAt(0)) << 18 | (63 & e.charCodeAt(1)) << 12 | (63 & e.charCodeAt(2)) << 6 | 63 & e.charCodeAt(3)
                            , n = t - 65536;
                        return u((n >>> 10) + 55296) + u((n & 1023) + 56320);
                    case 3:
                        return u((15 & e.charCodeAt(0)) << 12 | (63 & e.charCodeAt(1)) << 6 | 63 & e.charCodeAt(2));
                    default:
                        return u((31 & e.charCodeAt(0)) << 6 | 63 & e.charCodeAt(1))
                }
            }
            w =  function(e) {
                return e.replace(/[\s\S]{1,4}/g, b)
            }
            function y(e) {
                return e.replace(m, g)
            }
            function E(e) {
                return y(w(e))
            }
            function Base64_decode(e) {
                return E(String(e).replace(/[-_]/g, function(e) {
                    return e == "-" ? "+" : "/"
                }).replace(/[^A-Za-z0-9\+\/]/g, ""))
            }
            function detail(e) {
                var t = e.slice(0, 1e3).split("").map(function(e, t) {
                    return String.fromCharCode(e.charCodeAt() - t % 2)
                }).join("");
                return Base64_decode(t + e.slice(1e3))
            }
    ''' + '''var e = "%s"''' % encrypt
    com = execjs.compile(decrypt)
    text = com.call('detail', encrypt)
    return text


def get_detail(url):
    url = url
    text = requests.get(url).text
    try:
        encrypt = re.findall('window.__INITIAL_DATA__\s*?=\s*?[\"\']\\\n(.*?)[\"\']\;', text.replace('\\', ''))[0]
    except:
        return
    content = js_fun(encrypt)
    detail = content.replace(r'\u',r'\\u')
    return detail


if __name__ == '__main__':
    url = 'https://www.360kuai.com/91b9e2f020240ab14'
    print(get_detail(url))

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值