# 下载
点击 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
# 使用案例
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) => { |
| |
| 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
2. 设置入口文件并打包
-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, |
| |
| ignoreHTTPSErrors: true, |
| }).then(async bs => { |
| this.browser = bs; |
| |
| let page = await this.browser.newPage(); |
| |
| const client = await page.target().createCDPSession(); |
| |
| await client.send('Network.enable'); |
| |
| await page.goto(url, { |
| timeout: 0 |
| }); |
| |
| await page.setCacheEnabled(false); |
| |
| page.on('response', rep => this.onLogResponse.call(this, rep)); |
| |
| 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] |