@nger/fk-upload 1.0.201 → 1.0.204
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/dist/{templates → controllers}/code.d.ts +0 -0
- package/dist/{templates → controllers}/code.js +2 -1
- package/dist/controllers/relogin.d.ts +8 -0
- package/dist/controllers/relogin.js +42 -0
- package/dist/{templates → controllers}/verify.d.ts +0 -0
- package/dist/{templates → controllers}/verify.js +0 -0
- package/dist/entities/check-task.d.ts +13 -0
- package/dist/entities/check-task.js +221 -0
- package/dist/entities/download-task.d.ts +23 -0
- package/dist/entities/download-task.js +445 -0
- package/dist/entities/effect-task.d.ts +12 -0
- package/dist/entities/effect-task.js +207 -0
- package/dist/entities/fk-account.d.ts +16 -0
- package/dist/entities/fk-account.js +295 -0
- package/dist/entities/fk-jiqun.d.ts +5 -0
- package/dist/entities/fk-jiqun.js +56 -0
- package/dist/entities/upload-task.d.ts +15 -0
- package/dist/entities/upload-task.js +333 -0
- package/dist/entities/w7-account.d.ts +11 -0
- package/dist/entities/w7-account.js +126 -0
- package/dist/entities/w7.d.ts +10 -0
- package/dist/entities/w7.js +107 -0
- package/dist/entities/w7_chat_topic.d.ts +9 -0
- package/dist/entities/w7_chat_topic.js +58 -0
- package/dist/entities/w7_uni_account.d.ts +4 -0
- package/dist/entities/w7_uni_account.js +23 -0
- package/dist/fk-upload.module.d.ts +5 -0
- package/dist/fk-upload.module.js +76 -43
- package/dist/main.d.ts +1 -0
- package/dist/main.js +18 -29
- package/dist/services/check.service.d.ts +6 -0
- package/dist/services/check.service.js +32 -0
- package/dist/services/client.service.d.ts +6 -0
- package/dist/services/client.service.js +29 -0
- package/dist/services/download.service.d.ts +15 -0
- package/dist/services/download.service.js +139 -0
- package/dist/services/effect.service.d.ts +7 -0
- package/dist/services/effect.service.js +34 -0
- package/dist/services/fk.service.d.ts +24 -0
- package/dist/services/fk.service.js +323 -0
- package/dist/services/login.service.d.ts +17 -0
- package/dist/services/login.service.js +95 -0
- package/dist/services/upload.service.d.ts +13 -0
- package/dist/services/upload.service.js +100 -0
- package/dist/tasks/actions.d.ts +28 -0
- package/dist/tasks/actions.js +12 -0
- package/dist/{templates/tasks/schedule-task.d.ts → tasks/check-task.d.ts} +3 -5
- package/dist/tasks/check-task.js +205 -0
- package/dist/tasks/download-continue-task.d.ts +9 -0
- package/dist/tasks/download-continue-task.js +127 -0
- package/dist/{templates/tasks → tasks}/download-task.d.ts +0 -1
- package/dist/tasks/download-task.js +128 -0
- package/dist/{templates/tasks → tasks}/effect-task.d.ts +1 -1
- package/dist/tasks/effect-task.js +111 -0
- package/dist/{templates/tasks → tasks}/providers.d.ts +0 -0
- package/dist/{templates/tasks → tasks}/providers.js +11 -5
- package/dist/tasks/upload-continue-task.d.ts +8 -0
- package/dist/tasks/upload-continue-task.js +114 -0
- package/dist/{templates/tasks → tasks}/upload-task.d.ts +0 -0
- package/dist/tasks/upload-task.js +114 -0
- package/package.json +18 -14
- package/pnpm-lock.yaml +36 -1435
- package/dist/electon.d.ts +0 -3
- package/dist/electon.js +0 -80
- package/dist/entities/fk-download-task.entity.d.ts +0 -18
- package/dist/entities/fk-download-task.entity.js +0 -142
- package/dist/entities/fk-login-cookie.entity.d.ts +0 -7
- package/dist/entities/fk-login-cookie.entity.js +0 -46
- package/dist/entities/fk-login.entity.d.ts +0 -12
- package/dist/entities/fk-login.entity.js +0 -80
- package/dist/entities/index.d.ts +0 -3
- package/dist/entities/index.js +0 -6
- package/dist/login.controller.d.ts +0 -14
- package/dist/login.controller.js +0 -197
- package/dist/mq-runner.d.ts +0 -5
- package/dist/mq-runner.js +0 -19
- package/dist/static/task-manage.d.ts +0 -6
- package/dist/static/task-manage.js +0 -34
- package/dist/templates/add-fk-login.d.ts +0 -12
- package/dist/templates/add-fk-login.js +0 -93
- package/dist/templates/add-task.d.ts +0 -13
- package/dist/templates/add-task.js +0 -78
- package/dist/templates/check-upload.d.ts +0 -38
- package/dist/templates/check-upload.js +0 -195
- package/dist/templates/component.d.ts +0 -10
- package/dist/templates/component.js +0 -39
- package/dist/templates/error.d.ts +0 -4
- package/dist/templates/error.js +0 -27
- package/dist/templates/help.d.ts +0 -7
- package/dist/templates/help.js +0 -52
- package/dist/templates/player.d.ts +0 -4
- package/dist/templates/player.js +0 -23
- package/dist/templates/setting.d.ts +0 -13
- package/dist/templates/setting.js +0 -65
- package/dist/templates/task-manage.d.ts +0 -21
- package/dist/templates/task-manage.js +0 -314
- package/dist/templates/tasks/actions.d.ts +0 -44
- package/dist/templates/tasks/actions.js +0 -9
- package/dist/templates/tasks/check-task.d.ts +0 -8
- package/dist/templates/tasks/check-task.js +0 -89
- package/dist/templates/tasks/download-task.js +0 -130
- package/dist/templates/tasks/effect-task.js +0 -76
- package/dist/templates/tasks/fk.service.d.ts +0 -28
- package/dist/templates/tasks/fk.service.js +0 -254
- package/dist/templates/tasks/schedule-task.js +0 -94
- package/dist/templates/tasks/task.service.d.ts +0 -11
- package/dist/templates/tasks/task.service.js +0 -114
- package/dist/templates/tasks/upload-task.js +0 -97
- package/dist/templates/tasks/yasuo-task.d.ts +0 -0
- package/dist/templates/tasks/yasuo-task.js +0 -0
- package/dist/templates/upload-task.d.ts +0 -9
- package/dist/templates/upload-task.js +0 -141
- package/dist/templates/upload.d.ts +0 -16
- package/dist/templates/upload.js +0 -232
- package/dist/urlSafeBase64Decode.d.ts +0 -3
- package/dist/urlSafeBase64Decode.js +0 -32
- package/electron/.env +0 -32
- package/electron/package.json +0 -31
- package/electron/pnpm-lock.yaml +0 -2878
- package/fk-upload-pc/.vscode/extensions.json +0 -3
- package/fk-upload-pc/README.md +0 -16
- package/fk-upload-pc/index.html +0 -13
- package/fk-upload-pc/package.json +0 -19
- package/fk-upload-pc/pnpm-lock.yaml +0 -489
- package/fk-upload-pc/public/favicon.ico +0 -0
- package/fk-upload-pc/tsconfig.json +0 -18
- package/fk-upload-pc/tsconfig.node.json +0 -8
- package/fk-upload-pc/vite.config.ts +0 -7
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.DownloadService = void 0;
|
|
4
|
+
const tslib_1 = require("tslib");
|
|
5
|
+
const download_task_1 = require("./../entities/download-task");
|
|
6
|
+
const core_1 = require("@nger/core");
|
|
7
|
+
const typeorm_1 = require("@nger/typeorm");
|
|
8
|
+
const rabbitmq_1 = require("@nger/rabbitmq");
|
|
9
|
+
const actions_1 = require("../tasks/actions");
|
|
10
|
+
const fs_extra_1 = require("fs-extra");
|
|
11
|
+
const path_1 = require("path");
|
|
12
|
+
const uuid_1 = require("uuid");
|
|
13
|
+
let DownloadService = class DownloadService {
|
|
14
|
+
injector;
|
|
15
|
+
db;
|
|
16
|
+
constructor(injector, db) {
|
|
17
|
+
this.injector = injector;
|
|
18
|
+
this.db = db;
|
|
19
|
+
}
|
|
20
|
+
async startDownload(id) {
|
|
21
|
+
const download = await this.db.manager.findOneOrFail(download_task_1.FkDownloadTask, { where: { id } });
|
|
22
|
+
if (download.status === '1') {
|
|
23
|
+
// no start
|
|
24
|
+
await this.db.manager.update(download_task_1.FkDownloadTask, id, { status: `2` });
|
|
25
|
+
await this.start(id);
|
|
26
|
+
}
|
|
27
|
+
else if (download.status === '2') {
|
|
28
|
+
// wait
|
|
29
|
+
await this.start(id);
|
|
30
|
+
}
|
|
31
|
+
else if (download.status === '3') {
|
|
32
|
+
// downloading
|
|
33
|
+
await this.db.manager.update(download_task_1.FkDownloadTask, id, { status: `5` });
|
|
34
|
+
await this.continue(id);
|
|
35
|
+
}
|
|
36
|
+
else if (download.status === '4') {
|
|
37
|
+
// stop
|
|
38
|
+
await this.db.manager.update(download_task_1.FkDownloadTask, id, { status: `5` });
|
|
39
|
+
await this.continue(id);
|
|
40
|
+
}
|
|
41
|
+
else if (download.status === '5') {
|
|
42
|
+
// wait continue
|
|
43
|
+
await this.continue(id);
|
|
44
|
+
}
|
|
45
|
+
else if (download.status === '6') {
|
|
46
|
+
// error
|
|
47
|
+
await this.db.manager.update(download_task_1.FkDownloadTask, id, { status: `5` });
|
|
48
|
+
await this.continue(id);
|
|
49
|
+
}
|
|
50
|
+
else if (download.status === '7') {
|
|
51
|
+
console.log(`has finish`);
|
|
52
|
+
}
|
|
53
|
+
else {
|
|
54
|
+
console.log(`unknow status`);
|
|
55
|
+
await this.continue(id);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
async start(id) {
|
|
59
|
+
const db = this.injector.get(typeorm_1.Db);
|
|
60
|
+
const download = await db.manager.findOneOrFail(download_task_1.FkDownloadTask, {
|
|
61
|
+
where: { id }
|
|
62
|
+
});
|
|
63
|
+
const taskManager = this.injector.get(rabbitmq_1.TaskManager);
|
|
64
|
+
const t = new rabbitmq_1.TaskEntity();
|
|
65
|
+
t.topic = actions_1.DOWNLOAD_ACTION;
|
|
66
|
+
t.data = { id: download.id };
|
|
67
|
+
await taskManager.send(t);
|
|
68
|
+
}
|
|
69
|
+
async starts(ids) {
|
|
70
|
+
return Promise.all(ids.map(id => this.startDownload(id)));
|
|
71
|
+
}
|
|
72
|
+
async continue(id) {
|
|
73
|
+
const db = this.injector.get(typeorm_1.Db);
|
|
74
|
+
const download = await db.manager.findOneOrFail(download_task_1.FkDownloadTask, {
|
|
75
|
+
where: { id }
|
|
76
|
+
});
|
|
77
|
+
const taskManager = this.injector.get(rabbitmq_1.TaskManager);
|
|
78
|
+
const t = new rabbitmq_1.TaskEntity();
|
|
79
|
+
t.topic = actions_1.DOWNLOAD_CONTINUE_ACTION;
|
|
80
|
+
t.data = { id: download.id };
|
|
81
|
+
await taskManager.send(t);
|
|
82
|
+
}
|
|
83
|
+
async stop(id) {
|
|
84
|
+
const db = this.injector.get(typeorm_1.Db);
|
|
85
|
+
const upload = await db.manager.findOneOrFail(download_task_1.FkDownloadTask, {
|
|
86
|
+
where: { id }
|
|
87
|
+
});
|
|
88
|
+
if (upload.status === '7') { }
|
|
89
|
+
else if (upload.status === '1') {
|
|
90
|
+
}
|
|
91
|
+
else if (upload.status === '2') {
|
|
92
|
+
}
|
|
93
|
+
else {
|
|
94
|
+
await db.manager.update(download_task_1.FkDownloadTask, id, { status: '4' });
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
async stops(ids) {
|
|
98
|
+
return Promise.all(ids.map(id => this.stop(id)));
|
|
99
|
+
}
|
|
100
|
+
createDir() {
|
|
101
|
+
const root = this.injector.get(core_1.APP_ROOT);
|
|
102
|
+
const date = new Date();
|
|
103
|
+
const year = date.getFullYear();
|
|
104
|
+
const month = date.getMonth() + 1;
|
|
105
|
+
const day = date.getDate();
|
|
106
|
+
const path = (0, path_1.join)(root, 'attachments', `${year}/${month}/${day}`);
|
|
107
|
+
(0, fs_extra_1.ensureDirSync)(path);
|
|
108
|
+
return path;
|
|
109
|
+
}
|
|
110
|
+
createFilename(url) {
|
|
111
|
+
const _url = new URL(url);
|
|
112
|
+
const filePath = _url.pathname;
|
|
113
|
+
let ext = (0, path_1.extname)(filePath);
|
|
114
|
+
let filename = (0, uuid_1.v4)();
|
|
115
|
+
if (ext.length < 5) {
|
|
116
|
+
ext = ext === '.' ? '.mp4' : ext;
|
|
117
|
+
}
|
|
118
|
+
if (ext.length === 0) {
|
|
119
|
+
if ((url.toLowerCase()).includes('gif')) {
|
|
120
|
+
ext = '.gif';
|
|
121
|
+
}
|
|
122
|
+
if ((url.toLowerCase()).includes('jpg')) {
|
|
123
|
+
ext = '.jpg';
|
|
124
|
+
}
|
|
125
|
+
if ((url.toLowerCase()).includes('png')) {
|
|
126
|
+
ext = '.png';
|
|
127
|
+
}
|
|
128
|
+
if ((url.toLowerCase()).includes('mp4')) {
|
|
129
|
+
ext = '.mp4';
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
return filename + ext;
|
|
133
|
+
}
|
|
134
|
+
};
|
|
135
|
+
DownloadService = tslib_1.__decorate([
|
|
136
|
+
(0, core_1.Injectable)(),
|
|
137
|
+
tslib_1.__metadata("design:paramtypes", [core_1.Injector, typeorm_1.Db])
|
|
138
|
+
], DownloadService);
|
|
139
|
+
exports.DownloadService = DownloadService;
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.EffectService = void 0;
|
|
4
|
+
const tslib_1 = require("tslib");
|
|
5
|
+
const core_1 = require("@nger/core");
|
|
6
|
+
const rabbitmq_1 = require("@nger/rabbitmq");
|
|
7
|
+
const typeorm_1 = require("@nger/typeorm");
|
|
8
|
+
const effect_task_1 = require("../entities/effect-task");
|
|
9
|
+
const actions_1 = require("../tasks/actions");
|
|
10
|
+
let EffectService = class EffectService {
|
|
11
|
+
injector;
|
|
12
|
+
constructor(injector) {
|
|
13
|
+
this.injector = injector;
|
|
14
|
+
}
|
|
15
|
+
async starts(ids) {
|
|
16
|
+
return Promise.all(ids.map(id => this.start(id)));
|
|
17
|
+
}
|
|
18
|
+
async start(id) {
|
|
19
|
+
const db = this.injector.get(typeorm_1.Db);
|
|
20
|
+
const upload = await db.manager.findOneOrFail(effect_task_1.FkEffectTask, {
|
|
21
|
+
where: { id }
|
|
22
|
+
});
|
|
23
|
+
const taskManager = this.injector.get(rabbitmq_1.TaskManager);
|
|
24
|
+
const t = new rabbitmq_1.TaskEntity();
|
|
25
|
+
t.topic = actions_1.EFFECT_ACTION;
|
|
26
|
+
t.data = { id: upload.id };
|
|
27
|
+
await taskManager.send(t);
|
|
28
|
+
}
|
|
29
|
+
};
|
|
30
|
+
EffectService = tslib_1.__decorate([
|
|
31
|
+
(0, core_1.Injectable)(),
|
|
32
|
+
tslib_1.__metadata("design:paramtypes", [core_1.Injector])
|
|
33
|
+
], EffectService);
|
|
34
|
+
exports.EffectService = EffectService;
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { FkAccount } from './../entities/fk-account';
|
|
2
|
+
import { Axios } from "@nger/axios";
|
|
3
|
+
import { Db } from '@nger/typeorm';
|
|
4
|
+
import { FkDownloadTask } from '../entities/download-task';
|
|
5
|
+
import { Subject } from '.pnpm/rxjs@7.5.5/node_modules/rxjs';
|
|
6
|
+
export declare class FkService {
|
|
7
|
+
private axios;
|
|
8
|
+
private db;
|
|
9
|
+
constructor(axios: Axios, db: Db);
|
|
10
|
+
getToken(cookie: string): Promise<string>;
|
|
11
|
+
getAccessToken(cookie: string, token: string, pre: string): Promise<any>;
|
|
12
|
+
private encodeURIComponent;
|
|
13
|
+
getUploadUrl(token: any, forceDirect?: boolean): string;
|
|
14
|
+
getUploadInfo(fkAccount: FkAccount, download: FkDownloadTask): Promise<any>;
|
|
15
|
+
uploadFile(fkAccount: FkAccount, download: FkDownloadTask): Promise<Subject<unknown>>;
|
|
16
|
+
getBssInfo(): {
|
|
17
|
+
fromSite: boolean;
|
|
18
|
+
siteId: number;
|
|
19
|
+
groupId: number;
|
|
20
|
+
fileSizeLimit: number;
|
|
21
|
+
};
|
|
22
|
+
getUploadInfourl(accessToken: any): string;
|
|
23
|
+
private decode;
|
|
24
|
+
}
|
|
@@ -0,0 +1,323 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.FkService = void 0;
|
|
4
|
+
const tslib_1 = require("tslib");
|
|
5
|
+
const core_1 = require("@nger/core");
|
|
6
|
+
const axios_1 = require("@nger/axios");
|
|
7
|
+
const typeorm_1 = require("@nger/typeorm");
|
|
8
|
+
const fs_1 = require("fs");
|
|
9
|
+
const form_data_1 = tslib_1.__importDefault(require("form-data"));
|
|
10
|
+
const rxjs_1 = require(".pnpm/rxjs@7.5.5/node_modules/rxjs");
|
|
11
|
+
let FkService = class FkService {
|
|
12
|
+
axios;
|
|
13
|
+
db;
|
|
14
|
+
constructor(axios, db) {
|
|
15
|
+
this.axios = axios;
|
|
16
|
+
this.db = db;
|
|
17
|
+
}
|
|
18
|
+
async getToken(cookie) {
|
|
19
|
+
const url = `https://i.vip.webportal.top/`;
|
|
20
|
+
const iVipWebPortal = await this.axios.request({
|
|
21
|
+
url,
|
|
22
|
+
headers: {
|
|
23
|
+
'Content-type': 'text/html',
|
|
24
|
+
'Cookie': cookie
|
|
25
|
+
}
|
|
26
|
+
}).then(res => {
|
|
27
|
+
const { data } = res;
|
|
28
|
+
return data;
|
|
29
|
+
});
|
|
30
|
+
const items = iVipWebPortal.match(/<meta id='_TOKEN' value='(.*?)'\/>/);
|
|
31
|
+
let token = ``;
|
|
32
|
+
if (items && items.length === 2) {
|
|
33
|
+
token = items[1];
|
|
34
|
+
}
|
|
35
|
+
return token;
|
|
36
|
+
}
|
|
37
|
+
async getAccessToken(cookie, token, pre) {
|
|
38
|
+
// https://jhy0002.vip.webportal.top/cn/api/manage/advanceUpload/genAccessKey?_v=1653909389147&_TOKEN=afb8c4ac23544b83a34449dfaa76029a
|
|
39
|
+
const url = `https://${pre}.vip.webportal.top/cn/api/manage/advanceUpload/genAccessKey?_v=${new Date().getTime()}&_TOKEN=${token}`;
|
|
40
|
+
const accessKey = await this.axios.request({
|
|
41
|
+
url,
|
|
42
|
+
responseType: 'json',
|
|
43
|
+
headers: {
|
|
44
|
+
'Cookie': cookie
|
|
45
|
+
}
|
|
46
|
+
}).then(res => {
|
|
47
|
+
const { data, request, headers } = res;
|
|
48
|
+
return data;
|
|
49
|
+
});
|
|
50
|
+
if (accessKey.success) {
|
|
51
|
+
const accessTokenString = this.decode(accessKey.accessKey);
|
|
52
|
+
if (accessTokenString) {
|
|
53
|
+
const accessToken = JSON.parse(accessTokenString);
|
|
54
|
+
return accessToken;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
encodeURIComponent(data) {
|
|
59
|
+
if ((0, core_1.isPrimitive)(data)) {
|
|
60
|
+
return encodeURIComponent(data);
|
|
61
|
+
}
|
|
62
|
+
return Object.keys(data).map(key => {
|
|
63
|
+
const value = Reflect.get(data, key);
|
|
64
|
+
return `${key}=${value}`;
|
|
65
|
+
}).join('&');
|
|
66
|
+
}
|
|
67
|
+
getUploadUrl(token, forceDirect = true) {
|
|
68
|
+
if (forceDirect) {
|
|
69
|
+
return `https://${token.url}/${token.visitType}/${token.app}/upload?cmd=${token.cmd}&token=${token.token}`;
|
|
70
|
+
}
|
|
71
|
+
else {
|
|
72
|
+
return `https://${token.url}/${token.visitType}/${token.app}/advance?cmd=${token.cmd}&token=${token.token}`;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
async getUploadInfo(fkAccount, download) {
|
|
76
|
+
// TODO: from redis cache
|
|
77
|
+
const bssInfo = this.getBssInfo();
|
|
78
|
+
const token = await this.getToken(fkAccount.cookies);
|
|
79
|
+
if (token.length <= 0) {
|
|
80
|
+
return;
|
|
81
|
+
}
|
|
82
|
+
const accessToken = await this.getAccessToken(fkAccount.cookies, token, fkAccount.mainUsername);
|
|
83
|
+
const uploadInfoUrl = this.getUploadInfourl(accessToken);
|
|
84
|
+
const data = this.encodeURIComponent({
|
|
85
|
+
fileMd5: download.md5,
|
|
86
|
+
fileSize: download.size,
|
|
87
|
+
isFreeVer: false,
|
|
88
|
+
aid: fkAccount.aid,
|
|
89
|
+
folderId: fkAccount.uploadGroupId,
|
|
90
|
+
bssInfo: encodeURIComponent(JSON.stringify(bssInfo)),
|
|
91
|
+
fileName: download.filename
|
|
92
|
+
});
|
|
93
|
+
const info = await this.axios.request({
|
|
94
|
+
url: uploadInfoUrl,
|
|
95
|
+
data,
|
|
96
|
+
method: 'post',
|
|
97
|
+
headers: {
|
|
98
|
+
[`Content-Type`]: `application/x-www-form-urlencoded`,
|
|
99
|
+
[`Cookie`]: fkAccount.cookies
|
|
100
|
+
}
|
|
101
|
+
}).then(res => res.data);
|
|
102
|
+
if (info.code === 200) {
|
|
103
|
+
let forceDirect = true;
|
|
104
|
+
if (download.size > 2097152) {
|
|
105
|
+
forceDirect = false;
|
|
106
|
+
}
|
|
107
|
+
let uploadUrl = this.getUploadUrl(accessToken, forceDirect);
|
|
108
|
+
return { ...info.data, uploadUrl: uploadUrl, token, forceDirect };
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
async uploadFile(fkAccount, download) {
|
|
112
|
+
const sub = new rxjs_1.Subject();
|
|
113
|
+
const upload = async () => {
|
|
114
|
+
const info = await this.getUploadInfo(fkAccount, download).catch(e => {
|
|
115
|
+
sub.error(new Error(`获取上传信息失败`));
|
|
116
|
+
});
|
|
117
|
+
if (!info) {
|
|
118
|
+
sub.error(new Error(`获取上传信息失败`));
|
|
119
|
+
}
|
|
120
|
+
const cookies = fkAccount.cookies;
|
|
121
|
+
let uploadUrl = info.uploadUrl;
|
|
122
|
+
if (info.forceDirect) {
|
|
123
|
+
const formData = new form_data_1.default();
|
|
124
|
+
const fileStream = (0, fs_1.createReadStream)(download.path);
|
|
125
|
+
formData.append('ctrl', fileStream);
|
|
126
|
+
formData.append('isFreeVer', this.encodeURIComponent(false));
|
|
127
|
+
formData.append('aid', this.encodeURIComponent(fkAccount.aid));
|
|
128
|
+
formData.append('folderId', this.encodeURIComponent(fkAccount.uploadGroupId));
|
|
129
|
+
formData.append('bssInfo', JSON.stringify(this.getBssInfo()));
|
|
130
|
+
formData.append('fileName', this.encodeURIComponent(download.filename));
|
|
131
|
+
const headers = formData.getHeaders();
|
|
132
|
+
const uploadResult = await this.axios.post(uploadUrl, formData, {
|
|
133
|
+
headers: {
|
|
134
|
+
...headers,
|
|
135
|
+
Cookie: cookies
|
|
136
|
+
},
|
|
137
|
+
timeout: 18000
|
|
138
|
+
}).then(res => {
|
|
139
|
+
return res.data;
|
|
140
|
+
}).catch((e) => {
|
|
141
|
+
sub.error(e);
|
|
142
|
+
});
|
|
143
|
+
if (!uploadResult) {
|
|
144
|
+
sub.error(new Error(`未知错误`));
|
|
145
|
+
return;
|
|
146
|
+
}
|
|
147
|
+
if (uploadResult.code !== 200) {
|
|
148
|
+
sub.error(new Error(uploadResult.msg));
|
|
149
|
+
return;
|
|
150
|
+
}
|
|
151
|
+
if (uploadResult.code === 200) {
|
|
152
|
+
const data = uploadResult.data;
|
|
153
|
+
const fullDownUrl = data.fullDownUrl;
|
|
154
|
+
if (fullDownUrl) {
|
|
155
|
+
if (fullDownUrl.startsWith('https://site-upload')) {
|
|
156
|
+
sub.error(new Error(`登录过期,请重新绑定`));
|
|
157
|
+
}
|
|
158
|
+
const fullUrl = fullDownUrl.startsWith('http') ? fullDownUrl : `https:` + fullDownUrl;
|
|
159
|
+
sub.next({
|
|
160
|
+
url: fullUrl,
|
|
161
|
+
size: download.size,
|
|
162
|
+
start: 0,
|
|
163
|
+
end: download.size
|
|
164
|
+
});
|
|
165
|
+
sub.complete();
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
return;
|
|
169
|
+
}
|
|
170
|
+
const splitSize = info.splitSize;
|
|
171
|
+
const uploadedSize = info.uploadedSize;
|
|
172
|
+
let index = Math.ceil(uploadedSize / splitSize);
|
|
173
|
+
let complete = false;
|
|
174
|
+
const max = download.size - 1;
|
|
175
|
+
const totalChunks = Math.ceil(download.size / splitSize);
|
|
176
|
+
let uploadResult;
|
|
177
|
+
if (!(0, fs_1.existsSync)(download.path)) {
|
|
178
|
+
sub.error(new Error(`文件不存在或已删除`));
|
|
179
|
+
return;
|
|
180
|
+
}
|
|
181
|
+
const stats = (0, fs_1.statSync)(download.path);
|
|
182
|
+
if (stats.size !== download.size) {
|
|
183
|
+
sub.error(new Error(`文件与预计大小不一致`));
|
|
184
|
+
return;
|
|
185
|
+
}
|
|
186
|
+
do {
|
|
187
|
+
let start = index * splitSize;
|
|
188
|
+
let _end = start + splitSize - 1;
|
|
189
|
+
let end = _end > max ? max : _end;
|
|
190
|
+
if (end >= max) {
|
|
191
|
+
complete = true;
|
|
192
|
+
}
|
|
193
|
+
const fileStream = (0, fs_1.createReadStream)(download.path, { start: start, end: end });
|
|
194
|
+
const formdata = new form_data_1.default();
|
|
195
|
+
formdata.append('ctrl', fileStream);
|
|
196
|
+
formdata.append('isFreeVer', this.encodeURIComponent(false));
|
|
197
|
+
formdata.append('aid', this.encodeURIComponent(fkAccount.aid));
|
|
198
|
+
formdata.append('folderId', this.encodeURIComponent(fkAccount.uploadGroupId));
|
|
199
|
+
formdata.append('fileName', download.filename);
|
|
200
|
+
formdata.append(`totalSize`, this.encodeURIComponent(download.size));
|
|
201
|
+
formdata.append(`fileMd5`, download.md5);
|
|
202
|
+
formdata.append('index', this.encodeURIComponent(index));
|
|
203
|
+
formdata.append('chunkSize', this.encodeURIComponent(splitSize));
|
|
204
|
+
formdata.append('totalChunks', this.encodeURIComponent(totalChunks));
|
|
205
|
+
formdata.append(`complete`, this.encodeURIComponent(complete));
|
|
206
|
+
const bssInfo = {
|
|
207
|
+
fromSite: true, siteId: 0, groupId: 0, fileSizeLimit: 1024
|
|
208
|
+
};
|
|
209
|
+
formdata.append('bssInfo', JSON.stringify(bssInfo));
|
|
210
|
+
const headers = formdata.getHeaders();
|
|
211
|
+
uploadResult = await this.axios.post(uploadUrl, formdata, {
|
|
212
|
+
headers: {
|
|
213
|
+
...headers,
|
|
214
|
+
Cookie: cookies
|
|
215
|
+
},
|
|
216
|
+
timeout: 18000
|
|
217
|
+
}).then(res => {
|
|
218
|
+
return res.data;
|
|
219
|
+
}).catch((e) => {
|
|
220
|
+
sub.error(e);
|
|
221
|
+
});
|
|
222
|
+
if (uploadResult.code !== 200) {
|
|
223
|
+
if (uploadResult.data) {
|
|
224
|
+
const data = uploadResult.data;
|
|
225
|
+
if (data.limit) {
|
|
226
|
+
// to big
|
|
227
|
+
sub.error(`文件太大上传失败`);
|
|
228
|
+
break;
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
sub.error(new Error(uploadResult.msg));
|
|
232
|
+
break;
|
|
233
|
+
}
|
|
234
|
+
if (uploadResult) {
|
|
235
|
+
const data = uploadResult.data;
|
|
236
|
+
const fullDownUrl = data.fullDownUrl;
|
|
237
|
+
if (fullDownUrl) {
|
|
238
|
+
if (fullDownUrl.startsWith('https://site-upload')) {
|
|
239
|
+
sub.error(new Error(`need re bind`));
|
|
240
|
+
break;
|
|
241
|
+
}
|
|
242
|
+
const fullUrl = fullDownUrl.startsWith('http') ? fullDownUrl : `https:` + fullDownUrl;
|
|
243
|
+
sub.next({
|
|
244
|
+
url: fullUrl,
|
|
245
|
+
index,
|
|
246
|
+
totalChunks,
|
|
247
|
+
filename: download.filename,
|
|
248
|
+
start,
|
|
249
|
+
splitSize,
|
|
250
|
+
end,
|
|
251
|
+
size: download.size
|
|
252
|
+
});
|
|
253
|
+
complete = true;
|
|
254
|
+
break;
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
sub.next({
|
|
258
|
+
url: undefined,
|
|
259
|
+
index,
|
|
260
|
+
totalChunks,
|
|
261
|
+
filename: download.filename,
|
|
262
|
+
start,
|
|
263
|
+
splitSize,
|
|
264
|
+
end,
|
|
265
|
+
size: download.size
|
|
266
|
+
});
|
|
267
|
+
index = index + 1;
|
|
268
|
+
} while (!complete);
|
|
269
|
+
// upload complete
|
|
270
|
+
this.axios.post(`https://${fkAccount.mainUsername}.vip.webportal.top/ajax/advanceUpload.jsp?cmd=_report&_TOKEN=${info.token}`, this.encodeURIComponent({
|
|
271
|
+
type: 1,
|
|
272
|
+
size: download.size,
|
|
273
|
+
time: NaN,
|
|
274
|
+
flag: true,
|
|
275
|
+
name: download.filename
|
|
276
|
+
}), {
|
|
277
|
+
headers: {
|
|
278
|
+
[`Content-Type`]: `application/x-www-form-urlencoded; charset=UTF-8`,
|
|
279
|
+
Cookie: fkAccount.cookies
|
|
280
|
+
}
|
|
281
|
+
});
|
|
282
|
+
sub.complete();
|
|
283
|
+
return uploadResult;
|
|
284
|
+
};
|
|
285
|
+
upload();
|
|
286
|
+
return sub;
|
|
287
|
+
}
|
|
288
|
+
getBssInfo() {
|
|
289
|
+
return {
|
|
290
|
+
fromSite: true, siteId: 0, groupId: 0, fileSizeLimit: 1024
|
|
291
|
+
};
|
|
292
|
+
}
|
|
293
|
+
getUploadInfourl(accessToken) {
|
|
294
|
+
return `https://${accessToken.url}/${accessToken.visitType}/${accessToken.app}/advance/info?cmd=${accessToken.cmd}&token=${accessToken.token}`;
|
|
295
|
+
}
|
|
296
|
+
decode(base64Str) {
|
|
297
|
+
if (!base64Str)
|
|
298
|
+
return;
|
|
299
|
+
const t = base64Str.replace(/_/g, "/").replace(/-/g, "+");
|
|
300
|
+
const f = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
|
|
301
|
+
let l = 0;
|
|
302
|
+
let p = 0;
|
|
303
|
+
let h = [];
|
|
304
|
+
do {
|
|
305
|
+
const o = f.indexOf(t.charAt(l++));
|
|
306
|
+
const u = f.indexOf(t.charAt(l++));
|
|
307
|
+
const a = f.indexOf(t.charAt(l++));
|
|
308
|
+
const c = f.indexOf(t.charAt(l++));
|
|
309
|
+
const s = o << 18 | u << 12 | a << 6 | c;
|
|
310
|
+
const e = s >> 16 & 255;
|
|
311
|
+
const r = s >> 8 & 255;
|
|
312
|
+
const n = 255 & s;
|
|
313
|
+
h[p++] = 64 === a ? String.fromCharCode(e) : 64 === c ? String.fromCharCode(e, r) : String.fromCharCode(e, r, n);
|
|
314
|
+
} while (l < t.length);
|
|
315
|
+
return h.join('');
|
|
316
|
+
}
|
|
317
|
+
};
|
|
318
|
+
FkService = tslib_1.__decorate([
|
|
319
|
+
(0, core_1.Injectable)(),
|
|
320
|
+
tslib_1.__metadata("design:paramtypes", [axios_1.Axios, typeorm_1.Db])
|
|
321
|
+
], FkService);
|
|
322
|
+
exports.FkService = FkService;
|
|
323
|
+
// MIGfMA0GCSqGSxx3DQEBAQUAA4GNADCBiQKBgQCBWNoG5LJ3u44Gs8PWs1MaNUQQ+mOmh+9zWdzSt3ORbmfCDvU+ssW/6QTTgXvWWx7+Wzq/a4fCCQp72zSqXeVhWkTVct9Hyp/iMo5K6qOEK76z9z+tP/u99X6qazeXGVMWKkPiyZT4mKAGd/U8Mph9Z1Z5kOluA7g7heq8PPlE9wIDAQAB
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { Injector } from "@nger/core";
|
|
2
|
+
import { Db } from "@nger/typeorm";
|
|
3
|
+
import { Axios } from '@nger/axios';
|
|
4
|
+
import { CryptoService } from '@nger/utils';
|
|
5
|
+
import { CookieJar } from 'tough-cookie';
|
|
6
|
+
export declare class FkLoginService {
|
|
7
|
+
private db;
|
|
8
|
+
private axios;
|
|
9
|
+
private jar;
|
|
10
|
+
private crypto;
|
|
11
|
+
private injector;
|
|
12
|
+
constructor(db: Db, axios: Axios, jar: CookieJar, crypto: CryptoService, injector: Injector);
|
|
13
|
+
preLogin(): Promise<any>;
|
|
14
|
+
tryLogin(uid: number, token?: string): Promise<any>;
|
|
15
|
+
private loginSuccess;
|
|
16
|
+
private toUrl;
|
|
17
|
+
}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.FkLoginService = void 0;
|
|
4
|
+
const tslib_1 = require("tslib");
|
|
5
|
+
const core_1 = require("@nger/core");
|
|
6
|
+
const typeorm_1 = require("@nger/typeorm");
|
|
7
|
+
const fk_account_1 = require("../entities/fk-account");
|
|
8
|
+
const axios_1 = require("@nger/axios");
|
|
9
|
+
const utils_1 = require("@nger/utils");
|
|
10
|
+
const tough_cookie_1 = require("tough-cookie");
|
|
11
|
+
let FkLoginService = class FkLoginService {
|
|
12
|
+
db;
|
|
13
|
+
axios;
|
|
14
|
+
jar;
|
|
15
|
+
crypto;
|
|
16
|
+
injector;
|
|
17
|
+
constructor(db, axios, jar, crypto, injector) {
|
|
18
|
+
this.db = db;
|
|
19
|
+
this.axios = axios;
|
|
20
|
+
this.jar = jar;
|
|
21
|
+
this.crypto = crypto;
|
|
22
|
+
this.injector = injector;
|
|
23
|
+
}
|
|
24
|
+
async preLogin() {
|
|
25
|
+
const url = `https://adm.webportal.top/ajax/login_h.jsp?cmd=initLoginConf`;
|
|
26
|
+
return this.axios.request({
|
|
27
|
+
url,
|
|
28
|
+
method: 'post',
|
|
29
|
+
responseType: 'json',
|
|
30
|
+
headers: {
|
|
31
|
+
[`Content-Type`]: `application/x-www-form-urlencoded; charset=UTF-8`
|
|
32
|
+
}
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
async tryLogin(uid, token) {
|
|
36
|
+
const url = `https://adm.webportal.top/ajax/login_h.jsp?cmd=loginCorp`;
|
|
37
|
+
const account = await this.db.manager.findOneOrFail(fk_account_1.FkAccount, { where: { id: uid } });
|
|
38
|
+
const data = {
|
|
39
|
+
cacct: account.mainUsername,
|
|
40
|
+
pwd: this.crypto.md5(account.password),
|
|
41
|
+
sacct: account.childUsername,
|
|
42
|
+
autoLogin: true,
|
|
43
|
+
staffLogin: true,
|
|
44
|
+
checkSign: token
|
|
45
|
+
};
|
|
46
|
+
const res = await this.axios.request({
|
|
47
|
+
url,
|
|
48
|
+
data: this.toUrl(data),
|
|
49
|
+
responseType: 'json',
|
|
50
|
+
method: 'post',
|
|
51
|
+
headers: {
|
|
52
|
+
[`Content-Type`]: `application/x-www-form-urlencoded; charset=UTF-8`
|
|
53
|
+
}
|
|
54
|
+
});
|
|
55
|
+
await this.loginSuccess(uid, data.pwd);
|
|
56
|
+
return res;
|
|
57
|
+
}
|
|
58
|
+
async loginSuccess(uid, pass) {
|
|
59
|
+
const url = `https://adm.webportal.top`;
|
|
60
|
+
// const url = `https://i.vip.webportal.top/?siteId=0`
|
|
61
|
+
const e = pass;
|
|
62
|
+
let t = 0;
|
|
63
|
+
/\d/.test(e) && t++;
|
|
64
|
+
(/[a-z]/.test(e) || /[A-Z]/.test(e)) && t++;
|
|
65
|
+
(/\W/.test(e) || /[_]/.test(e)) && t++;
|
|
66
|
+
e.length < 8 && (t = 0);
|
|
67
|
+
let faiIng;
|
|
68
|
+
if (t < 2) {
|
|
69
|
+
faiIng = `1`;
|
|
70
|
+
}
|
|
71
|
+
else {
|
|
72
|
+
faiIng = `0`;
|
|
73
|
+
}
|
|
74
|
+
const currentUrl = `https://adm.webportal.top`;
|
|
75
|
+
await this.axios.request({
|
|
76
|
+
url,
|
|
77
|
+
headers: {
|
|
78
|
+
[`Content-Type`]: `text/plain`,
|
|
79
|
+
}
|
|
80
|
+
}).then(res => res.data);
|
|
81
|
+
const cookie = await this.jar.getCookieString(url);
|
|
82
|
+
await this.db.manager.update(fk_account_1.FkAccount, uid, { cookies: cookie + ';hasShowDomainBeianWindow=;hasShowBeianSmsTips=;faiIng=0' });
|
|
83
|
+
}
|
|
84
|
+
toUrl(data) {
|
|
85
|
+
return Object.keys(data).map(key => {
|
|
86
|
+
const value = Reflect.get(data, key);
|
|
87
|
+
return `${key}=${value}`;
|
|
88
|
+
}).join('&');
|
|
89
|
+
}
|
|
90
|
+
};
|
|
91
|
+
FkLoginService = tslib_1.__decorate([
|
|
92
|
+
(0, core_1.Injectable)(),
|
|
93
|
+
tslib_1.__metadata("design:paramtypes", [typeorm_1.Db, axios_1.Axios, tough_cookie_1.CookieJar, utils_1.CryptoService, core_1.Injector])
|
|
94
|
+
], FkLoginService);
|
|
95
|
+
exports.FkLoginService = FkLoginService;
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { Injector } from "@nger/core";
|
|
2
|
+
import { Db } from "@nger/typeorm";
|
|
3
|
+
export declare class UploadService {
|
|
4
|
+
private injector;
|
|
5
|
+
private db;
|
|
6
|
+
constructor(injector: Injector, db: Db);
|
|
7
|
+
startUpload(id: number): Promise<void>;
|
|
8
|
+
start(id: number): Promise<void>;
|
|
9
|
+
starts(ids: number[]): Promise<void[]>;
|
|
10
|
+
continue(id: number): Promise<void>;
|
|
11
|
+
stop(id: number): Promise<void>;
|
|
12
|
+
stops(ids: number[]): Promise<void[]>;
|
|
13
|
+
}
|