@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.
Files changed (128) hide show
  1. package/dist/{templates → controllers}/code.d.ts +0 -0
  2. package/dist/{templates → controllers}/code.js +2 -1
  3. package/dist/controllers/relogin.d.ts +8 -0
  4. package/dist/controllers/relogin.js +42 -0
  5. package/dist/{templates → controllers}/verify.d.ts +0 -0
  6. package/dist/{templates → controllers}/verify.js +0 -0
  7. package/dist/entities/check-task.d.ts +13 -0
  8. package/dist/entities/check-task.js +221 -0
  9. package/dist/entities/download-task.d.ts +23 -0
  10. package/dist/entities/download-task.js +445 -0
  11. package/dist/entities/effect-task.d.ts +12 -0
  12. package/dist/entities/effect-task.js +207 -0
  13. package/dist/entities/fk-account.d.ts +16 -0
  14. package/dist/entities/fk-account.js +295 -0
  15. package/dist/entities/fk-jiqun.d.ts +5 -0
  16. package/dist/entities/fk-jiqun.js +56 -0
  17. package/dist/entities/upload-task.d.ts +15 -0
  18. package/dist/entities/upload-task.js +333 -0
  19. package/dist/entities/w7-account.d.ts +11 -0
  20. package/dist/entities/w7-account.js +126 -0
  21. package/dist/entities/w7.d.ts +10 -0
  22. package/dist/entities/w7.js +107 -0
  23. package/dist/entities/w7_chat_topic.d.ts +9 -0
  24. package/dist/entities/w7_chat_topic.js +58 -0
  25. package/dist/entities/w7_uni_account.d.ts +4 -0
  26. package/dist/entities/w7_uni_account.js +23 -0
  27. package/dist/fk-upload.module.d.ts +5 -0
  28. package/dist/fk-upload.module.js +76 -43
  29. package/dist/main.d.ts +1 -0
  30. package/dist/main.js +18 -29
  31. package/dist/services/check.service.d.ts +6 -0
  32. package/dist/services/check.service.js +32 -0
  33. package/dist/services/client.service.d.ts +6 -0
  34. package/dist/services/client.service.js +29 -0
  35. package/dist/services/download.service.d.ts +15 -0
  36. package/dist/services/download.service.js +139 -0
  37. package/dist/services/effect.service.d.ts +7 -0
  38. package/dist/services/effect.service.js +34 -0
  39. package/dist/services/fk.service.d.ts +24 -0
  40. package/dist/services/fk.service.js +323 -0
  41. package/dist/services/login.service.d.ts +17 -0
  42. package/dist/services/login.service.js +95 -0
  43. package/dist/services/upload.service.d.ts +13 -0
  44. package/dist/services/upload.service.js +100 -0
  45. package/dist/tasks/actions.d.ts +28 -0
  46. package/dist/tasks/actions.js +12 -0
  47. package/dist/{templates/tasks/schedule-task.d.ts → tasks/check-task.d.ts} +3 -5
  48. package/dist/tasks/check-task.js +205 -0
  49. package/dist/tasks/download-continue-task.d.ts +9 -0
  50. package/dist/tasks/download-continue-task.js +127 -0
  51. package/dist/{templates/tasks → tasks}/download-task.d.ts +0 -1
  52. package/dist/tasks/download-task.js +128 -0
  53. package/dist/{templates/tasks → tasks}/effect-task.d.ts +1 -1
  54. package/dist/tasks/effect-task.js +111 -0
  55. package/dist/{templates/tasks → tasks}/providers.d.ts +0 -0
  56. package/dist/{templates/tasks → tasks}/providers.js +11 -5
  57. package/dist/tasks/upload-continue-task.d.ts +8 -0
  58. package/dist/tasks/upload-continue-task.js +114 -0
  59. package/dist/{templates/tasks → tasks}/upload-task.d.ts +0 -0
  60. package/dist/tasks/upload-task.js +114 -0
  61. package/package.json +17 -14
  62. package/pnpm-lock.yaml +34 -1435
  63. package/dist/electon.d.ts +0 -3
  64. package/dist/electon.js +0 -80
  65. package/dist/entities/fk-download-task.entity.d.ts +0 -18
  66. package/dist/entities/fk-download-task.entity.js +0 -142
  67. package/dist/entities/fk-login-cookie.entity.d.ts +0 -7
  68. package/dist/entities/fk-login-cookie.entity.js +0 -46
  69. package/dist/entities/fk-login.entity.d.ts +0 -12
  70. package/dist/entities/fk-login.entity.js +0 -80
  71. package/dist/entities/index.d.ts +0 -3
  72. package/dist/entities/index.js +0 -6
  73. package/dist/login.controller.d.ts +0 -14
  74. package/dist/login.controller.js +0 -197
  75. package/dist/mq-runner.d.ts +0 -5
  76. package/dist/mq-runner.js +0 -19
  77. package/dist/static/task-manage.d.ts +0 -6
  78. package/dist/static/task-manage.js +0 -34
  79. package/dist/templates/add-fk-login.d.ts +0 -12
  80. package/dist/templates/add-fk-login.js +0 -93
  81. package/dist/templates/add-task.d.ts +0 -13
  82. package/dist/templates/add-task.js +0 -78
  83. package/dist/templates/check-upload.d.ts +0 -38
  84. package/dist/templates/check-upload.js +0 -195
  85. package/dist/templates/component.d.ts +0 -10
  86. package/dist/templates/component.js +0 -39
  87. package/dist/templates/error.d.ts +0 -4
  88. package/dist/templates/error.js +0 -27
  89. package/dist/templates/help.d.ts +0 -7
  90. package/dist/templates/help.js +0 -52
  91. package/dist/templates/player.d.ts +0 -4
  92. package/dist/templates/player.js +0 -23
  93. package/dist/templates/setting.d.ts +0 -13
  94. package/dist/templates/setting.js +0 -65
  95. package/dist/templates/task-manage.d.ts +0 -21
  96. package/dist/templates/task-manage.js +0 -314
  97. package/dist/templates/tasks/actions.d.ts +0 -44
  98. package/dist/templates/tasks/actions.js +0 -9
  99. package/dist/templates/tasks/check-task.d.ts +0 -8
  100. package/dist/templates/tasks/check-task.js +0 -89
  101. package/dist/templates/tasks/download-task.js +0 -130
  102. package/dist/templates/tasks/effect-task.js +0 -76
  103. package/dist/templates/tasks/fk.service.d.ts +0 -28
  104. package/dist/templates/tasks/fk.service.js +0 -256
  105. package/dist/templates/tasks/schedule-task.js +0 -94
  106. package/dist/templates/tasks/task.service.d.ts +0 -11
  107. package/dist/templates/tasks/task.service.js +0 -114
  108. package/dist/templates/tasks/upload-task.js +0 -97
  109. package/dist/templates/tasks/yasuo-task.d.ts +0 -0
  110. package/dist/templates/tasks/yasuo-task.js +0 -0
  111. package/dist/templates/upload-task.d.ts +0 -9
  112. package/dist/templates/upload-task.js +0 -141
  113. package/dist/templates/upload.d.ts +0 -16
  114. package/dist/templates/upload.js +0 -232
  115. package/dist/urlSafeBase64Decode.d.ts +0 -3
  116. package/dist/urlSafeBase64Decode.js +0 -32
  117. package/electron/.env +0 -32
  118. package/electron/package.json +0 -31
  119. package/electron/pnpm-lock.yaml +0 -2878
  120. package/fk-upload-pc/.vscode/extensions.json +0 -3
  121. package/fk-upload-pc/README.md +0 -16
  122. package/fk-upload-pc/index.html +0 -13
  123. package/fk-upload-pc/package.json +0 -19
  124. package/fk-upload-pc/pnpm-lock.yaml +0 -489
  125. package/fk-upload-pc/public/favicon.ico +0 -0
  126. package/fk-upload-pc/tsconfig.json +0 -18
  127. package/fk-upload-pc/tsconfig.node.json +0 -8
  128. 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,7 @@
1
+ import { Injector } from "@nger/core";
2
+ export declare class EffectService {
3
+ private injector;
4
+ constructor(injector: Injector);
5
+ starts(ids: number[]): Promise<void[]>;
6
+ start(id: number): Promise<void>;
7
+ }
@@ -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
+ }