逆向爬虫29 替换execjs的两种方法

逆向爬虫29 替换execjs的两种方法

一. 问题引入

最近做js逆向扣取完网站的加密逻辑js代码放到本地用python的 execjs 模块运行的时候, 总会遇这样一个问题。

在浏览器中可以运行, 在js调试工具中可以运行, 甚至在nodejs中也可以运行, 但在python的 execjs 模块中就会报 gbk 编码错误。

在这里插入图片描述

多次使用修改编码方式解决无果后, 就和群里大佬们请教, 得知了两个解决方案。

  1. 使用python的 subprocess模块 , 在命令行中自己调用node xxx.js的方式来运行。
  2. 使用nodejs的 express Web框架 , 搭建一个 http API接口 , 使用python的 requests模块 对该接口进行访问, 获取起返回结果。

下面就来介绍这两种解决方案的具体实现过程。

二. 使用subprocess调用nodejs执行js文件

js代码如下

// 前面省略了从网页中扣出来的代码

function encryptPwd() {
    var arguments = process.argv.splice(2); // 获取命令行参数
    var enc = new JSEncrypt();
    enc.setPublicKey("-----BEGIN PUBLIC KEY-----MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDAbfx4VggVVpcfCjzQ+nEiJ2DLnRg3e2QdDf/m/qMvtqXi4xhwvbpHfaX46CzQznU8l9NJtF28pTSZSKnE/791MJfVnucVcJcxRAEcpPprb8X3hfdxKEEYjOPAuVseewmO5cM+x7zi9FWbZ89uOp5sxjMnlVjDaIczKTRx+7vn2wIDAQAB-----END PUBLIC KEY-----");
    console.log(enc.encrypt(arguments[0]));
}
encryptPwd();

python代码如下

import subprocess

password = '123456'
result = subprocess.check_output(f"node encrypt.js {password}", shell=True)
print(result.decode('utf-8').strip())

上述代码相当与在命令行中执行 node encrypt.js 123456 命令

参考链接

NodeJS获取命令行后面的参数

python subprocess模块的使用

三. 调用express web API接口

js包含两个文件:1. encrypt.js (抠出来的加密逻辑js) 2. main.js (express启动文件)

// encrypt.js
// 前面省略了从网页中扣出来的代码

function encryptPwd(password) {
    var enc = new JSEncrypt();
    enc.setPublicKey("-----BEGIN PUBLIC KEY-----MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDAbfx4VggVVpcfCjzQ+nEiJ2DLnRg3e2QdDf/m/qMvtqXi4xhwvbpHfaX46CzQznU8l9NJtF28pTSZSKnE/791MJfVnucVcJcxRAEcpPprb8X3hfdxKEEYjOPAuVseewmO5cM+x7zi9FWbZ89uOp5sxjMnlVjDaIczKTRx+7vn2wIDAQAB-----END PUBLIC KEY-----");
    return enc.encrypt(password);
}

// 导出该函数
module.exports = {
    encryptPwd
}

要使用express请先确认电脑上是否有nodejs, 装好后还需要在当前目录执行 npm i express 安装express

// main.js
// 引入依赖包
var express = require('express');
var bodyParser = require('body-parser');

// 引入自定义的JS文件
var enc = require('./encrypt.js');

// 创建应用实例
var app = express();

// 判断请求体格式是不是表单格式,如果是的话会调用qs库把请求体字符串转成对象
app.use(bodyParser.urlencoded({extended: true}));

// 判断请求体格式是不是json格式,如果是的话会调用JSON.parse方法把请求体字符串转成对象
app.use(bodyParser.json())
// 上面两个只有一个会生效

// 创建路由
// app.post(path, function(req, res) {具体逻辑})
app.post('/encrypt', function(req, res) {
    let result = req.body;
    console.log('result', result);
    result = enc.encryptPwd(result.password);
    res.send(result);
})

// 启动服务,监听指定主机和端口上的连接
app.listen(3000, () => {
    console.log('开启服务,端口3000')
})

参考链接:直接从视频的 1:15:00 左右开始看就可以了

js逆向课-第六课(最新版微博登录,nodejs调用js)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Selenium是一个自动化测试的工具,可以启动一个全新的浏览器,并从浏览器中提取到你想要的内容。为什么要学习Selenium呢?因为很多网站现在将数据进行加密,再通过JavaScript将数据解密,而Requests模块只能获取到加密后的数据,无法爬取这类网站的数据。而Selenium模块提供了浏览器环境,浏览器会加载JavaScript代码对数据进行解密,因此Selenium可以应对大多数数据加密的情况。 安装Selenium很简单,首先输入命令pip install selenium进行安装,然后下载浏览器驱动,可以在https://npm.taobao.org/mirrors/chromedriver找到并下载适合自己浏览器版本的驱动。下载完后将驱动放到Python解释器目录即可。 逆向爬虫是指使用Selenium来对网站进行爬取。通过Selenium可以模拟浏览器的行为,使得爬虫更加难以被检测到。逆向爬虫可以应对一些反爬虫的策略,例如验证码等。如果你想要使用Selenium进行逆向爬虫,可以按照以下步骤进行操作: 1. 打开浏览器,输入网址并回车,可以使用Selenium的webdriver模块来实现。 2. 使用Selenium的各种操作方法来提取你想要的内容,例如查找元素、点击按钮等。 3. 如果需要获取iframe中的内容,可以使用Selenium的switch_to.frame方法切换到对应的iframe,并提取内容。 4. 如果需要操作下拉列表,可以使用Selenium的select模块来选择选项,并获取页面代码。 5. 如果想要隐藏浏览器窗口,可以使用Selenium的options模块来设置无头模式。 对于验证码的处理,你可以使用超级鹰等第三方工具来解决,这些工具可以自动破解验证码。 请注意,这些步骤只是逆向爬虫的基础方法,具体的操作可能因网站而异,你可能需要根据具体情况进行调整。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [逆向爬虫11 selenium基础](https://blog.csdn.net/weixin_40743639/article/details/122631986)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值