PyExecJS模块的安装和更换npm为国内镜像

逆向初识

用我们的程序来复刻出来浏览器中对数据加密或者解密的过程

浏览器里面运行的脚本. 是js脚本.
我们是能直接看到js脚本的.

1. 不需要逆向直接用python代码直接干.
    不是所有的请求都需要逆向js的...
    能直接干的就直接干...

2. 网站可能会对数据进行加密

    数据是看不懂的...不是100%

    请求参数,
    请求头,
    cookie,
        在尝试之前不要去逆向
        尝试之后.
            一开始好用, 过阵子不好用了.
            挨个删...看看到底是谁. 是 那个关键的点.

            找到关键的值, 之后, 再去hook.....

    响应体.

    综上, 不论哪一个. 一定要先去尝试. 或者尝试锁定某个参数需要逆向.

3. 我们怎么办
    见招拆招...灵活...
    1. 如果是标准库...des, md5, rsa, aes
        三种方案,
            直接抠js代码. 在你本地运行.
            找对应的js库. 在你本地运行.
            用python的标准库.md5

            只要保证最终的结果一致即可.

    2. 在你的意识里. 找不到该标准库(网站自己魔改的算法)
        抠代码
        补环境

4. 需要一个本地可以执行js代码的环境...
    nodejs来作为本地执行js的引擎...

    node安装之后, 需要重启pycharm
    在pycharm中, 安装node插件. 方便调试代码
    file -> settings -> plugins -> market -> node -> install
    ok....

    本地可以运行js了. 但是. 你的爬虫是python
    需要在python中能执行这些js

    pip install pyexecjs

5. 加密入口.
    需要知道js代码执行的每一步过程中, 参数(变量) 变化过程.
    需要知道代码如何可以一行一行的执行,并且可以观察变量的变化过程.
    debug

    https://music.163.com/weapi/song/enhance/player/url/v1?csrf_token=
    params
    encSecKey

    1. 从initor(最原始的方案, low)

    2. 直接搜索(好的方案)
        关键字, 关键词, url,
        拦截器.

window.asrsea(JSON.stringify(i5n), bsg4k(["流泪", "强"]), bsg4k(TH1x.md), bsg4k(["爱心", "女孩", "惊恐", "大笑"]));


    debug:
        释放按钮:
            释放当前debug, 程序会继续运行. 运行到下一个断点位置. 或者到运行结束.

        step over(第二个妞):
            执行完当前这一行代码. 停留在下一行代码

        step into(第三个按钮):
            执行下一步代码.  如果下一步是在某个函数内部. 会进入到该函数内部执行一步代码
            如果下一步代码是原生的js或者表达式, 会自动运行完改行代码




function fn(){
    一万行代码
    一万行代码
}


function gn(){
    fn();
    fn();
}




1. 找到了加密入口怎么办
    四套方案:
    1. 把它的js代码抠下来(加密的位置)
        硬抠. 很痛苦.
        找规律... 通过观察代码的层次结构.
        快速抠取你需要的逻辑.

    2. 考虑阅读它的代码.通过阅读代码. 得知它用的是什么加密逻辑
        甚至,想办法知道它用的是什么第三方加密js库.
        你可以直接在本地使用第三方库. (最简单的)

        去这个网站搜. 你需要的第三方库.
        https://www.npmjs.com/

        靠猜测. 它使用的是哪个js库.
        去搜索. 观察它的用例.找有没有和代码中相似的逻辑

        npm install crypto-js 直接安装即可

        有些库只能自己去积累.
        https://ohdave.com/rsa/

        npm和pip是一样的. 源在国外. 下载的时候有的就很慢.
        甚至完全下载不了.  去看樵夫老师在这一节课发的文档.
        按照文档的操作来一波. 保你健康平安的下载完.

        rsa不止这一个库....


    3. 先阅读js代码. 阅读明白js代码的执行过程, 用python完全的
        复刻程序逻辑(对js和python的开发功底要求高).

       python的某些逻辑, 比js简单..

    4. 补环境(抠下来所有js代码)

PyExecJS模块的安装

pyexecjs是一个可以帮助我们运行js代码的一个第三方模块. 其使用是非常容易上手的.

但是它的运行是要依赖能运行js的第三方环境的. 这里我们选择用node作为我们运行js的位置.

1.1 安装Nodejs

image-20210903140740785 image-20210903140758138 image-20210903140849791 image-20210903140907802 image-20210903140924424 image-20210903140940664 image-20210903141025414 image-20210903141119146

image-20230501184915171

切记. 重启pycharm或者重启电脑.

1.2 安装pyexecjs

pip install pyexecjs

测试一下:

import execjs

print(execjs.get().name)  # 需要重启pycharm或者重启电脑 Node.js (V8)

1.3 简单使用

# 所有windows同学记住, 只要使用execjs. 那么请把以下代码放在爬虫程序的第一行
import subprocess  # 执行命令行的
from functools import partial  # 固定某个参数的
subprocess.Popen = partial(subprocess.Popen, encoding='utf-8')

# 记住上面的代码. 放在前面, 放在后面是不管用的.

# 像不像. js的hook
import execjs  # pip install pyexecjs

# 当前运行js的环境是什么
# print(execjs.get().name)    # Node.js (V8)
# 如果显示的不是nodejs
# 请注意,
# 1. 重启一下pycharm, 甚至可能需要重启电脑.
# 2. 去windows的环境变量. 找PATH变量. 把nodejs的安装目录增加到PATH中,
#    重复上面`步骤1`的动作

f = open("02_test.js", mode="r", encoding="utf-8")
js_code = f.read()
f.close()

# 以下是我们逆向的时候.使用的最多的一种逻辑.
js = execjs.compile(js_code)   # 预编译js代码
# ret = js.call("fn")  # 直接调用js中的fn函数
# ret = js.call("fn", 10, 30)  # 参数直接写..
# 你的代码中如果出现了中文. 可能会出现以下
# UnicodeDecodeError: 'gbk' codec can't decode byte 0x8c in position 88: illegal multibyte sequence
ret = js.call("gn", "张无忌_胡辣汤_马化腾_sb")  # 参数直接写..
print(ret)
import execjs

print(execjs.get().name)

# execjs.eval 可以直接运行js代码并得到结果
js = """
    "鲁班_王昭君_猴子_亚瑟_蔡文姬".split("_")
"""
res = execjs.eval(js)
print(res)

# execjs.compile(),  call()
# execjs.compile() 事先加载好一段js代码,
jj = execjs.compile("""
    function an(a, b){
        return a + b    
    }
""")
# call() 运行代码中的xxx函数. 后续的参数是xxx的参数
ret = jj.call("an", 10, 20)
print(ret)

windows中如果出现编码错误. 在引入execjs之前. 插入以下代码即可.

import subprocess
from functools import partial
subprocess.Popen = partial(subprocess.Popen, encoding='utf-8')

import execjs

完事儿. 你没有看错. execjs就这几个功能就够咱用的了.

# 所有windows同学记住, 只要使用execjs. 那么请把以下代码放在爬虫程序的第一行
import subprocess  # 执行命令行的
from functools import partial  # 固定某个参数的
subprocess.Popen = partial(subprocess.Popen, encoding='utf-8')

# 记住上面的代码. 放在前面, 放在后面是不管用的.

# 像不像. js的hook
import execjs  # pip install pyexecjs


import re

f = open("bilibili.html", mode="r", encoding="utf-8")
page_source = f.read()
f.close()

obj = re.compile(r"window\.__INITIAL_STATE__ = (?P<code>.*?);", re.S)

# 这是一个字符串...
code = obj.search(page_source).group("code")

# 目的是通过json来把它处理成字典. 方便咱们取值
# import json
# print(json.loads(code))

# 可以考虑用js引擎来做这个转化

# js里的eval
# 把code当成js代码运行. 运行的结果是一个js对象.
ret = execjs.eval(code)  # excejs这个库. 会自动帮你把js的对象. 转化成python的字典
print(ret)
print(type(ret))

# 后续就是字典的操作. 取值了.

1.4 浏览器设置

浏览器点击右上角齿轮. 进行配置.

配置一.

image-20230421214643430

配置二.

image-20230421214733066

更换npm为国内镜像

在终端执行.

npm set registry http://registry.npmmirror.com

首先, 打开"我的电脑". 找到"c盘中用户文件夹". 找到你当前正在使用的"用户"

img1

img2

img3
img4

img5

代码如下.

registry=http://registry.npmmirror.com/

disturl=https://registry.npmmirror.com/-/binary/node/
# node-sass预编译二进制文件下载地址
sass_binary_site=https://registry.npmmirror.com/-/binary/node-sass
# sharp预编译共享库, 截止2022-09-20 sharp@0.31.0的预编译共享库并未同步到镜像, 入安装失败可切换到sharp@0.30.7使用
sharp_libvips_binary_host=https://registry.npmmirror.com/-/binary/sharp-libvips
python_mirror=https://registry.npmmirror.com/-/binary/python/
electron_mirror=https://registry.npmmirror.com/-/binary/electron/
electron_builder_binaries_mirror=https://registry.npmmirror.com/-/binary/electron-builder-binaries/
# 无特殊配置参考{pkg-name}_binary_host_mirror={mirror}
canvas_binary_host_mirror=https://registry.npmmirror.com/-/binary/canvas
node_sqlite3_binary_host_mirror=https://registry.npmmirror.com/-/binary/sqlite3
better_sqlite3_binary_host_mirror=https://registry.npmmirror.com/-/binary/better-sqlite3

MAC同学,

如果是M1芯片的. 需要先更新一些库. 不是M1的不用管

包括但不限于:
brew install pkg-config cairo pango libpng jpeg giflib librsvg

  1. 命令行方式:

    npm config set registry http://registry.npmmirror.com
    
  2. 编辑 ~/.npmrc 文件, 设置方案和windows的一样

registry=http://registry.npmmirror.com/

disturl=https://registry.npmmirror.com/-/binary/node/
# node-sass预编译二进制文件下载地址
sass_binary_site=https://registry.npmmirror.com/-/binary/node-sass
# sharp预编译共享库, 截止2022-09-20 sharp@0.31.0的预编译共享库并未同步到镜像, 入安装失败可切换到sharp@0.30.7使用
sharp_libvips_binary_host=https://registry.npmmirror.com/-/binary/sharp-libvips
python_mirror=https://registry.npmmirror.com/-/binary/python/
electron_mirror=https://registry.npmmirror.com/-/binary/electron/
electron_builder_binaries_mirror=https://registry.npmmirror.com/-/binary/electron-builder-binaries/
# 无特殊配置参考{pkg-name}_binary_host_mirror={mirror}
canvas_binary_host_mirror=https://registry.npmmirror.com/-/binary/canvas
node_sqlite3_binary_host_mirror=https://registry.npmmirror.com/-/binary/sqlite3
better_sqlite3_binary_host_mirror=https://registry.npmmirror.com/-/binary/better-sqlite3

附赠:
npm官方库搜索: https://www.npmjs.com/
JS语法规则:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference
rsa.js很古老的一个库 https://ohdave.com/rsa/

posted @ 2023-03-11 15:47  凫弥  阅读(661)  评论(0编辑  收藏  举报