mirror of
https://github.com/qaiu/netdisk-fast-download.git
synced 2026-05-28 09:17:27 +00:00
版本更新至0.1.7,启用h2db,添加统计功能,框架优化
This commit is contained in:
289
parser/src/main/java/cn/qaiu/util/AESUtils.java
Normal file
289
parser/src/main/java/cn/qaiu/util/AESUtils.java
Normal file
@@ -0,0 +1,289 @@
|
||||
package cn.qaiu.util;
|
||||
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
|
||||
import javax.crypto.*;
|
||||
import javax.crypto.spec.SecretKeySpec;
|
||||
import java.math.BigInteger;
|
||||
import java.nio.charset.StandardCharsets;
|
||||
import java.security.InvalidKeyException;
|
||||
import java.security.Key;
|
||||
import java.security.MessageDigest;
|
||||
import java.security.NoSuchAlgorithmException;
|
||||
import java.util.Base64;
|
||||
import java.util.Date;
|
||||
import java.util.HexFormat;
|
||||
import java.util.Random;
|
||||
|
||||
/**
|
||||
* AES加解密工具类
|
||||
*
|
||||
* @author qaiu
|
||||
**/
|
||||
public class AESUtils {
|
||||
|
||||
/**
|
||||
* AES密钥标识
|
||||
*/
|
||||
public static final String SIGN_AES = "AES";
|
||||
|
||||
/**
|
||||
* 密码器AES模式
|
||||
*/
|
||||
public static final String CIPHER_AES = "AES/ECB/PKCS5Padding";
|
||||
|
||||
public static final String CIPHER_AES2 = "YbQHZqK/PdQql2+7ATcPQHREAxt0Hn0Ob9v317QirZM=";
|
||||
|
||||
public static final String CIPHER_AES0;
|
||||
|
||||
/**
|
||||
* 秘钥长度
|
||||
*/
|
||||
public static final int KEY_LENGTH = 16;
|
||||
|
||||
/**
|
||||
* 密钥长度128
|
||||
*/
|
||||
public static final int KEY_SIZE_128_LENGTH = 128;
|
||||
|
||||
/**
|
||||
* 密钥长度192
|
||||
*/
|
||||
public static final int KEY_SIZE_192_LENGTH = 192;
|
||||
|
||||
/**
|
||||
* 密钥长度256
|
||||
*/
|
||||
public static final int KEY_SIZE_256_LENGTH = 256;
|
||||
|
||||
static {
|
||||
try {
|
||||
CIPHER_AES0 = decryptByBase64AES(CIPHER_AES2, CIPHER_AES);
|
||||
} catch (IllegalBlockSizeException | BadPaddingException | NoSuchPaddingException | NoSuchAlgorithmException |
|
||||
InvalidKeyException e) {
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 随机生成密钥,请使用合适的长度128 192 256
|
||||
*/
|
||||
public static Key createKeyString(int keySize) throws NoSuchAlgorithmException {
|
||||
KeyGenerator keyGenerator = KeyGenerator.getInstance(SIGN_AES);
|
||||
keyGenerator.init(keySize);
|
||||
SecretKey secretKey = keyGenerator.generateKey();
|
||||
return new SecretKeySpec(secretKey.getEncoded(), SIGN_AES);
|
||||
}
|
||||
|
||||
/**
|
||||
* 生成Key对象
|
||||
*/
|
||||
public static Key generateKey(String keyString) {
|
||||
if (keyString.length() > KEY_LENGTH) {
|
||||
keyString = keyString.substring(0, KEY_LENGTH);
|
||||
} else if (keyString.length() < KEY_LENGTH) {
|
||||
keyString = StringUtils.rightPad(keyString, 16, 'L');
|
||||
}
|
||||
return new SecretKeySpec(keyString.getBytes(), SIGN_AES);
|
||||
}
|
||||
|
||||
/**
|
||||
* AES加密
|
||||
*
|
||||
* @param source 原文
|
||||
* @param keyString 秘钥
|
||||
* @return byte arrays
|
||||
*/
|
||||
public static byte[] encryptByAES(String source, String keyString) throws NoSuchPaddingException,
|
||||
NoSuchAlgorithmException, InvalidKeyException, IllegalBlockSizeException, BadPaddingException {
|
||||
Cipher cipher = Cipher.getInstance(CIPHER_AES);
|
||||
cipher.init(Cipher.ENCRYPT_MODE, generateKey(keyString));
|
||||
return cipher.doFinal(source.getBytes(StandardCharsets.UTF_8));
|
||||
}
|
||||
|
||||
public static byte[] encryptByAES(String source, Key key) throws NoSuchPaddingException,
|
||||
NoSuchAlgorithmException, InvalidKeyException, IllegalBlockSizeException, BadPaddingException {
|
||||
Cipher cipher = Cipher.getInstance(CIPHER_AES);
|
||||
cipher.init(Cipher.ENCRYPT_MODE, key);
|
||||
return cipher.doFinal(source.getBytes(StandardCharsets.UTF_8));
|
||||
}
|
||||
|
||||
/**
|
||||
* AES加密Base64
|
||||
*
|
||||
* @param source 原文
|
||||
* @param keyString 秘钥
|
||||
* @return BASE64
|
||||
*/
|
||||
public static String encryptBase64ByAES(String source, String keyString) throws NoSuchPaddingException,
|
||||
NoSuchAlgorithmException, InvalidKeyException, IllegalBlockSizeException, BadPaddingException {
|
||||
byte[] encrypted = encryptByAES(source, keyString);
|
||||
return Base64.getEncoder().encodeToString(encrypted);
|
||||
}
|
||||
|
||||
public static String encryptBase64ByAES(String source, Key key) throws NoSuchPaddingException,
|
||||
NoSuchAlgorithmException, InvalidKeyException, IllegalBlockSizeException, BadPaddingException {
|
||||
byte[] encrypted = encryptByAES(source, key);
|
||||
return Base64.getEncoder().encodeToString(encrypted);
|
||||
}
|
||||
|
||||
/**
|
||||
* AES加密Hex
|
||||
*
|
||||
* @param source 原文
|
||||
* @param keyString 秘钥
|
||||
*/
|
||||
public static String encryptHexByAES(String source, String keyString) throws NoSuchPaddingException,
|
||||
NoSuchAlgorithmException, InvalidKeyException, IllegalBlockSizeException, BadPaddingException {
|
||||
byte[] encrypted = encryptByAES(source, keyString);
|
||||
return HexFormat.of().formatHex(encrypted);
|
||||
}
|
||||
|
||||
public static String encryptHexByAES(String source, Key key) throws NoSuchPaddingException,
|
||||
NoSuchAlgorithmException, InvalidKeyException, IllegalBlockSizeException, BadPaddingException {
|
||||
byte[] encrypted = encryptByAES(source, key);
|
||||
return HexFormat.of().formatHex(encrypted);
|
||||
}
|
||||
|
||||
public static String encrypt2Hex(String source) {
|
||||
try {
|
||||
return encryptHexByAES(source, CIPHER_AES0);
|
||||
} catch (NoSuchPaddingException | NoSuchAlgorithmException | InvalidKeyException | IllegalBlockSizeException |
|
||||
BadPaddingException e) {
|
||||
throw new RuntimeException("加密失败: "+ e.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* AES解密
|
||||
*
|
||||
* @param encrypted 密文 byte
|
||||
* @param keyString 秘钥
|
||||
*/
|
||||
public static String decryptByAES(byte[] encrypted, String keyString) throws IllegalBlockSizeException,
|
||||
BadPaddingException, InvalidKeyException, NoSuchPaddingException, NoSuchAlgorithmException {
|
||||
return decryptByAES(encrypted, generateKey(keyString));
|
||||
}
|
||||
|
||||
public static String decryptByAES(byte[] encrypted, Key key) throws IllegalBlockSizeException,
|
||||
BadPaddingException, InvalidKeyException, NoSuchPaddingException, NoSuchAlgorithmException {
|
||||
Cipher cipher = Cipher.getInstance(CIPHER_AES);
|
||||
cipher.init(Cipher.DECRYPT_MODE, key);
|
||||
byte[] decrypted = cipher.doFinal(encrypted);
|
||||
return new String(decrypted, StandardCharsets.UTF_8);
|
||||
}
|
||||
|
||||
/**
|
||||
* AES解密
|
||||
*
|
||||
* @param encrypted 密文 Hex
|
||||
* @param keyString 秘钥
|
||||
*/
|
||||
public static String decryptByHexAES(String encrypted, String keyString) throws IllegalBlockSizeException,
|
||||
BadPaddingException, InvalidKeyException, NoSuchPaddingException, NoSuchAlgorithmException {
|
||||
return decryptByAES(HexFormat.of().parseHex(encrypted), keyString);
|
||||
}
|
||||
|
||||
public static String decryptByHexAES(String encrypted, Key key) throws IllegalBlockSizeException,
|
||||
BadPaddingException, InvalidKeyException, NoSuchPaddingException, NoSuchAlgorithmException {
|
||||
return decryptByAES(HexFormat.of().parseHex(encrypted), key);
|
||||
}
|
||||
|
||||
/**
|
||||
* AES解密
|
||||
*
|
||||
* @param encrypted 密文 Base64
|
||||
* @param keyString 秘钥
|
||||
*/
|
||||
public static String decryptByBase64AES(String encrypted, String keyString) throws IllegalBlockSizeException,
|
||||
BadPaddingException, InvalidKeyException, NoSuchPaddingException, NoSuchAlgorithmException {
|
||||
return decryptByAES(Base64.getDecoder().decode(encrypted), keyString);
|
||||
}
|
||||
|
||||
public static String decryptByBase64AES(String encrypted, Key key) throws IllegalBlockSizeException,
|
||||
BadPaddingException, InvalidKeyException, NoSuchPaddingException, NoSuchAlgorithmException {
|
||||
return decryptByAES(Base64.getDecoder().decode(encrypted), key);
|
||||
}
|
||||
|
||||
// ================================飞机盘Id解密========================================== //
|
||||
private static final char[] array = {
|
||||
'T', 'U', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H',
|
||||
'0', 'M', 'N', 'O', 'P', 'X', 'Y', 'Z', 'V', 'W',
|
||||
'Q', '1', '2', '3', '4', 'a', 'b', 'c', 'd', 'e',
|
||||
'5', '6', '7', '8', '9', 'v', 'w', 'x', 'y', 'z',
|
||||
'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o',
|
||||
'p', 'q', 'r', 's', 't', 'u', 'L', 'R', 'S', 'I',
|
||||
'J', 'K'};
|
||||
|
||||
private static int decodeChar(char c) {
|
||||
for (int i = 0; i < array.length; i++) {
|
||||
if (c == array[i]) {
|
||||
return i;
|
||||
}
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
// id解密
|
||||
public static int idEncrypt(String str) {
|
||||
// 倍数
|
||||
int multiple = 1;
|
||||
int result = 0;
|
||||
if (StringUtils.isNotEmpty(str) && str.length() > 4) {
|
||||
str = str.substring(2, str.length() - 2);
|
||||
char c;
|
||||
for (int i = 0; i < str.length(); i++) {
|
||||
c = str.charAt(str.length() - i - 1);
|
||||
result += decodeChar(c) * multiple;
|
||||
multiple = multiple * 62;
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
// ========================== musetransfer加密相关 ===========================
|
||||
|
||||
//length用户要求产生字符串的长度
|
||||
public static String getRandomString(int length){
|
||||
String str="abcdefghijklmnopqrstuvwxyz0123456789";
|
||||
Random random=new Random();
|
||||
StringBuilder sb=new StringBuilder();
|
||||
for(int i=0;i<length;i++){
|
||||
int number=random.nextInt(36);
|
||||
sb.append(str.charAt(number));
|
||||
}
|
||||
return sb.toString();
|
||||
}
|
||||
|
||||
public static String getRandomString(){
|
||||
return getRandomString(10);
|
||||
}
|
||||
|
||||
|
||||
//=============================== 123pan加密相关 ===============================
|
||||
|
||||
public static String getMD5Str(String str) {
|
||||
byte[] digest;
|
||||
try {
|
||||
MessageDigest md5 = MessageDigest.getInstance("md5");
|
||||
digest = md5.digest(str.getBytes(StandardCharsets.UTF_8));
|
||||
} catch (NoSuchAlgorithmException e) {
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
//16是表示转换为16进制数
|
||||
return new BigInteger(1, digest).toString(16);
|
||||
}
|
||||
|
||||
public static String getAuthKey(String _0x2207af) {
|
||||
String _0x467baa = "web";
|
||||
int _0x4965f1 = 3;
|
||||
|
||||
String _0x430930 = String.valueOf(Math.round(0x989680 * Math.random()));
|
||||
String _0x53928f = String.valueOf(new Date().getTime() / 0x3e8);
|
||||
String _0x49ec94 = getMD5Str(_0x53928f + "|" + _0x430930 + "|" + _0x2207af + "|" + _0x467baa + "|" + _0x4965f1
|
||||
+ "|8-8D$sL8gPjom7bk#cY");
|
||||
|
||||
return _0x53928f + "-" + _0x430930 + "-" + _0x49ec94;
|
||||
}
|
||||
|
||||
}
|
||||
20
parser/src/main/java/cn/qaiu/util/ArrayUtil.java
Normal file
20
parser/src/main/java/cn/qaiu/util/ArrayUtil.java
Normal file
@@ -0,0 +1,20 @@
|
||||
package cn.qaiu.util;
|
||||
|
||||
public class ArrayUtil {
|
||||
|
||||
public static int[] parseIntArray(String[] arr) {
|
||||
int[] ints = new int[arr.length];
|
||||
for (int i = 0; i < ints.length; i++) {
|
||||
ints[i] = Integer.parseInt(arr[i]);
|
||||
}
|
||||
return ints;
|
||||
}
|
||||
|
||||
public static float[] parseFloatArray(String[] arr) {
|
||||
float[] ints = new float[arr.length];
|
||||
for (int i = 0; i < ints.length; i++) {
|
||||
ints[i] = Float.parseFloat(arr[i]);
|
||||
}
|
||||
return ints;
|
||||
}
|
||||
}
|
||||
41
parser/src/main/java/cn/qaiu/util/CommonUtils.java
Normal file
41
parser/src/main/java/cn/qaiu/util/CommonUtils.java
Normal file
@@ -0,0 +1,41 @@
|
||||
package cn.qaiu.util;
|
||||
|
||||
import java.net.MalformedURLException;
|
||||
import java.net.URL;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
public class CommonUtils {
|
||||
|
||||
public static String adaptShortPaths(String urlPrefix, String url) {
|
||||
if (url.endsWith(".html")) {
|
||||
url = url.substring(0, url.length() - 5);
|
||||
}
|
||||
String prefix = "https://";
|
||||
if (!url.startsWith(urlPrefix) && url.startsWith(prefix)) {
|
||||
urlPrefix = urlPrefix.substring(prefix.length());
|
||||
return url.substring(url.indexOf(urlPrefix) + urlPrefix.length());
|
||||
} else if (!url.startsWith(urlPrefix)) {
|
||||
url = urlPrefix + url;
|
||||
}
|
||||
return url.substring(urlPrefix.length());
|
||||
}
|
||||
|
||||
public static Map<String, String> getURLParams(String url) throws MalformedURLException {
|
||||
URL fullUrl = new URL(url);
|
||||
String query = fullUrl.getQuery();
|
||||
String[] params = query.split("&");
|
||||
Map<String, String> map = new HashMap<>();
|
||||
for (String param : params) {
|
||||
if (!param.contains("=")) {
|
||||
throw new RuntimeException("解析URL异常: 匹配不到参数中的=");
|
||||
}
|
||||
int endIndex = param.indexOf('=');
|
||||
String key = param.substring(0, endIndex);
|
||||
String value = param.substring(endIndex + 1);
|
||||
map.put(key, value);
|
||||
}
|
||||
return map;
|
||||
}
|
||||
|
||||
}
|
||||
89
parser/src/main/java/cn/qaiu/util/JsExecUtils.java
Normal file
89
parser/src/main/java/cn/qaiu/util/JsExecUtils.java
Normal file
@@ -0,0 +1,89 @@
|
||||
package cn.qaiu.util;
|
||||
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
import org.openjdk.nashorn.api.scripting.ScriptObjectMirror;
|
||||
|
||||
import javax.script.Invocable;
|
||||
import javax.script.ScriptEngine;
|
||||
import javax.script.ScriptEngineManager;
|
||||
import javax.script.ScriptException;
|
||||
import java.io.FileReader;
|
||||
import java.io.IOException;
|
||||
import java.net.URL;
|
||||
import java.nio.file.Files;
|
||||
import java.nio.file.Path;
|
||||
import java.nio.file.Paths;
|
||||
|
||||
/**
|
||||
* 执行Js脚本
|
||||
*
|
||||
* @author <a href="https://qaiu.top">QAIU</a>
|
||||
* @date 2023/7/29 17:35
|
||||
*/
|
||||
public class JsExecUtils {
|
||||
private static final String JS_PATH = "js/ye123.js";
|
||||
private static final String LZ_JS_PATH = "js/lz.js";
|
||||
|
||||
private static final String RES_PATH;
|
||||
private static final Invocable inv;
|
||||
|
||||
// 初始化脚本引擎
|
||||
static {
|
||||
ScriptEngineManager engineManager = new ScriptEngineManager();
|
||||
ScriptEngine engine = engineManager.getEngineByName("JavaScript"); // 得到脚本引擎
|
||||
//获取文件所在的相对路径
|
||||
URL resource = JsExecUtils.class.getResource("/");
|
||||
if (resource == null) {
|
||||
throw new RuntimeException("js resource path is null");
|
||||
}
|
||||
RES_PATH = resource.getPath();
|
||||
String reader = RES_PATH + JS_PATH;
|
||||
try (FileReader fReader = new FileReader(reader)) {
|
||||
engine.eval(fReader);
|
||||
fReader.close();
|
||||
inv = (Invocable) engine;
|
||||
} catch (IOException | ScriptException e) {
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 调用js文件
|
||||
*/
|
||||
public static ScriptObjectMirror executeJs(String functionName, Object... args) throws ScriptException,
|
||||
NoSuchMethodException {
|
||||
//调用js中的函数
|
||||
return (ScriptObjectMirror) inv.invokeFunction(functionName, args);
|
||||
}
|
||||
|
||||
/**
|
||||
* 调用执行蓝奏云js文件
|
||||
*/
|
||||
public static ScriptObjectMirror executeDynamicJs(String jsText, String funName) throws ScriptException,
|
||||
NoSuchMethodException {
|
||||
ScriptEngineManager engineManager = new ScriptEngineManager();
|
||||
ScriptEngine engine = engineManager.getEngineByName("JavaScript"); // 得到脚本引擎
|
||||
try {
|
||||
//获取文件所在的相对路径
|
||||
Path path;
|
||||
try {
|
||||
path = Paths.get(RES_PATH + LZ_JS_PATH);
|
||||
} catch (RuntimeException ioe) {
|
||||
path = Paths.get(RES_PATH.substring(1) + LZ_JS_PATH);
|
||||
}
|
||||
String jsContent = Files.readString(path) + "\n" + jsText;
|
||||
engine.eval(jsContent);
|
||||
Invocable inv = (Invocable) engine;
|
||||
//调用js中的函数
|
||||
if (StringUtils.isNotEmpty(funName)) {
|
||||
inv.invokeFunction(funName);
|
||||
}
|
||||
} catch (IOException e) {
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
|
||||
return (ScriptObjectMirror) engine.get("signObj");
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
12
parser/src/main/java/cn/qaiu/util/PanExceptionUtils.java
Normal file
12
parser/src/main/java/cn/qaiu/util/PanExceptionUtils.java
Normal file
@@ -0,0 +1,12 @@
|
||||
package cn.qaiu.util;
|
||||
|
||||
/**
|
||||
* @author <a href="https://qaiu.top">QAIU</a>
|
||||
* @date 2023/7/16 1:53
|
||||
*/
|
||||
public class PanExceptionUtils {
|
||||
|
||||
public static RuntimeException fillRunTimeException(String name, String dataKey, Throwable t) {
|
||||
return new RuntimeException(name + ": 请求异常: key = " + dataKey, t.fillInStackTrace());
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user