cat
Shioho

# 下载

点击 nodejs 下载所需版本即可

# cnpm

将 NodeJs 资源提取路径 从 NPM 移到 CNPM,CNPM 下载点在国内,速度更快。

h
npm install -g cnpm --registry=https://registry.npm.taobao.org

# npm install --save

--save 会生成 package.json 配置,这样会在 install 新模块的时候保留当前模块,如果不配置的话,则会在新模块 install 时删除未配置的模块

# Js 代码加密

使用的 npm 库为 js-obfuscator

# 安装

h
//全局安装
npm install  js-obfuscator -g
//添加至本地
npm install js-obfuscator --save

js-obfuscator 依赖于 grunt ,使用前也需安装 grunt

h
npm install -g grunt-cli

# 使用案例

s
var jsObfuscator = require('js-obfuscator');
var fs = require('fs');
var options = {
    keepLinefeeds: true,
    keepIndentations: true,
    encodeStrings: true,
    encodeNumbers: true,
    moveStrings: true,
    replaceNames: true,
    variableExclusions: ['^_get_', '^_set_', '^_mtd_']
};
fs.readFile("./config.json", "utf-8", (err, data) => {
    var jsonData = JSON.parse(data);
    fs.readFile("./Source/" + jsonData.sourceName, "utf-8", (err, data) => {
        jsObfuscator(data, options).then(function (obfuscated) {
            fs.writeFile("./Obfuscator/" + jsonData.toName, obfuscated, function (err) {
                if (err) {
                    // 写入文件失败
                    console.log('写入文件失败:', err)
                } else {
                    // 写入文件成功
                    console.log('文件加密成功')
                }
            })
        }, function (err) {
            console.error(err);
        });
    });
});

# Js 代码压缩混淆

# 安装

h
//全局安装
npm install uglify-js -g

# 使用

h
uglifyjs xxx.js -m -o toxxx.js

-m :改变变量名称
-o :指定输出文件
-b :美化代码格式的参数

# Excel 转 Json

# 安装

//node-xlsx 
npm install node-xlsx -g
//ejsexcel
npm install ejsexcel -g

# 使用案例

var path = require('path');
var ejsExcel = require('ejsexcel');
var fs = require('fs');
var xlsxName = "xxx.xlsx";
var jsonName = "ChineseQuestion.json";
var jsonData = [];
var exBuf = fs.readFileSync(__dirname + "/" + xlsxName);
ejsExcel.getExcelArr(exBuf).then(exlJson => {
    var jsonPath = path.join(__dirname, "/", jsonName);
    // 获取第一个表
    var sheet = exlJson[0];
    sheet.forEach((item, index) => {
        // 从第二行开始插入,避免连表头也插入_data 里面
        if (index > 0) {
            if (item[1] != null) {
                var data = {
                    Id: parseInt(item[0]),
                    Question: item[1]
                }
                jsonData.push(data);
            }
        }
    });
    // 写入文件
    fs.writeFile(jsonPath, JSON.stringify(jsonData), err => {
        if (!err) {
            console.log("json生成成功");
        }
    });
});

# 获取命令行输入

# 参考用例

var fs = require('fs');
var util = require('util');
var readline = require('readline');
var douyin = require('./douyin.js');
var tiktok = require('./tiktok.js');
var configPath = "./config.json";
var jsonCfgData;
fs.readFile(configPath, "utf-8", (err, data) => {
    console.log();
    console.log("===================xxx===================")
    console.log();
    jsonCfgData = JSON.parse(data);
    jsonCfgData.forEach(json => {
        var baseStr = "   Id:%s      备注:%s  ";
        console.log(util.format(baseStr, json.Id, json.Remark));
    });
    console.log();
    console.log("==============================================")
    console.log();
    readSyncByRl('请输入要选择的Id:').then((res) => {
        var id = parseInt(res);
        var url = jsonCfgData[id].Url;
        var isTikTok = jsonCfgData[id].IsTiktok;
        if (isTikTok) {
            tiktok.Start(url);
        } else {
            douyin.Start(url);
        }
    });
});
function readSyncByRl(tips) {
    tips = tips || '> ';
    return new Promise((resolve) => {
        const rl = readline.createInterface({
            input: process.stdin,
            output: process.stdout
        });
        rl.question(tips, (answer) => {
            rl.close();
            resolve(answer.trim());
        });
    });
}

# 打包 exe 文件

# 直接打包 js 文件

1. 全局安装 pkg

npm i -g pkg

2. 设置入口文件并打包

pkg -t win ./xxx.js

-t 打包平台
-o 输出路径

注意:如果pkg被系统禁止运行,管理员身份打开shell并执行以下代码

set-ExecutionPolicy RemoteSigned
>Y

# 配置打包 json

生成 package.json 配置

{
    "name": "danmaku",
    "bin": "Authorization/main.js",
    "pkg": {
        "scripts": [
            "Authorization/douyin/start.js",
            "Authorization/bilibili/start.js",
            "Authorization/kuaishou/start.js",
            "Authorization/douyu/start.js"
        ],
        "targets": [
            "node14-win"
        ],
        "outputPath":"output"
    }
}

name 包名
bin 入口文件
scripts 无法自动引用打到包体中的脚本
assets 资源路径
targets 打包平台
outputPath 输出路径

# protobuff 使用

使用 protobufjs 模块

npm install protobufjs --save

# 加载本地 proto

const protobuf = require('protobufjs');
var protoRoot;
 protobuf.load("xxx.proto", (err, root) => {
        if (err)
            throw err;
            
        protoRoot = root;
 });

# 解码

var protoHandle = protoRoot.lookupType("packageName.messageName");
var msg = protoHandle.decode(buffer);
var obj = protoHandle.toObject(msg);

packageName 为要解析的 proto 包名
messageName 为要解析为的类名
buffer 二进制数组

# 编码

var a={xxx:xxx};
var msg = protoHandle.create(a);
var buffer = protoHandle.encode(msg).finish();

# 调用 windows 的 alert 窗口

添加批处理文件

mshta javascript:alert^("%~1"^);close^(^);

利用 child_process 调用 bat

var child_process = require("child_process");
function alert(txt) {
    var args = [];
    args.push(txt);
    child_process.execFile("alert.bat", args, { cwd: __dirname });
}
alert("哈哈哈");

# puppeteer 使用

--> 官方文档

const puppeteer = require('puppeteer-extra');
    const stealthPlugin = require('puppeteer-extra-plugin-stealth');
    puppeteer.launch({
                // 不打开浏览器窗口
                headless: true,
                // 忽略 https 错误信息
                ignoreHTTPSErrors: true,
            }).then(async bs => {
                this.browser = bs;
                // 打开一个新的页面
                let page = await this.browser.newPage();
                // 创建 CDP 对象
                const client = await page.target().createCDPSession();
                // 打开网络跟踪,允许网络事件通知到浏览器
                await client.send('Network.enable');
                // 打开一个 url,等待时长为无限
                await page.goto(url, {
                    timeout: 0
                });
                // 不设置缓存
                await page.setCacheEnabled(false);
                //response 消息监听
                page.on('response', rep => this.onLogResponse.call(this, rep));
                //websocet 数据包监听
                client.on('Network.webSocketFrameReceived', msg => this.onWebsocketFrameReceived.call(this, msg));
                
                page.on('close', this.onClosePage);
                page.on('error', this.onErrorPage);
            });

# 进制转换

# 10 进制转换为 N 个字节的 16 进制

var a = 2378;
    var lenArr = [a>>8*(n-1)&0xFF,a>>8*(n-2)&0xFF,...,a&0xFF]
更新于 阅读次数

请我喝[茶]~( ̄▽ ̄)~*

汘帆 微信

微信

汘帆 支付宝

支付宝