koishi-plugin-hg-sign 1.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/assets/apps/arknights.png +0 -0
- package/assets/apps/endfield.png +0 -0
- package/assets/apps/skland.png +0 -0
- package/assets/endfield_home.html +56 -0
- package/assets/style.css +1 -0
- package/assets/style2.css +1 -0
- package/assets/style3.css +2 -0
- package/assets/style4.css +1 -0
- package/lib/card.d.ts +28 -0
- package/lib/card.js +1122 -0
- package/lib/card.js.map +1 -0
- package/lib/hypergryph.d.ts +27 -0
- package/lib/hypergryph.js +105 -0
- package/lib/hypergryph.js.map +1 -0
- package/lib/index.d.ts +18 -0
- package/lib/index.js +210 -0
- package/lib/index.js.map +1 -0
- package/lib/security.d.ts +2 -0
- package/lib/security.js +229 -0
- package/lib/security.js.map +1 -0
- package/lib/skland.d.ts +52 -0
- package/lib/skland.js +271 -0
- package/lib/skland.js.map +1 -0
- package/package.json +33 -0
- package/readme.md +5 -0
package/lib/card.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"card.js","sourceRoot":"","sources":["../src/card.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { Context } from 'koishi';
|
|
2
|
+
export interface HypergryphConfig {
|
|
3
|
+
asBaseUrl?: string;
|
|
4
|
+
webApiBaseUrl?: string;
|
|
5
|
+
bindingApiBaseUrl?: string;
|
|
6
|
+
sklandApiBaseUrl?: string;
|
|
7
|
+
appCodes?: {
|
|
8
|
+
userCenter: string;
|
|
9
|
+
skland: string;
|
|
10
|
+
};
|
|
11
|
+
}
|
|
12
|
+
export declare const DEFAULT_CONFIG: HypergryphConfig;
|
|
13
|
+
export declare class HypergryphClient {
|
|
14
|
+
private http;
|
|
15
|
+
private config;
|
|
16
|
+
private asClient;
|
|
17
|
+
private bindingClient;
|
|
18
|
+
constructor(http: Context['http'], config: HypergryphConfig);
|
|
19
|
+
genScanLogin(): Promise<any>;
|
|
20
|
+
getScanStatus(scanId: string): Promise<{
|
|
21
|
+
status: any;
|
|
22
|
+
msg: any;
|
|
23
|
+
scanCode: any;
|
|
24
|
+
}>;
|
|
25
|
+
tokenByScanCode(scanCode: string): Promise<any>;
|
|
26
|
+
waitForScanConfirm(scanId: string, onStatusChange?: (status: any) => void | Promise<void>): Promise<any>;
|
|
27
|
+
}
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
export const DEFAULT_CONFIG = {
|
|
2
|
+
asBaseUrl: 'https://as.hypergryph.com',
|
|
3
|
+
webApiBaseUrl: 'https://web-api.hypergryph.com',
|
|
4
|
+
bindingApiBaseUrl: 'https://binding-api-account-prod.hypergryph.com',
|
|
5
|
+
sklandApiBaseUrl: 'https://zonai.skland.com',
|
|
6
|
+
appCodes: {
|
|
7
|
+
userCenter: 'be36d44aa36bfb5b',
|
|
8
|
+
skland: '4ca99fa6b56cc2ba',
|
|
9
|
+
},
|
|
10
|
+
};
|
|
11
|
+
export class HypergryphClient {
|
|
12
|
+
http;
|
|
13
|
+
config;
|
|
14
|
+
asClient;
|
|
15
|
+
bindingClient;
|
|
16
|
+
constructor(http, config) {
|
|
17
|
+
this.http = http;
|
|
18
|
+
this.config = config;
|
|
19
|
+
this.asClient = this.http.extend({
|
|
20
|
+
baseURL: this.config.asBaseUrl,
|
|
21
|
+
timeout: 30000,
|
|
22
|
+
headers: {
|
|
23
|
+
'Content-Type': 'application/json',
|
|
24
|
+
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36',
|
|
25
|
+
'Origin': 'https://www.hypergryph.com',
|
|
26
|
+
'Referer': 'https://www.hypergryph.com/',
|
|
27
|
+
},
|
|
28
|
+
});
|
|
29
|
+
this.bindingClient = this.http.extend({
|
|
30
|
+
baseURL: this.config.bindingApiBaseUrl,
|
|
31
|
+
timeout: 30000,
|
|
32
|
+
headers: {
|
|
33
|
+
'Content-Type': 'application/json',
|
|
34
|
+
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36',
|
|
35
|
+
'Origin': 'https://user.hypergryph.com',
|
|
36
|
+
'Referer': 'https://user.hypergryph.com/',
|
|
37
|
+
},
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
async genScanLogin() {
|
|
41
|
+
try {
|
|
42
|
+
const response = await this.asClient.post('/general/v1/gen_scan/login', {});
|
|
43
|
+
if (response.status !== 0) {
|
|
44
|
+
throw new Error(`生成扫码失败: ${response.msg}`);
|
|
45
|
+
}
|
|
46
|
+
return response.data;
|
|
47
|
+
}
|
|
48
|
+
catch (error) {
|
|
49
|
+
console.error('[Hypergryph] 生成扫码登录失败:', error.message);
|
|
50
|
+
throw error;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
async getScanStatus(scanId) {
|
|
54
|
+
try {
|
|
55
|
+
const response = await this.asClient.get('/general/v1/scan_status', {
|
|
56
|
+
params: { scanId },
|
|
57
|
+
});
|
|
58
|
+
return {
|
|
59
|
+
status: response.status,
|
|
60
|
+
msg: response.msg,
|
|
61
|
+
scanCode: response.data?.scanCode,
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
catch (error) {
|
|
65
|
+
console.error('[Hypergryph] 查询扫码状态失败:', error.message);
|
|
66
|
+
throw error;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
async tokenByScanCode(scanCode) {
|
|
70
|
+
try {
|
|
71
|
+
const response = await this.asClient.post('/user/auth/v1/token_by_scan_code', {
|
|
72
|
+
scanCode,
|
|
73
|
+
});
|
|
74
|
+
if (response.status !== 0) {
|
|
75
|
+
throw new Error(`获取 Token 失败: ${response.msg}`);
|
|
76
|
+
}
|
|
77
|
+
return response.data;
|
|
78
|
+
}
|
|
79
|
+
catch (error) {
|
|
80
|
+
console.error('[Hypergryph] 获取 Token 失败:', error.message);
|
|
81
|
+
throw error;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
async waitForScanConfirm(scanId, onStatusChange) {
|
|
85
|
+
const startTime = Date.now();
|
|
86
|
+
const pollInterval = 2000;
|
|
87
|
+
const timeout = 120000;
|
|
88
|
+
let lastStatus = -1;
|
|
89
|
+
while (Date.now() - startTime < timeout) {
|
|
90
|
+
const result = await this.getScanStatus(scanId);
|
|
91
|
+
if (result.status !== lastStatus) {
|
|
92
|
+
lastStatus = result.status;
|
|
93
|
+
if (onStatusChange) {
|
|
94
|
+
await onStatusChange(result);
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
if (result.status === 0 && result.scanCode) {
|
|
98
|
+
return this.tokenByScanCode(result.scanCode);
|
|
99
|
+
}
|
|
100
|
+
await new Promise(resolve => setTimeout(resolve, pollInterval));
|
|
101
|
+
}
|
|
102
|
+
throw new Error('扫码超时');
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
//# sourceMappingURL=hypergryph.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hypergryph.js","sourceRoot":"","sources":["../src/hypergryph.ts"],"names":[],"mappings":"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"}
|
package/lib/index.d.ts
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { Context, Schema } from 'koishi';
|
|
2
|
+
export declare const name = "hg-sign";
|
|
3
|
+
declare module 'koishi' {
|
|
4
|
+
interface User {
|
|
5
|
+
hg_id: string;
|
|
6
|
+
skland_cred: string;
|
|
7
|
+
skland_token: string;
|
|
8
|
+
skland_uid: string;
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
export interface Config {
|
|
12
|
+
autoSign: boolean;
|
|
13
|
+
}
|
|
14
|
+
export declare const Config: Schema<Config>;
|
|
15
|
+
export declare const inject: {
|
|
16
|
+
required: string[];
|
|
17
|
+
};
|
|
18
|
+
export declare function apply(ctx: Context, config: Config): void;
|
package/lib/index.js
ADDED
|
@@ -0,0 +1,210 @@
|
|
|
1
|
+
import { Schema, h } from 'koishi';
|
|
2
|
+
import { HypergryphClient, DEFAULT_CONFIG as HG_DEFAULT_CONFIG } from './hypergryph';
|
|
3
|
+
import { SklandClient } from './skland';
|
|
4
|
+
import { CardGenerator } from './card';
|
|
5
|
+
import * as QRCode from 'qrcode';
|
|
6
|
+
export const name = 'hg-sign';
|
|
7
|
+
export const Config = Schema.object({
|
|
8
|
+
autoSign: Schema.boolean().default(true).description('是否开启自动签到 (每天凌晨0点)'),
|
|
9
|
+
});
|
|
10
|
+
export const inject = {
|
|
11
|
+
required: ['database', 'puppeteer'],
|
|
12
|
+
};
|
|
13
|
+
export function apply(ctx, config) {
|
|
14
|
+
// Extending the database model
|
|
15
|
+
ctx.model.extend('user', {
|
|
16
|
+
hg_id: 'string',
|
|
17
|
+
skland_cred: 'string',
|
|
18
|
+
skland_token: 'string',
|
|
19
|
+
skland_uid: 'string',
|
|
20
|
+
});
|
|
21
|
+
// Initialize clients
|
|
22
|
+
const hgConfig = HG_DEFAULT_CONFIG;
|
|
23
|
+
const hgClient = new HypergryphClient(ctx.http, hgConfig);
|
|
24
|
+
const sklandClient = new SklandClient(ctx, hgConfig);
|
|
25
|
+
const cardGenerator = new CardGenerator(ctx);
|
|
26
|
+
// Initialize device ID
|
|
27
|
+
sklandClient.initDeviceId();
|
|
28
|
+
async function ensureAuth(session) {
|
|
29
|
+
const user = await session.observeUser(['id', 'skland_cred', 'skland_token', 'hg_id', 'skland_uid']);
|
|
30
|
+
if (!user.skland_cred || !user.skland_token) {
|
|
31
|
+
throw new Error('未绑定森空岛账号。请先使用 `hg.login` 进行登录绑定。');
|
|
32
|
+
}
|
|
33
|
+
let { skland_cred: cred, skland_token: token } = user;
|
|
34
|
+
// Check cred validity
|
|
35
|
+
const isValid = await sklandClient.checkCred(cred);
|
|
36
|
+
if (!isValid) {
|
|
37
|
+
// Try refresh
|
|
38
|
+
try {
|
|
39
|
+
session.send('凭证失效,正在尝试刷新...');
|
|
40
|
+
const newData = await sklandClient.refreshToken(cred, token);
|
|
41
|
+
user.skland_cred = newData.cred;
|
|
42
|
+
user.skland_token = newData.token;
|
|
43
|
+
await user.$update();
|
|
44
|
+
return { cred: newData.cred, token: newData.token, user, sklandUid: user.skland_uid };
|
|
45
|
+
}
|
|
46
|
+
catch (e) {
|
|
47
|
+
throw new Error('凭证刷新失败,请重新登录。');
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
return { cred, token, user, sklandUid: user.skland_uid || user.hg_id };
|
|
51
|
+
// note: skland_uid may not be stored from scan flow, fallback logic might be needed
|
|
52
|
+
}
|
|
53
|
+
// --- Commands ---
|
|
54
|
+
// 1. Login (Scan QR)
|
|
55
|
+
ctx.command('hg.login', '登录鹰角账号')
|
|
56
|
+
.action(async ({ session }) => {
|
|
57
|
+
try {
|
|
58
|
+
const { scanId, scanUrl } = await hgClient.genScanLogin();
|
|
59
|
+
// Generate QR Code image
|
|
60
|
+
const url = await QRCode.toDataURL(scanUrl);
|
|
61
|
+
const scanCard = await cardGenerator.generateLoginQRCard(url);
|
|
62
|
+
await session.send(h.image(scanCard, 'image/png'));
|
|
63
|
+
// Polling
|
|
64
|
+
const { token, hgId } = await hgClient.waitForScanConfirm(scanId, async (status) => {
|
|
65
|
+
if (status.status === 101) {
|
|
66
|
+
await session.send('已扫码,请在手机上确认登录...');
|
|
67
|
+
}
|
|
68
|
+
});
|
|
69
|
+
await session.send('扫码成功,正在获取凭证...');
|
|
70
|
+
const grantRes = await ctx.http.post('https://as.hypergryph.com/user/oauth2/v2/grant', {
|
|
71
|
+
appCode: hgConfig?.appCodes?.skland,
|
|
72
|
+
token: token,
|
|
73
|
+
type: 0
|
|
74
|
+
}, {
|
|
75
|
+
headers: { 'Content-Type': 'application/json' }
|
|
76
|
+
});
|
|
77
|
+
if (grantRes.status !== 0) {
|
|
78
|
+
return `授权失败: ${grantRes.msg}`;
|
|
79
|
+
}
|
|
80
|
+
const code = grantRes.data.code;
|
|
81
|
+
const credData = await sklandClient.getCredByCode(code);
|
|
82
|
+
// Save to DB
|
|
83
|
+
const user = await session.observeUser(['hg_id', 'skland_cred', 'skland_token', 'skland_uid']);
|
|
84
|
+
user.hg_id = hgId;
|
|
85
|
+
user.skland_cred = credData.cred;
|
|
86
|
+
user.skland_token = credData.token;
|
|
87
|
+
user.skland_uid = credData.userId;
|
|
88
|
+
await user.$update();
|
|
89
|
+
return '登录成功!已绑定森空岛账号。';
|
|
90
|
+
}
|
|
91
|
+
catch (e) {
|
|
92
|
+
ctx.logger('hg-sign').error(e);
|
|
93
|
+
return `登录出错: ${e.message}`;
|
|
94
|
+
}
|
|
95
|
+
});
|
|
96
|
+
// 2. Attendance
|
|
97
|
+
ctx.command('skland.sign', '森空岛签到')
|
|
98
|
+
.action(async ({ session }) => {
|
|
99
|
+
try {
|
|
100
|
+
const { cred, token } = await ensureAuth(session);
|
|
101
|
+
await session.send('正在获取绑定列表...');
|
|
102
|
+
const list = await sklandClient.getBindingList(cred, token);
|
|
103
|
+
const results = [];
|
|
104
|
+
for (const app of list) {
|
|
105
|
+
if (app.appCode === 'arknights') {
|
|
106
|
+
for (const char of app.bindingList) {
|
|
107
|
+
const res = await sklandClient.attendance(cred, token, char.uid, char.channelMasterId);
|
|
108
|
+
let awards = '';
|
|
109
|
+
if (res.data?.awards) {
|
|
110
|
+
awards = res.data.awards.map((a) => `${a.resource.name}x${a.count}`).join(', ');
|
|
111
|
+
}
|
|
112
|
+
results.push({
|
|
113
|
+
game: '明日方舟',
|
|
114
|
+
char: char.nickName,
|
|
115
|
+
status: res.message || (res.success ? '签到成功' : '失败'),
|
|
116
|
+
awards,
|
|
117
|
+
success: res.success || res.alreadySigned // Treat already signed as success for display
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
else if (app.appCode === 'endfield') {
|
|
122
|
+
for (const binding of app.bindingList) {
|
|
123
|
+
for (const role of binding.roles || []) {
|
|
124
|
+
const res = await sklandClient.attendanceEndfield(cred, token, role);
|
|
125
|
+
results.push({
|
|
126
|
+
game: '明日方舟:终末地',
|
|
127
|
+
char: role.nickName || role.nickname,
|
|
128
|
+
status: res.message || (res.success ? '签到成功' : '失败'),
|
|
129
|
+
awards: '', // Endfield usually doesn't return awards in same format yet or is simple
|
|
130
|
+
success: res.success || res.alreadySigned
|
|
131
|
+
});
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
if (results.length === 0)
|
|
137
|
+
return '未找到可签到的角色。';
|
|
138
|
+
const cardBuf = await cardGenerator.generateSignReportCard(results);
|
|
139
|
+
return h.image(cardBuf, 'image/png');
|
|
140
|
+
}
|
|
141
|
+
catch (e) {
|
|
142
|
+
return `签到失败: ${e.message}`;
|
|
143
|
+
}
|
|
144
|
+
});
|
|
145
|
+
// 4. Endfield Card
|
|
146
|
+
ctx.command('hg.endfield', '生成终末地名片')
|
|
147
|
+
.action(async ({ session }) => {
|
|
148
|
+
try {
|
|
149
|
+
const { cred, token, sklandUid } = await ensureAuth(session);
|
|
150
|
+
const list = await sklandClient.getBindingList(cred, token);
|
|
151
|
+
const endfieldApp = list.find((a) => a.appCode === 'endfield');
|
|
152
|
+
if (!endfieldApp || !endfieldApp.bindingList || endfieldApp.bindingList.length === 0) {
|
|
153
|
+
return '未找到终末地角色绑定信息。请先在森空岛APP中绑定角色。';
|
|
154
|
+
}
|
|
155
|
+
// 扁平化获取所有角色
|
|
156
|
+
// Structure: bindingList -> [ { uid, roles: [ { roleId, serverId, nickname, ... } ] } ]
|
|
157
|
+
// Note: Based on observed API responses, Endfield might follow similar structure or slightly different.
|
|
158
|
+
// We will try to find roles.
|
|
159
|
+
let targetRole = null;
|
|
160
|
+
// Strategy: Traverse and find the first valid role
|
|
161
|
+
for (const binding of endfieldApp.bindingList) {
|
|
162
|
+
if (binding.roles && binding.roles.length > 0) {
|
|
163
|
+
targetRole = binding.roles[0];
|
|
164
|
+
break;
|
|
165
|
+
}
|
|
166
|
+
// Fallback: sometimes binding itself might be the role if structure differs?
|
|
167
|
+
// But usually it's nested for newer games in Skland.
|
|
168
|
+
}
|
|
169
|
+
if (!targetRole) {
|
|
170
|
+
return '未找到有效的终末地角色信息。';
|
|
171
|
+
}
|
|
172
|
+
await session.send('正在获取终末地数据并生成卡片,请稍候...');
|
|
173
|
+
// Get Card Detail
|
|
174
|
+
// We need userId (sklandUid)
|
|
175
|
+
const data = await sklandClient.getEndfieldCardDetail(cred, token, targetRole.roleId, targetRole.serverId, sklandUid);
|
|
176
|
+
// Generate Image
|
|
177
|
+
const imgBuf = await cardGenerator.generateEndfieldCard(data);
|
|
178
|
+
return h.image(imgBuf, 'image/png');
|
|
179
|
+
}
|
|
180
|
+
catch (e) {
|
|
181
|
+
ctx.logger('hg-sign').error(e);
|
|
182
|
+
return `获取终末地名片失败: ${e.message}`;
|
|
183
|
+
}
|
|
184
|
+
});
|
|
185
|
+
// Auto Sign Task
|
|
186
|
+
if (config.autoSign) {
|
|
187
|
+
// Run check every hour
|
|
188
|
+
ctx.setInterval(async () => {
|
|
189
|
+
const now = new Date();
|
|
190
|
+
// Check if it's 8:00 AM (just an example time)
|
|
191
|
+
if (now.getHours() === 8) {
|
|
192
|
+
ctx.logger('hg-sign').info('开始自动签到...');
|
|
193
|
+
const users = await ctx.database.get('user', { skland_cred: { $exists: true } });
|
|
194
|
+
for (const user of users) {
|
|
195
|
+
if (!user.skland_cred)
|
|
196
|
+
continue;
|
|
197
|
+
try {
|
|
198
|
+
// TODO: Implement actual sign logic here reuse
|
|
199
|
+
// For now just log
|
|
200
|
+
ctx.logger('hg-sign').debug(`Processing user ${user.id}`);
|
|
201
|
+
}
|
|
202
|
+
catch (e) {
|
|
203
|
+
ctx.logger('hg-sign').warn(`用户 ${user.id} 自动签到失败: ${e.message}`);
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
}, 3600 * 1000);
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
//# sourceMappingURL=index.js.map
|
package/lib/index.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAW,MAAM,EAAW,CAAC,EAAE,MAAM,QAAQ,CAAA;AACpD,OAAO,EAAE,gBAAgB,EAAE,cAAc,IAAI,iBAAiB,EAAE,MAAM,cAAc,CAAA;AACpF,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAA;AACvC,OAAO,EAAE,aAAa,EAAE,MAAM,QAAQ,CAAA;AACtC,OAAO,KAAK,MAAM,MAAM,QAAQ,CAAA;AAEhC,MAAM,CAAC,MAAM,IAAI,GAAG,SAAS,CAAA;AAgB7B,MAAM,CAAC,MAAM,MAAM,GAAmB,MAAM,CAAC,MAAM,CAAC;IAClD,QAAQ,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,WAAW,CAAC,mBAAmB,CAAC;CAC1E,CAAC,CAAA;AAEF,MAAM,CAAC,MAAM,MAAM,GAAG;IACpB,QAAQ,EAAE,CAAC,UAAU,EAAE,WAAW,CAAC;CACpC,CAAA;AAED,MAAM,UAAU,KAAK,CAAC,GAAY,EAAE,MAAc;IAChD,+BAA+B;IAC/B,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE;QACvB,KAAK,EAAE,QAAQ;QACf,WAAW,EAAE,QAAQ;QACrB,YAAY,EAAE,QAAQ;QACtB,UAAU,EAAE,QAAQ;KACrB,CAAC,CAAA;IAEF,qBAAqB;IACrB,MAAM,QAAQ,GAAG,iBAAiB,CAAA;IAClC,MAAM,QAAQ,GAAG,IAAI,gBAAgB,CAAC,GAAG,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAA;IACzD,MAAM,YAAY,GAAG,IAAI,YAAY,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAA;IACpD,MAAM,aAAa,GAAG,IAAI,aAAa,CAAC,GAAG,CAAC,CAAA;IAE5C,uBAAuB;IACvB,YAAY,CAAC,YAAY,EAAE,CAAA;IAE3B,KAAK,UAAU,UAAU,CAAC,OAAgB;QACxC,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,WAAW,CAAC,CAAC,IAAI,EAAE,aAAa,EAAE,cAAc,EAAE,OAAO,EAAE,YAAY,CAAC,CAAC,CAAA;QAEpG,IAAI,CAAC,IAAI,CAAC,WAAW,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC;YAC3C,MAAM,IAAI,KAAK,CAAC,kCAAkC,CAAC,CAAA;QACtD,CAAC;QAED,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,YAAY,EAAE,KAAK,EAAE,GAAG,IAAI,CAAA;QAErD,sBAAsB;QACtB,MAAM,OAAO,GAAG,MAAM,YAAY,CAAC,SAAS,CAAC,IAAI,CAAC,CAAA;QAClD,IAAI,CAAC,OAAO,EAAE,CAAC;YACX,cAAc;YACd,IAAI,CAAC;gBACD,OAAO,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAA;gBAC9B,MAAM,OAAO,GAAG,MAAM,YAAY,CAAC,YAAY,CAAC,IAAI,EAAE,KAAK,CAAC,CAAA;gBAC5D,IAAI,CAAC,WAAW,GAAG,OAAO,CAAC,IAAI,CAAA;gBAC/B,IAAI,CAAC,YAAY,GAAG,OAAO,CAAC,KAAK,CAAA;gBACjC,MAAM,IAAI,CAAC,OAAO,EAAE,CAAA;gBACpB,OAAO,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,CAAC,UAAU,EAAE,CAAA;YACzF,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACT,MAAM,IAAI,KAAK,CAAC,eAAe,CAAC,CAAA;YACpC,CAAC;QACL,CAAC;QACD,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,KAAK,EAAE,CAAA;QACtE,oFAAoF;IACtF,CAAC;IAGD,mBAAmB;IAEnB,qBAAqB;IACrB,GAAG,CAAC,OAAO,CAAC,UAAU,EAAE,QAAQ,CAAC;SAC9B,MAAM,CAAC,KAAK,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE;QAC5B,IAAI,CAAC;YACH,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,QAAQ,CAAC,YAAY,EAAE,CAAA;YAEzD,yBAAyB;YACzB,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC,CAAA;YAC3C,MAAM,QAAQ,GAAG,MAAM,aAAa,CAAC,mBAAmB,CAAC,GAAG,CAAC,CAAC;YAC9D,MAAM,OAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC,CAAA;YAEnD,UAAU;YACV,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,MAAM,QAAQ,CAAC,kBAAkB,CAAC,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE;gBAC9E,IAAI,MAAM,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;oBACxB,MAAM,OAAQ,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAA;gBAC3C,CAAC;YACN,CAAC,CAAC,CAAA;YAEF,MAAM,OAAQ,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAA;YAErC,MAAM,QAAQ,GAAG,MAAM,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,gDAAgD,EAAE;gBACnF,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM;gBACnC,KAAK,EAAE,KAAK;gBACZ,IAAI,EAAE,CAAC;aACV,EAAE;gBACC,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;aAClD,CAAC,CAAA;YAEF,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACxB,OAAO,SAAS,QAAQ,CAAC,GAAG,EAAE,CAAA;YAClC,CAAC;YAED,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAA;YAC/B,MAAM,QAAQ,GAAG,MAAM,YAAY,CAAC,aAAa,CAAC,IAAI,CAAC,CAAA;YAEvD,aAAa;YACb,MAAM,IAAI,GAAG,MAAM,OAAQ,CAAC,WAAW,CAAC,CAAC,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,YAAY,CAAC,CAAC,CAAA;YAC/F,IAAI,CAAC,KAAK,GAAG,IAAI,CAAA;YACjB,IAAI,CAAC,WAAW,GAAG,QAAQ,CAAC,IAAI,CAAA;YAChC,IAAI,CAAC,YAAY,GAAG,QAAQ,CAAC,KAAK,CAAA;YAClC,IAAI,CAAC,UAAU,GAAG,QAAQ,CAAC,MAAM,CAAA;YACjC,MAAM,IAAI,CAAC,OAAO,EAAE,CAAA;YAEpB,OAAO,gBAAgB,CAAA;QACzB,CAAC;QAAC,OAAO,CAAM,EAAE,CAAC;YAChB,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;YAC9B,OAAO,SAAS,CAAC,CAAC,OAAO,EAAE,CAAA;QAC7B,CAAC;IACH,CAAC,CAAC,CAAA;IAEJ,gBAAgB;IAChB,GAAG,CAAC,OAAO,CAAC,aAAa,EAAE,OAAO,CAAC;SAChC,MAAM,CAAC,KAAK,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE;QAC3B,IAAI,CAAC;YACD,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,UAAU,CAAC,OAAQ,CAAC,CAAA;YAClD,MAAM,OAAQ,CAAC,IAAI,CAAC,aAAa,CAAC,CAAA;YAClC,MAAM,IAAI,GAAG,MAAM,YAAY,CAAC,cAAc,CAAC,IAAI,EAAE,KAAK,CAAC,CAAA;YAE3D,MAAM,OAAO,GAA0F,EAAE,CAAC;YAE1G,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;gBACrB,IAAI,GAAG,CAAC,OAAO,KAAK,WAAW,EAAE,CAAC;oBAC9B,KAAK,MAAM,IAAI,IAAI,GAAG,CAAC,WAAW,EAAE,CAAC;wBAChC,MAAM,GAAG,GAAG,MAAM,YAAY,CAAC,UAAU,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,eAAe,CAAC,CAAA;wBACtF,IAAI,MAAM,GAAG,EAAE,CAAA;wBACf,IAAI,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC;4BACnB,MAAM,GAAG,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;wBACxF,CAAC;wBAED,OAAO,CAAC,IAAI,CAAC;4BACT,IAAI,EAAE,MAAM;4BACZ,IAAI,EAAE,IAAI,CAAC,QAAQ;4BACnB,MAAM,EAAE,GAAG,CAAC,OAAO,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC;4BACpD,MAAM;4BACN,OAAO,EAAE,GAAG,CAAC,OAAO,IAAI,GAAG,CAAC,aAAa,CAAC,8CAA8C;yBAC3F,CAAC,CAAA;oBACP,CAAC;gBACL,CAAC;qBAAM,IAAI,GAAG,CAAC,OAAO,KAAK,UAAU,EAAE,CAAC;oBACpC,KAAK,MAAM,OAAO,IAAI,GAAG,CAAC,WAAW,EAAE,CAAC;wBACpC,KAAK,MAAM,IAAI,IAAI,OAAO,CAAC,KAAK,IAAI,EAAE,EAAE,CAAC;4BACrC,MAAM,GAAG,GAAG,MAAM,YAAY,CAAC,kBAAkB,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,CAAA;4BAEpE,OAAO,CAAC,IAAI,CAAC;gCACT,IAAI,EAAE,UAAU;gCAChB,IAAI,EAAE,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,QAAQ;gCACpC,MAAM,EAAE,GAAG,CAAC,OAAO,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC;gCACpD,MAAM,EAAE,EAAE,EAAE,yEAAyE;gCACrF,OAAO,EAAE,GAAG,CAAC,OAAO,IAAI,GAAG,CAAC,aAAa;6BAC5C,CAAC,CAAA;wBACN,CAAC;oBACL,CAAC;gBACL,CAAC;YACL,CAAC;YAED,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;gBAAE,OAAO,YAAY,CAAA;YAE7C,MAAM,OAAO,GAAG,MAAM,aAAa,CAAC,sBAAsB,CAAC,OAAO,CAAC,CAAC;YACpE,OAAO,CAAC,CAAC,KAAK,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;QAEzC,CAAC;QAAC,OAAO,CAAM,EAAE,CAAC;YACd,OAAO,SAAS,CAAC,CAAC,OAAO,EAAE,CAAA;QAC/B,CAAC;IACJ,CAAC,CAAC,CAAA;IAIF,mBAAmB;IACnB,GAAG,CAAC,OAAO,CAAC,aAAa,EAAE,SAAS,CAAC;SAChC,MAAM,CAAC,KAAK,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE;QAC1B,IAAI,CAAC;YACD,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,MAAM,UAAU,CAAC,OAAQ,CAAC,CAAA;YAC7D,MAAM,IAAI,GAAG,MAAM,YAAY,CAAC,cAAc,CAAC,IAAI,EAAE,KAAK,CAAC,CAAA;YAE3D,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,UAAU,CAAC,CAAA;YACnE,IAAI,CAAC,WAAW,IAAI,CAAC,WAAW,CAAC,WAAW,IAAI,WAAW,CAAC,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACnF,OAAO,8BAA8B,CAAA;YACzC,CAAC;YAED,YAAY;YACZ,wFAAwF;YACxF,wGAAwG;YACxG,6BAA6B;YAC7B,IAAI,UAAU,GAAQ,IAAI,CAAC;YAE3B,mDAAmD;YACnD,KAAK,MAAM,OAAO,IAAI,WAAW,CAAC,WAAW,EAAE,CAAC;gBAC5C,IAAI,OAAO,CAAC,KAAK,IAAI,OAAO,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBAC5C,UAAU,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;oBAC9B,MAAM;gBACV,CAAC;gBACD,6EAA6E;gBAC7E,qDAAqD;YACzD,CAAC;YAED,IAAI,CAAC,UAAU,EAAE,CAAC;gBACb,OAAO,gBAAgB,CAAA;YAC5B,CAAC;YAED,MAAM,OAAQ,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAA;YAE5C,kBAAkB;YAClB,6BAA6B;YAC7B,MAAM,IAAI,GAAG,MAAM,YAAY,CAAC,qBAAqB,CAAC,IAAI,EAAE,KAAK,EAAE,UAAU,CAAC,MAAM,EAAE,UAAU,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAA;YAErH,iBAAiB;YACjB,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,oBAAoB,CAAC,IAAI,CAAC,CAAA;YAE7D,OAAO,CAAC,CAAC,KAAK,CAAC,MAAM,EAAE,WAAW,CAAC,CAAA;QAEvC,CAAC;QAAC,OAAO,CAAM,EAAE,CAAC;YACd,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;YAC9B,OAAO,cAAc,CAAC,CAAC,OAAO,EAAE,CAAA;QACpC,CAAC;IACL,CAAC,CAAC,CAAA;IAEN,iBAAiB;IACjB,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;QAClB,uBAAuB;QACvB,GAAG,CAAC,WAAW,CAAC,KAAK,IAAI,EAAE;YACtB,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAA;YACtB,+CAA+C;YAC/C,IAAI,GAAG,CAAC,QAAQ,EAAE,KAAK,CAAC,EAAE,CAAC;gBACvB,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAA;gBACvC,MAAM,KAAK,GAAG,MAAM,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,EAAE,EAAE,WAAW,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,CAAC,CAAA;gBAChF,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;oBACvB,IAAI,CAAC,IAAI,CAAC,WAAW;wBAAE,SAAS;oBAChC,IAAI,CAAC;wBACD,+CAA+C;wBAC/C,mBAAmB;wBACnB,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,KAAK,CAAC,mBAAmB,IAAI,CAAC,EAAE,EAAE,CAAC,CAAA;oBAC7D,CAAC;oBAAC,OAAO,CAAM,EAAE,CAAC;wBACd,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,EAAE,YAAY,CAAC,CAAC,OAAO,EAAE,CAAC,CAAA;oBACpE,CAAC;gBACL,CAAC;YACL,CAAC;QACN,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC,CAAA;IACnB,CAAC;AACL,CAAC"}
|
package/lib/security.js
ADDED
|
@@ -0,0 +1,229 @@
|
|
|
1
|
+
import * as crypto from 'crypto';
|
|
2
|
+
import * as zlib from 'zlib';
|
|
3
|
+
import { v4 as uuidv4 } from 'uuid';
|
|
4
|
+
// 数美配置
|
|
5
|
+
const SM_CONFIG = {
|
|
6
|
+
organization: "UWXspnCCJN4sfYlNfqps",
|
|
7
|
+
appId: "default",
|
|
8
|
+
publicKey: `-----BEGIN PUBLIC KEY-----
|
|
9
|
+
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCmxMNr7n8ZeT0tE1R9j/mPixoinPkeM+k4VGIn/s0k7N5rJAfnZ0eMER+QhwFvshzo0LNmeUkpR8uIlU/GEVr8mN28sKmwd2gpygqj0ePnBmOW4v0ZVwbSYK+izkhVFk2V/doLoMbWy6b+UnA8mkjvg0iYWRByfRsK2gdl7llqCwIDAQAB
|
|
10
|
+
-----END PUBLIC KEY-----`,
|
|
11
|
+
protocol: "https",
|
|
12
|
+
apiHost: "fp-it.portal101.cn"
|
|
13
|
+
};
|
|
14
|
+
const DES_RULE = {
|
|
15
|
+
appId: { cipher: "DES", is_encrypt: 1, key: "uy7mzc4h", obfuscated_name: "xx" },
|
|
16
|
+
box: { is_encrypt: 0, obfuscated_name: "jf" },
|
|
17
|
+
canvas: { cipher: "DES", is_encrypt: 1, key: "snrn887t", obfuscated_name: "yk" },
|
|
18
|
+
clientSize: { cipher: "DES", is_encrypt: 1, key: "cpmjjgsu", obfuscated_name: "zx" },
|
|
19
|
+
organization: { cipher: "DES", is_encrypt: 1, key: "78moqjfc", obfuscated_name: "dp" },
|
|
20
|
+
os: { cipher: "DES", is_encrypt: 1, key: "je6vk6t4", obfuscated_name: "pj" },
|
|
21
|
+
platform: { cipher: "DES", is_encrypt: 1, key: "pakxhcd2", obfuscated_name: "gm" },
|
|
22
|
+
plugins: { cipher: "DES", is_encrypt: 1, key: "v51m3pzl", obfuscated_name: "kq" },
|
|
23
|
+
pmf: { cipher: "DES", is_encrypt: 1, key: "2mdeslu3", obfuscated_name: "vw" },
|
|
24
|
+
protocol: { is_encrypt: 0, obfuscated_name: "protocol" },
|
|
25
|
+
referer: { cipher: "DES", is_encrypt: 1, key: "y7bmrjlc", obfuscated_name: "ab" },
|
|
26
|
+
res: { cipher: "DES", is_encrypt: 1, key: "whxqm2a7", obfuscated_name: "hf" },
|
|
27
|
+
rtype: { cipher: "DES", is_encrypt: 1, key: "x8o2h2bl", obfuscated_name: "lo" },
|
|
28
|
+
sdkver: { cipher: "DES", is_encrypt: 1, key: "9q3dcxp2", obfuscated_name: "sc" },
|
|
29
|
+
status: { cipher: "DES", is_encrypt: 1, key: "2jbrxxw4", obfuscated_name: "an" },
|
|
30
|
+
subVersion: { cipher: "DES", is_encrypt: 1, key: "eo3i2puh", obfuscated_name: "ns" },
|
|
31
|
+
svm: { cipher: "DES", is_encrypt: 1, key: "fzj3kaeh", obfuscated_name: "qr" },
|
|
32
|
+
time: { cipher: "DES", is_encrypt: 1, key: "q2t3odsk", obfuscated_name: "nb" },
|
|
33
|
+
timezone: { cipher: "DES", is_encrypt: 1, key: "1uv05lj5", obfuscated_name: "as" },
|
|
34
|
+
tn: { cipher: "DES", is_encrypt: 1, key: "x9nzj1bp", obfuscated_name: "py" },
|
|
35
|
+
trees: { cipher: "DES", is_encrypt: 1, key: "acfs0xo4", obfuscated_name: "pi" },
|
|
36
|
+
ua: { cipher: "DES", is_encrypt: 1, key: "k92crp1t", obfuscated_name: "bj" },
|
|
37
|
+
url: { cipher: "DES", is_encrypt: 1, key: "y95hjkoo", obfuscated_name: "cf" },
|
|
38
|
+
version: { is_encrypt: 0, obfuscated_name: "version" },
|
|
39
|
+
vpw: { cipher: "DES", is_encrypt: 1, key: "r9924ab5", obfuscated_name: "ca" }
|
|
40
|
+
};
|
|
41
|
+
const BROWSER_ENV = {
|
|
42
|
+
plugins: 'MicrosoftEdgePDFPluginPortableDocumentFormatinternal-pdf-viewer1,MicrosoftEdgePDFViewermhjfbmdgcfjbbpaeojofohoefgiehjai1',
|
|
43
|
+
ua: 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36 Edg/129.0.0.0',
|
|
44
|
+
canvas: '259ffe69',
|
|
45
|
+
timezone: -480,
|
|
46
|
+
platform: 'Win32',
|
|
47
|
+
url: 'https://www.skland.com/',
|
|
48
|
+
referer: '',
|
|
49
|
+
res: '1920_1080_24_1.25',
|
|
50
|
+
clientSize: '0_0_1080_1920_1920_1080_1920_1080',
|
|
51
|
+
status: '0011',
|
|
52
|
+
};
|
|
53
|
+
function md5(str) {
|
|
54
|
+
return crypto.createHash('md5').update(str).digest('hex');
|
|
55
|
+
}
|
|
56
|
+
// 3DES ECB 加密
|
|
57
|
+
function des_encrypt(text, key) {
|
|
58
|
+
let keyBuffer = Buffer.from(key);
|
|
59
|
+
if (keyBuffer.length === 8) {
|
|
60
|
+
keyBuffer = Buffer.concat([keyBuffer, keyBuffer, keyBuffer]);
|
|
61
|
+
}
|
|
62
|
+
const cipher = crypto.createCipheriv('des-ede3', keyBuffer, null);
|
|
63
|
+
cipher.setAutoPadding(false);
|
|
64
|
+
let buffer = Buffer.from(text, 'utf8');
|
|
65
|
+
// Padding
|
|
66
|
+
const blockSize = 8;
|
|
67
|
+
const padLen = blockSize - (buffer.length % blockSize);
|
|
68
|
+
const padBuffer = Buffer.alloc(padLen, 0); // Python uses 0 padding for manual impl?
|
|
69
|
+
// Wait, in previous code: `padBuffer = Buffer.alloc(8, 0)` then extra pad.
|
|
70
|
+
// Re-checking the provided JS code logic:
|
|
71
|
+
// `buffer = Buffer.concat([buffer, padBuffer]);` (adds 8 bytes first)
|
|
72
|
+
// `padLen = blockSize - (buffer.length % blockSize)`
|
|
73
|
+
// `buffer = Buffer.concat([buffer, extraPad]);`
|
|
74
|
+
// Retaining original logic specifically:
|
|
75
|
+
const initialPad = Buffer.alloc(8, 0);
|
|
76
|
+
buffer = Buffer.concat([buffer, initialPad]);
|
|
77
|
+
const finalPadLen = blockSize - (buffer.length % blockSize);
|
|
78
|
+
if (finalPadLen !== blockSize) {
|
|
79
|
+
const extraPad = Buffer.alloc(finalPadLen, 0);
|
|
80
|
+
buffer = Buffer.concat([buffer, extraPad]);
|
|
81
|
+
}
|
|
82
|
+
let encrypted = cipher.update(buffer);
|
|
83
|
+
encrypted = Buffer.concat([encrypted, cipher.final()]);
|
|
84
|
+
return encrypted.toString('base64');
|
|
85
|
+
}
|
|
86
|
+
// AES CBC 加密
|
|
87
|
+
function aes_encrypt(buffer, key) {
|
|
88
|
+
const iv = Buffer.from('0102030405060708', 'utf8'); // 16 chars
|
|
89
|
+
const cipher = crypto.createCipheriv('aes-128-cbc', Buffer.from(key), iv);
|
|
90
|
+
cipher.setAutoPadding(false);
|
|
91
|
+
// Apply ZeroPadding
|
|
92
|
+
const blockSize = 16;
|
|
93
|
+
let temp = buffer;
|
|
94
|
+
const padLen = blockSize - (temp.length % blockSize);
|
|
95
|
+
if (padLen !== blockSize) {
|
|
96
|
+
const padBuffer = Buffer.alloc(padLen, 0);
|
|
97
|
+
temp = Buffer.concat([temp, padBuffer]);
|
|
98
|
+
}
|
|
99
|
+
let encrypted = cipher.update(temp);
|
|
100
|
+
encrypted = Buffer.concat([encrypted, cipher.final()]);
|
|
101
|
+
return encrypted.toString('hex');
|
|
102
|
+
}
|
|
103
|
+
// Process Object for DES
|
|
104
|
+
function process_des(o) {
|
|
105
|
+
const result = {};
|
|
106
|
+
for (const k of Object.keys(o)) {
|
|
107
|
+
if (DES_RULE[k]) {
|
|
108
|
+
const rule = DES_RULE[k];
|
|
109
|
+
let res = o[k];
|
|
110
|
+
if (rule.is_encrypt === 1) {
|
|
111
|
+
res = des_encrypt(String(res), rule.key);
|
|
112
|
+
}
|
|
113
|
+
result[rule.obfuscated_name] = res;
|
|
114
|
+
}
|
|
115
|
+
else {
|
|
116
|
+
result[k] = o[k];
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
return result;
|
|
120
|
+
}
|
|
121
|
+
function get_tn(o) {
|
|
122
|
+
const sortedKeys = Object.keys(o).sort();
|
|
123
|
+
const results = [];
|
|
124
|
+
for (const k of sortedKeys) {
|
|
125
|
+
let v = o[k];
|
|
126
|
+
if (typeof v === 'number') {
|
|
127
|
+
v = String(v * 10000);
|
|
128
|
+
}
|
|
129
|
+
else if (typeof v === 'object' && v !== null && !Array.isArray(v)) {
|
|
130
|
+
v = get_tn(v);
|
|
131
|
+
}
|
|
132
|
+
results.push(v);
|
|
133
|
+
}
|
|
134
|
+
return results.join('');
|
|
135
|
+
}
|
|
136
|
+
function get_smid() {
|
|
137
|
+
const now = new Date();
|
|
138
|
+
const y = now.getFullYear();
|
|
139
|
+
const m = String(now.getMonth() + 1).padStart(2, '0');
|
|
140
|
+
const d = String(now.getDate()).padStart(2, '0');
|
|
141
|
+
const h = String(now.getHours()).padStart(2, '0');
|
|
142
|
+
const min = String(now.getMinutes()).padStart(2, '0');
|
|
143
|
+
const sec = String(now.getSeconds()).padStart(2, '0');
|
|
144
|
+
const timeStr = `${y}${m}${d}${h}${min}${sec}`;
|
|
145
|
+
const uid = uuidv4();
|
|
146
|
+
const v = timeStr + md5(uid) + '00';
|
|
147
|
+
const smsk_web = md5('smsk_web_' + v).substring(0, 14);
|
|
148
|
+
return v + smsk_web + '0';
|
|
149
|
+
}
|
|
150
|
+
export async function get_d_id(http) {
|
|
151
|
+
const uid = uuidv4();
|
|
152
|
+
const priId = md5(uid).substring(0, 16);
|
|
153
|
+
const epBuffer = crypto.publicEncrypt({
|
|
154
|
+
key: SM_CONFIG.publicKey,
|
|
155
|
+
padding: crypto.constants.RSA_PKCS1_PADDING
|
|
156
|
+
}, Buffer.from(uid));
|
|
157
|
+
const ep = epBuffer.toString('base64');
|
|
158
|
+
const browser = { ...BROWSER_ENV };
|
|
159
|
+
const currentTime = Date.now();
|
|
160
|
+
Object.assign(browser, {
|
|
161
|
+
vpw: uuidv4(),
|
|
162
|
+
svm: currentTime,
|
|
163
|
+
trees: uuidv4(),
|
|
164
|
+
pmf: currentTime
|
|
165
|
+
});
|
|
166
|
+
const desTarget = {
|
|
167
|
+
...browser,
|
|
168
|
+
protocol: 102,
|
|
169
|
+
organization: SM_CONFIG.organization,
|
|
170
|
+
appId: SM_CONFIG.appId,
|
|
171
|
+
os: 'web',
|
|
172
|
+
version: '3.0.0',
|
|
173
|
+
sdkver: '3.0.0',
|
|
174
|
+
box: '',
|
|
175
|
+
rtype: 'all',
|
|
176
|
+
smid: get_smid(),
|
|
177
|
+
subVersion: '1.0.0',
|
|
178
|
+
time: 0
|
|
179
|
+
};
|
|
180
|
+
desTarget.tn = md5(get_tn(desTarget));
|
|
181
|
+
const desResultObj = process_des(desTarget);
|
|
182
|
+
const desJsonStr = JSON.stringify(desResultObj);
|
|
183
|
+
const gzipBuffer = zlib.gzipSync(desJsonStr, { mtime: 0 });
|
|
184
|
+
const gzipBase64Buffer = Buffer.from(gzipBuffer.toString('base64'), 'utf8');
|
|
185
|
+
const desResult = aes_encrypt(gzipBase64Buffer, priId);
|
|
186
|
+
try {
|
|
187
|
+
const response = await http.post(`${SM_CONFIG.protocol}://${SM_CONFIG.apiHost}/deviceprofile/v4`, {
|
|
188
|
+
appId: 'default',
|
|
189
|
+
compress: 2,
|
|
190
|
+
data: desResult,
|
|
191
|
+
encode: 5,
|
|
192
|
+
ep: ep,
|
|
193
|
+
organization: SM_CONFIG.organization,
|
|
194
|
+
os: 'web'
|
|
195
|
+
});
|
|
196
|
+
const resp = response;
|
|
197
|
+
// Note: Koishi http client typically returns the parsed body directly if it's JSON
|
|
198
|
+
// or response object depending on call. Default calling conventions return parsed body.
|
|
199
|
+
// Original check was code !== 1100, assuming 1100 is "Success".
|
|
200
|
+
// The log shows code IS 1100, but JSON stringification made user think it failed?
|
|
201
|
+
// Wait, the log says: Error: did计算失败: "{\"code\":1100...
|
|
202
|
+
// This confirms code IS 1100.
|
|
203
|
+
// BUT the if condition was `resp.code !== 1100`.
|
|
204
|
+
// If resp.code IS 1100, then `1100 !== 1100` is FALSE. So it should NOT throw.
|
|
205
|
+
// Why did it throw?
|
|
206
|
+
// User log: did计算失败: "{\"code\":1100...}"
|
|
207
|
+
// This means the code entered the `if` block.
|
|
208
|
+
// The only way `resp.code !== 1100` is true when `resp.code` is 1100 is if types don't match (e.g. string "1100" vs number 1100) or check logic is wrong.
|
|
209
|
+
// Koishi/axios typically returns parsed JSON, so code should be number.
|
|
210
|
+
// Let's verify type or check lightly.
|
|
211
|
+
// Also, response might be a string if koishi didn't auto parse?
|
|
212
|
+
let da = resp;
|
|
213
|
+
if (typeof resp === 'string') {
|
|
214
|
+
try {
|
|
215
|
+
da = JSON.parse(resp);
|
|
216
|
+
}
|
|
217
|
+
catch { }
|
|
218
|
+
}
|
|
219
|
+
if (da.code != 1100) {
|
|
220
|
+
throw new Error(`did计算失败: ${JSON.stringify(da)}`);
|
|
221
|
+
}
|
|
222
|
+
return 'B' + da.detail.deviceId;
|
|
223
|
+
}
|
|
224
|
+
catch (error) {
|
|
225
|
+
console.error('获取 dId 失败:', error);
|
|
226
|
+
throw error;
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
//# sourceMappingURL=security.js.map
|