mirror of
https://github.com/qaiu/netdisk-fast-download.git
synced 2026-08-27 03:52:02 +00:00
85 lines
2.5 KiB
Java
85 lines
2.5 KiB
Java
package cn.qaiu.util;
|
|
|
|
import org.apache.commons.lang3.StringUtils;
|
|
|
|
import java.util.HashMap;
|
|
import java.util.Map;
|
|
|
|
/**
|
|
* 123分享链接子域工具:将分享 key 的前半段解码为数字 uid。
|
|
*/
|
|
public final class YeShareHostUtil {
|
|
|
|
private static final String CODE62 = "Tvd3hHA9QEkom14xpfaBJIMwgFYGPXn2sWCNORDr80KuUSl7bZcetizL5q6yVj";
|
|
private static final long MAX_SAFE_INTEGER = 9007199254740991L;
|
|
private static final Map<Character, Integer> DECODE_MAP = new HashMap<>();
|
|
|
|
static {
|
|
for (int i = 0; i < CODE62.length(); i++) {
|
|
DECODE_MAP.put(CODE62.charAt(i), i);
|
|
}
|
|
}
|
|
|
|
private YeShareHostUtil() {
|
|
}
|
|
|
|
public static String getNumericSubdomainIdByShareKey(String shareKey) {
|
|
String normalized = normalizeShareKey(shareKey);
|
|
if (StringUtils.isBlank(normalized)) {
|
|
return "";
|
|
}
|
|
int split = normalized.indexOf('-');
|
|
if (split <= 0) {
|
|
return "";
|
|
}
|
|
String encodedUid = normalized.substring(0, split);
|
|
Long uid = decodeBase62LittleEndian(encodedUid);
|
|
return uid == null ? "" : String.valueOf(uid);
|
|
}
|
|
|
|
public static String normalizeShareKey(String shareKey) {
|
|
if (StringUtils.isBlank(shareKey)) {
|
|
return "";
|
|
}
|
|
String key = shareKey.trim();
|
|
int queryIndex = key.indexOf('?');
|
|
if (queryIndex >= 0) {
|
|
key = key.substring(0, queryIndex);
|
|
}
|
|
int slashIndex = key.lastIndexOf('/');
|
|
if (slashIndex >= 0 && slashIndex < key.length() - 1) {
|
|
key = key.substring(slashIndex + 1);
|
|
}
|
|
if (key.endsWith(".html")) {
|
|
key = key.substring(0, key.length() - 5);
|
|
}
|
|
return key;
|
|
}
|
|
|
|
private static Long decodeBase62LittleEndian(String value) {
|
|
if (StringUtils.isBlank(value)) {
|
|
return null;
|
|
}
|
|
long result = 0L;
|
|
for (int i = 0; i < value.length(); i++) {
|
|
Integer digit = DECODE_MAP.get(value.charAt(i));
|
|
if (digit == null) {
|
|
return null;
|
|
}
|
|
double weighted = digit * Math.pow(62, i);
|
|
if (!Double.isFinite(weighted)) {
|
|
return null;
|
|
}
|
|
long next = result + (long) weighted;
|
|
if (next <= 0 || next > MAX_SAFE_INTEGER) {
|
|
return null;
|
|
}
|
|
result = next;
|
|
}
|
|
if (result <= 0) {
|
|
return null;
|
|
}
|
|
return result;
|
|
}
|
|
}
|