Pyexecjs-使用python执行JavaScript

Pyexecjs的使用

一,下载

pip install pyexecjs

import execjs

二,使用

2.1,使用eval直接执行
import execjs
print(execjs.eval('"abc aaa bbb".split(" ")'))
['abc', 'aaa', 'bbb']

# 调用变量名
text = execjs.compile(open(r'text.js').read())
print(text.eval('d'))
2.2,compile加载js,call执行
# text.js 文件
var t 666;
function add(a, b) {
    return a+b
}

# python文件
import execjs
text = execjs.compile(open(r'text.js').read())
# 调用函数
print(text.call('add', 1, 2))
# 获取变量名
print(text.eval('t'))
2.3,更改Js引擎
  1. 获取 js 引擎的名字

    >>> execjs.get().name
    'JScript'
    
    # 默认的js引擎,但是对某一些js代码不支持,所以要换成 nodejs 引擎
    
  2. 在虚拟机中安装

    sudo apt-yum install nodejs
    
  3. Windows安装

    http://nodejs.cn/download/

三,百度翻译分析

  1. 找到发送翻译的请求,找到加密参数

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0F0Yjtrq-1592054335894)(D:\Python\Python笔记\爬虫高级\js调试\assets.png)]

当我们清空所有内容之后,每次点击翻译,该页面就会携带一些参数发送一个 POST 请求

  1. 分析请求参数

    如果我们要分析参数,要多请求几次,找出哪些是可变的,哪些参数不变

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VHwFbwzT-1592054335896)(D:\Python\Python笔记\爬虫高级\js调试\assets.png)]

  2. 寻找参数

    一个请求参数的来源:

    1. 服务端在之前的请求返回的
    2. Js 生成的
  • token :服务端返回的,在源代码里面能找到

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bj2Ff7Vz-1592054335897)(D:\Python\Python笔记\爬虫高级\js调试\assets.png)]

  1. 分析请求的js

切忌,要从请求的入口进入到 js 代码里面

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hMJqhz3x-1592054335900)(D:\Python\Python笔记\爬虫高级\js调试\assets.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-X4AK7EQ7-1592054335902)(D:\Python\Python笔记\爬虫高级\js调试\assets.png)]

  1. js 调试

    首先从入口进入以后,在代码处打上断点,在点击翻译按钮发送一次请求

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-80YUvooj-1592054335904)(D:\Python\Python笔记\爬虫高级\js调试\assets.png)]

    但是我们发现该请求不是我们需要的,因为翻译的时候就算输入一个字母,后台自己也会偷偷的发送请求,所以我们点击蓝色的按钮让他在运行

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VQ7bjh9H-1592054335906)(D:\Python\Python笔记\爬虫高级\js调试\assets.png)]

    此时我们发现调用堆栈发生改变,并且 ajax 请求发送的参数发生改变,并且找到了该js发送请求的过程,接下来就可以扣代码了

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Bs3T3FCv-1592054335908)(D:\Python\Python笔记\爬虫高级\js调试\assets.png)]

  2. 扣Js代码

    最关键的一步,找出生成 sign 参数的函数,并把 js 代码扣下来

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mGfLkWKX-1592054335911)(D:\Python\Python笔记\爬虫高级\js调试\assets.png)][外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-88Me5qlT-1592054335912)(D:\Python\Python笔记\爬虫高级\js调试\assets.png)][外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qwIPDHr0-1592054335914)(D:\Python\Python笔记\爬虫高级\js调试\assets.png)][外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qeGSMtIV-1592054335916)(D:\Python\Python笔记\爬虫高级\js调试\assets.png)]

四,拍js加密分析

  1. 首先,我们在点击观看视屏的时候,抓到的包是一个 get 请求,地址是视屏

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EB37sl16-1592054335918)(D:\Python\Python笔记\爬虫高级\js调试\assets.png)]

  2. 其次,一个请求要么是js发起的,要么就是浏览器请求的(该情况属于后者)

    在这里插入图片描述

  3. 所以我们去审查元素,并在网页源代码里面找这个播放视屏盒子的属性

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pEZdTuC5-1592054335921)(D:\Python\Python笔记\爬虫高级\js调试\assets.png)]

  4. 我们发现播放视屏里的元素都是 js 生成的,所以通过 Fiddle 去抓包,把这些 js 生成的盒子的属性用全局搜索去查看,并且找到了我们需要的 js 文件

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hRLi2dPa-1592054335923)(D:\Python\Python笔记\爬虫高级\js调试\assets.png)]

  5. sources 里面,我们通过在 Fiddler 里面找打的 js 文件,顺利进入内部

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ToQrCrBW-1592054335925)(D:\Python\Python笔记\爬虫高级\js调试\assets.png)]

  6. 在此处断点,一步一步在调用堆栈里面查找我们需要的js代码

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mz2riSby-1592054335926)(D:\Python\Python笔记\爬虫高级\js调试\assets.png)]

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fEro0oNt-1592054335927)(D:\Python\Python笔记\爬虫高级\js调试\assets.png)]

    但是我们往上看发现,传进来的 t 参数已经把视屏地址解压了,所以继续看调用堆栈

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-38lC0LQB-1592054335929)(D:\Python\Python笔记\爬虫高级\js调试\assets.png)]

  7. 终于有了小发现(url 的解码方式,就差 url 的来源了),a.vcastr_file 这个参数就是来源,还得继续往上面找

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HH5eYRGh-1592054335929)(D:\Python\Python笔记\爬虫高级\js调试\assets.png)]

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OpsJWPh0-1592054335932)(D:\Python\Python笔记\爬虫高级\js调试\assets.png)]

    发现其实我们需要的参数是 this 这个参数

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-29SvoHSV-1592054335934)(D:\Python\Python笔记\爬虫高级\js调试\assets.png)]

  8. 最终在堆栈中,我们找出了this生成的方式,也找到了url的的来源

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PHhitcoP-1592054335936)(D:\Python\Python笔记\爬虫高级\js调试\assets.png)]

  9. 剩下的就是扣代码 js 代码进行改造了

    python 代码

sourse_page = requests.get('https://www.meipai.com/media/1140316782').text
encrypt_mp4_url = re.findall(r'data-video="(.*?)"', sourse)[0]
print(mp4_url)	# 加密的地址

js = execjs.compile(open(r'美拍分析.js').read())
decrypt_mp4_url = js.call('decodeMp4.decode', mp4_url)
print(a)		# 解密后的地址

js 代码

var h = "substring",
    i = "split",
    j = "replace",
    k = "substr",
    g = 'base64'
decodeMp4 = {
        getHex: function(a) {
            return {
                str: a[h](4),
                hex: a[h](0, 4)[i]("").reverse().join("")
            }
        },
        getDec: function(a) {
            var b = parseInt(a, 16).toString();
            return {
                pre: b[h](0, 2)[i](""),
                tail: b[h](2)[i]("")
            }
        },
        substr: function(a, b) {
            var c = a[h](0, b[0])
              , d = a[k](b[0], b[1]);
            return c + a[h](b[0])[j](d, "")
        },
        getPos: function(a, b) {
            return b[0] = a.length - b[0] - b[1],
            b
        },
        decode: function(a) {
            var b = decodeMp4.getHex(a)
              , c = decodeMp4.getDec(b.hex)
              , d = decodeMp4[k](b.str, c.pre);
            return atob(decodeMp4[k](d, decodeMp4.getPos(d, c.tail)))
        }
    };

var e = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="
atob = function(a) {
        if (a = a.replace(/=+$/, ""),
        a.length % 4 == 1)
            throw f;
        for (var b, c, d = 0, g = 0, h = ""; c = a.charAt(g++); ~c && (b = d % 4 ? 64 * b + c : c,
        d++ % 4) ? h += String.fromCharCode(255 & b >> (-2 * d & 6)) : 0)
            c = e.indexOf(c);
        return h
    }
  • 4
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值