@nger/fk-upload 1.0.202 → 1.0.203
Sign up to get free protection for your applications and to get access to all the features.
- 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 +17 -14
- package/pnpm-lock.yaml +34 -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 -256
- 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
|
+
}
|