@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.
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 +18 -14
  62. package/pnpm-lock.yaml +36 -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 -254
  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
+ }