c-capcut 1.0.0

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.
@@ -0,0 +1,37 @@
1
+ <svg width="160" height="160" viewBox="0 0 160 160" fill="none" xmlns="http://www.w3.org/2000/svg" role="img" aria-label="BROM4KER - CapCut Account Creator">
2
+ <defs>
3
+ <linearGradient id="brand" x1="0" y1="0" x2="160" y2="160" gradientUnits="userSpaceOnUse">
4
+ <stop offset="0" stop-color="#00D4AA"/>
5
+ <stop offset="0.5" stop-color="#0092F8"/>
6
+ <stop offset="1" stop-color="#CC3AFF"/>
7
+ </linearGradient>
8
+ <linearGradient id="screen" x1="24" y1="34" x2="136" y2="126" gradientUnits="userSpaceOnUse">
9
+ <stop offset="0" stop-color="#0d1b2a"/>
10
+ <stop offset="1" stop-color="#10263b"/>
11
+ </linearGradient>
12
+ </defs>
13
+
14
+ <!-- outer rounded badge -->
15
+ <rect x="4" y="4" width="152" height="152" rx="34" fill="url(#brand)"/>
16
+ <rect x="9" y="9" width="142" height="142" rx="29" fill="#0a1622"/>
17
+
18
+ <!-- terminal window -->
19
+ <rect x="26" y="34" width="108" height="80" rx="12" fill="url(#screen)" stroke="url(#brand)" stroke-width="2.5"/>
20
+
21
+ <!-- title bar dots -->
22
+ <circle cx="40" cy="48" r="3.4" fill="#00D4AA"/>
23
+ <circle cx="52" cy="48" r="3.4" fill="#0092F8"/>
24
+ <circle cx="64" cy="48" r="3.4" fill="#CC3AFF"/>
25
+ <line x1="26" y1="59" x2="134" y2="59" stroke="#1d3650" stroke-width="2"/>
26
+
27
+ <!-- prompt arrow + command line -->
28
+ <path d="M40 74 L48 81 L40 88" stroke="#00D4AA" stroke-width="4" stroke-linecap="round" stroke-linejoin="round" fill="none"/>
29
+ <rect x="56" y="77" width="42" height="6" rx="3" fill="#2b4a6b"/>
30
+
31
+ <!-- play / video button (CapCut) inside chat bubble -->
32
+ <path d="M70 95 h40 a8 8 0 0 1 8 8 v10 a8 8 0 0 1 -8 8 h-26 l-10 9 v-9 h-4 a8 8 0 0 1 -8 -8 v-10 a8 8 0 0 1 8 -8 z" fill="url(#brand)"/>
33
+ <path d="M85 103 L85 117 L98 110 Z" fill="#0a1622"/>
34
+
35
+ <!-- brand mark -->
36
+ <text x="80" y="140" text-anchor="middle" font-family="'Segoe UI', Arial, sans-serif" font-size="15" font-weight="700" letter-spacing="1.5" fill="url(#brand)">BROM4KER</text>
37
+ </svg>
package/config.json ADDED
@@ -0,0 +1,24 @@
1
+ {
2
+ "password": "@RyotaXD666",
3
+ "batchSize": 5,
4
+ "otp": {
5
+ "timeout": 90000,
6
+ "pollInterval": 4000
7
+ },
8
+ "account": {
9
+ "apiUrl": "https://mail.gopretstudio.com",
10
+ "apiKey": "GOMAIL-FqcmbaAGbPnwHIxKElNq"
11
+ },
12
+ "capcut": {
13
+ "aid": "348188",
14
+ "sdkVersion": "2.1.10-tiktok",
15
+ "language": "en",
16
+ "region": "ID",
17
+ "loginDomain": "https://login-row.www.capcut.com"
18
+ },
19
+ "paths": {
20
+ "accounts": "./data/accounts.json",
21
+ "result": "./data/result.txt",
22
+ "emailDb": "./data/email-db.json"
23
+ }
24
+ }
@@ -0,0 +1,67 @@
1
+ [
2
+ {
3
+ "email": "gracelangosh@gomal.tech",
4
+ "password": "@RyotaXD666",
5
+ "firstName": "Grace",
6
+ "lastName": "Langosh",
7
+ "fullName": "Grace Langosh",
8
+ "userId": "7660187678751835144",
9
+ "screenName": "user4678517275765",
10
+ "birthday": "1996-05-07",
11
+ "sessionId": "89e4f10e678cc341e95231ba7190f753",
12
+ "status": "verified",
13
+ "createdAt": "2026-07-08T16:00:50.571Z"
14
+ },
15
+ {
16
+ "email": "chanellewiegand@xaexi.tech",
17
+ "password": "@RyotaXD666",
18
+ "firstName": "Chanelle",
19
+ "lastName": "Wiegand",
20
+ "fullName": "Chanelle Wiegand",
21
+ "userId": "7660187688998192135",
22
+ "screenName": "user3861324712341",
23
+ "birthday": "2000-09-17",
24
+ "sessionId": "1eda562da6f6a7f0697dc0f6451fbf84",
25
+ "status": "verified",
26
+ "createdAt": "2026-07-08T16:00:51.426Z"
27
+ },
28
+ {
29
+ "email": "annettebechtelar@srimuna.me",
30
+ "password": "@RyotaXD666",
31
+ "firstName": "Annette",
32
+ "lastName": "Bechtelar",
33
+ "fullName": "Annette Bechtelar",
34
+ "userId": "7660187698103927826",
35
+ "screenName": "user145519814034",
36
+ "birthday": "1999-09-28",
37
+ "sessionId": "5f88601e7ae3776dae93d76fb2f1dc15",
38
+ "status": "verified",
39
+ "createdAt": "2026-07-08T16:00:55.042Z"
40
+ },
41
+ {
42
+ "email": "hunternitzsche@neoxr.me",
43
+ "password": "@RyotaXD666",
44
+ "firstName": "Hunter",
45
+ "lastName": "Nitzsche",
46
+ "fullName": "Hunter Nitzsche",
47
+ "userId": "7660187978908255239",
48
+ "screenName": "user7071707386842",
49
+ "birthday": "2002-09-26",
50
+ "sessionId": "1d08cae3f3501b28a34bad5d3c92976f",
51
+ "status": "verified",
52
+ "createdAt": "2026-07-08T16:01:57.667Z"
53
+ },
54
+ {
55
+ "email": "alessandraryan@xaexi.tech",
56
+ "password": "@RyotaXD666",
57
+ "firstName": "Alessandra",
58
+ "lastName": "Ryan",
59
+ "fullName": "Alessandra Ryan",
60
+ "userId": "7660188019534398472",
61
+ "screenName": "user8161059310383",
62
+ "birthday": "2003-06-01",
63
+ "sessionId": "f4a259097f28507c3db6a3980d669687",
64
+ "status": "verified",
65
+ "createdAt": "2026-07-08T16:02:06.605Z"
66
+ }
67
+ ]
@@ -0,0 +1,7 @@
1
+ [
2
+ "gracelangosh@gomal.tech",
3
+ "chanellewiegand@xaexi.tech",
4
+ "annettebechtelar@srimuna.me",
5
+ "hunternitzsche@neoxr.me",
6
+ "alessandraryan@xaexi.tech"
7
+ ]
@@ -0,0 +1,5 @@
1
+ gracelangosh@gomal.tech @RyotaXD666 Grace Langosh
2
+ alessandraryan@xaexi.tech @RyotaXD666 Alessandra Ryan
3
+ hunternitzsche@neoxr.me @RyotaXD666 Hunter Nitzsche
4
+ chanellewiegand@xaexi.tech @RyotaXD666 Chanelle Wiegand
5
+ annettebechtelar@srimuna.me @RyotaXD666 Annette Bechtelar
package/index.js ADDED
@@ -0,0 +1,42 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * BROM4KER - CapCut Account Creator
4
+ *
5
+ * Commands:
6
+ * npm run create Create accounts (interactive)
7
+ * npm run export Export accounts to data/result.txt
8
+ */
9
+
10
+ import chalk from "chalk";
11
+ import { cmdCreate } from "./src/commands/create.js";
12
+ import { cmdExport } from "./src/commands/export.js";
13
+ import { printBanner } from "./src/ui/banner.js";
14
+
15
+ const [, , command] = process.argv;
16
+
17
+ try {
18
+ switch (command) {
19
+ case "create":
20
+ await cmdCreate();
21
+ break;
22
+ case "export":
23
+ await cmdExport();
24
+ break;
25
+ default:
26
+ printBanner();
27
+ console.log(`\n${chalk.bold.white(" Commands:")}\n`);
28
+ const cmds = [
29
+ ["npm run create", "Create new CapCut accounts (interactive)"],
30
+ ["npm run export", "Export accounts to data/result.txt"],
31
+ ];
32
+ cmds.forEach(([cmd, desc]) =>
33
+ console.log(
34
+ ` ${chalk.hex("#00D4AA")(cmd.padEnd(24))} ${chalk.gray("→")} ${chalk.white(desc)}`,
35
+ ),
36
+ );
37
+ console.log();
38
+ }
39
+ } catch (err) {
40
+ console.error(chalk.red(`\n ✖ Fatal: ${err.message}`));
41
+ process.exit(1);
42
+ }
package/package.json ADDED
@@ -0,0 +1,13 @@
1
+ {
2
+ "name": "c-capcut",
3
+ "version": "1.0.0",
4
+ "type": "module",
5
+ "bin": {
6
+ "capcut": "./index.js"
7
+ },
8
+ "dependencies": {
9
+ "@faker-js/faker": "^10.5.0",
10
+ "chalk": "^5.6.2",
11
+ "figlet": "^1.11.0"
12
+ }
13
+ }
@@ -0,0 +1,271 @@
1
+ /**
2
+ * commands/create.js
3
+ * Command: npm run create
4
+ * Create N CapCut accounts in parallel with worker pool.
5
+ */
6
+
7
+ import chalk from "chalk";
8
+ import readline from "readline";
9
+ import { writeFileSync, existsSync, unlinkSync } from "fs";
10
+ import { resolve } from "path";
11
+ import {
12
+ BATCH_SIZE,
13
+ RESULT_FILE,
14
+ PASSWORD,
15
+ ACCOUNT_API_URL,
16
+ ACCOUNT_API_KEY,
17
+ OTP_TIMEOUT,
18
+ OTP_POLL,
19
+ } from "../config.js";
20
+ import { createAccountGenerator } from "../lib/email-gen.js";
21
+ import { createOtpWaiter } from "../lib/otp.js";
22
+ import { registerAccount, TOTAL_STEPS } from "../lib/capcut.js";
23
+ import {
24
+ saveAccount,
25
+ clearAccounts,
26
+ isEmailUsed,
27
+ saveEmailToDb,
28
+ } from "../lib/storage.js";
29
+ import {
30
+ printBanner,
31
+ printSection,
32
+ printField,
33
+ printResult,
34
+ printSaved,
35
+ } from "../ui/banner.js";
36
+ import { LiveDisplay } from "../ui/display.js";
37
+
38
+ // ─── Helper: Prompt Input ─────────────────────────────────────────────────────
39
+
40
+ function ask(question) {
41
+ const rl = readline.createInterface({
42
+ input: process.stdin,
43
+ output: process.stdout,
44
+ });
45
+ return new Promise((resolve) =>
46
+ rl.question(question, (ans) => {
47
+ rl.close();
48
+ resolve(ans.trim());
49
+ }),
50
+ );
51
+ }
52
+
53
+ function sleep(ms) {
54
+ return new Promise((resolve) => setTimeout(resolve, ms));
55
+ }
56
+
57
+ // ─── Auto-Export ──────────────────────────────────────────────────────────────
58
+
59
+ function autoExport(allResults) {
60
+ if (allResults.length === 0) return;
61
+ const lines = allResults.map(
62
+ (acc) =>
63
+ `${acc.email}\t${acc.password}\t${acc.fullName || acc.firstName || "-"}`,
64
+ );
65
+ writeFileSync(resolve(RESULT_FILE), lines.join("\n"), "utf-8");
66
+ }
67
+
68
+ // ─── Format Duration ──────────────────────────────────────────────────────────
69
+
70
+ function formatDuration(ms) {
71
+ const s = Math.floor(ms / 1000) % 60;
72
+ const m = Math.floor(ms / 60000);
73
+ if (m > 0) return `${m}m ${s}s`;
74
+ return `${s}s`;
75
+ }
76
+
77
+ // ─── Main Command ─────────────────────────────────────────────────────────────
78
+
79
+ export async function cmdCreate() {
80
+ printBanner();
81
+
82
+ // ─── CONFIGURATION ─────────────────────────────────────────────────────
83
+ printSection("CONFIGURATION");
84
+
85
+ const countInput = await ask(
86
+ chalk.hex("#00D4AA")(" | ") +
87
+ chalk.hex("#00D4AA")("❯ ") +
88
+ chalk.white("How many accounts to create? "),
89
+ );
90
+ const count = Math.max(1, parseInt(countInput) || 1);
91
+
92
+ const emailSuffix = await ask(
93
+ chalk.hex("#00D4AA")(" | ") +
94
+ chalk.hex("#00D4AA")("❯ ") +
95
+ chalk.white("Email suffix (leave empty for none): "),
96
+ );
97
+
98
+ // ─── INFO ──────────────────────────────────────────────────────────────
99
+ printSection("INFO");
100
+
101
+ const suffixDisplay = emailSuffix
102
+ ? chalk.white(`"${emailSuffix}"`) +
103
+ chalk.gray(` → e.g. johndoe${emailSuffix}@domain.xyz`)
104
+ : chalk.gray("none");
105
+
106
+ printField(
107
+ chalk.hex("#00D4AA")("✓"),
108
+ chalk.gray("Accounts: ") +
109
+ chalk.white.bold(count) +
110
+ chalk.gray(" │ Workers: ") +
111
+ chalk.white.bold(Math.min(count, BATCH_SIZE)) +
112
+ chalk.gray(" │ Steps: ") +
113
+ chalk.white.bold(TOTAL_STEPS),
114
+ );
115
+ printField(
116
+ chalk.hex("#00D4AA")("✓"),
117
+ chalk.gray("API: ") + chalk.hex("#00A8DE")(ACCOUNT_API_URL),
118
+ );
119
+ printField(chalk.hex("#00D4AA")("✓"), chalk.gray("Suffix: ") + suffixDisplay);
120
+
121
+ // ─── Clear Old Data ────────────────────────────────────────────────────
122
+ await clearAccounts();
123
+ const resultPath = resolve(RESULT_FILE);
124
+ if (existsSync(resultPath)) unlinkSync(resultPath);
125
+ printField(chalk.hex("#FFD700")("⟳"), chalk.gray("Previous data cleared"));
126
+
127
+ // ─── Initialize Factories ──────────────────────────────────────────────
128
+ const generateAccount = createAccountGenerator({
129
+ apiUrl: ACCOUNT_API_URL,
130
+ apiKey: ACCOUNT_API_KEY,
131
+ password: PASSWORD,
132
+ suffix: emailSuffix,
133
+ });
134
+
135
+ const waitForOtp = createOtpWaiter({
136
+ apiUrl: ACCOUNT_API_URL,
137
+ apiKey: ACCOUNT_API_KEY,
138
+ timeout: OTP_TIMEOUT,
139
+ pollInterval: OTP_POLL,
140
+ });
141
+
142
+ // ─── PROCESSING ────────────────────────────────────────────────────────
143
+ printSection("PROCESSING");
144
+
145
+ const workerCount = Math.min(count, BATCH_SIZE);
146
+ let nextAccountIndex = 0;
147
+ let totalSuccess = 0;
148
+ const allResults = new Array(count);
149
+ const startTime = Date.now();
150
+
151
+ const liveDisplay = new LiveDisplay(count);
152
+ liveDisplay.initialRender();
153
+
154
+ const workers = Array.from({ length: workerCount }, () =>
155
+ (async () => {
156
+ while (true) {
157
+ if (nextAccountIndex >= count) return;
158
+ const accountIndex = nextAccountIndex++;
159
+
160
+ const MAX_RETRIES = 3;
161
+ let success = false;
162
+
163
+ for (let retry = 0; retry < MAX_RETRIES && !success; retry++) {
164
+ let account;
165
+
166
+ try {
167
+ liveDisplay.updateRow(accountIndex, {
168
+ email: "-",
169
+ step: 0,
170
+ status:
171
+ retry > 0
172
+ ? `Retry ${retry}/${MAX_RETRIES}...`
173
+ : "Creating email...",
174
+ done: false,
175
+ success: false,
176
+ });
177
+
178
+ account = await generateAccount();
179
+
180
+ if (isEmailUsed(account.email)) {
181
+ liveDisplay.updateRow(accountIndex, {
182
+ status: "Email collision, retrying...",
183
+ });
184
+ await sleep(1000);
185
+ continue;
186
+ }
187
+ } catch (err) {
188
+ liveDisplay.updateRow(accountIndex, {
189
+ email: "-",
190
+ step: 0,
191
+ status: `Email gen failed: ${err.message.substring(0, 25)}`,
192
+ done: false,
193
+ success: false,
194
+ });
195
+ await sleep(2000 + Math.random() * 2000);
196
+ continue;
197
+ }
198
+
199
+ liveDisplay.updateRow(accountIndex, {
200
+ email: account.email,
201
+ step: 0,
202
+ status: "Starting registration...",
203
+ done: false,
204
+ success: false,
205
+ });
206
+
207
+ try {
208
+ const result = await registerAccount(account, {
209
+ askOtpFn: waitForOtp,
210
+ onProgress: (step, msg) => {
211
+ liveDisplay.updateRow(accountIndex, {
212
+ step,
213
+ status: msg,
214
+ });
215
+ },
216
+ });
217
+
218
+ await saveAccount(result);
219
+ await saveEmailToDb(account.email);
220
+
221
+ allResults[accountIndex] = result;
222
+ totalSuccess++;
223
+ success = true;
224
+
225
+ liveDisplay.updateRow(accountIndex, {
226
+ step: TOTAL_STEPS,
227
+ status: "Complete ✓",
228
+ done: true,
229
+ success: true,
230
+ });
231
+ } catch (err) {
232
+ liveDisplay.updateRow(accountIndex, {
233
+ step: 0,
234
+ status: `Failed: ${err.message.substring(0, 30)}`,
235
+ done: false,
236
+ success: false,
237
+ });
238
+ await sleep(3000 + Math.random() * 3000);
239
+ }
240
+ }
241
+
242
+ if (!success) {
243
+ liveDisplay.updateRow(accountIndex, {
244
+ step: 0,
245
+ status: "Failed (max retries) ✗",
246
+ done: true,
247
+ success: false,
248
+ });
249
+ }
250
+ }
251
+ })(),
252
+ );
253
+
254
+ await Promise.allSettled(workers);
255
+
256
+ // ─── RESULT ────────────────────────────────────────────────────────────
257
+ const validResults = allResults.filter(Boolean);
258
+ autoExport(validResults);
259
+
260
+ const duration = formatDuration(Date.now() - startTime);
261
+
262
+ console.log();
263
+ printResult({
264
+ total: count,
265
+ success: totalSuccess,
266
+ failed: count - totalSuccess,
267
+ duration,
268
+ });
269
+
270
+ printSaved();
271
+ }
@@ -0,0 +1,58 @@
1
+ /**
2
+ * commands/export.js
3
+ * Command: npm run export
4
+ * Export accounts from data/accounts.json to data/result.txt
5
+ */
6
+
7
+ import chalk from "chalk";
8
+ import { resolve } from "path";
9
+ import { writeFileSync } from "fs";
10
+ import { RESULT_FILE } from "../config.js";
11
+ import { loadAccounts } from "../lib/storage.js";
12
+ import {
13
+ printBanner,
14
+ printSection,
15
+ printField,
16
+ printSaved,
17
+ } from "../ui/banner.js";
18
+
19
+ export async function cmdExport() {
20
+ printBanner();
21
+ printSection("EXPORT");
22
+
23
+ const accounts = loadAccounts();
24
+
25
+ if (accounts.length === 0) {
26
+ printField(
27
+ chalk.yellow("⚠"),
28
+ chalk.yellow("No accounts found in data/accounts.json"),
29
+ );
30
+ printField(
31
+ chalk.gray("→"),
32
+ chalk.gray("Run `npm run create` first to generate accounts."),
33
+ );
34
+ console.log();
35
+ return;
36
+ }
37
+
38
+ const lines = accounts.map(
39
+ (acc) =>
40
+ `${acc.email}\t${acc.password}\t${acc.fullName || acc.firstName || "-"}`,
41
+ );
42
+
43
+ const outputPath = resolve(RESULT_FILE);
44
+ writeFileSync(outputPath, lines.join("\n"), "utf-8");
45
+
46
+ printField(
47
+ chalk.hex("#00D4AA")("✓"),
48
+ chalk.white(`Exported ${accounts.length} accounts`),
49
+ );
50
+ printField(chalk.gray("→"), chalk.hex("#00A8DE")(outputPath));
51
+ printField(
52
+ chalk.gray("→"),
53
+ chalk.gray("Format: email\\tpassword\\tname (tab-separated)"),
54
+ );
55
+ console.log();
56
+
57
+ printSaved();
58
+ }
package/src/config.js ADDED
@@ -0,0 +1,36 @@
1
+ /**
2
+ * config.js
3
+ * Loads config.json and exports all constants.
4
+ */
5
+
6
+ import { readFileSync } from "fs";
7
+ import { resolve, dirname } from "path";
8
+ import { fileURLToPath } from "url";
9
+
10
+ const __dirname = dirname(fileURLToPath(import.meta.url));
11
+ const raw = readFileSync(resolve(__dirname, "../config.json"), "utf-8");
12
+ const config = JSON.parse(raw);
13
+
14
+ // ─── Account / Email Service ──────────────────────────────────────────────────
15
+ export const PASSWORD = config.password;
16
+ export const ACCOUNT_API_URL = config.account.apiUrl;
17
+ export const ACCOUNT_API_KEY = config.account.apiKey;
18
+
19
+ // ─── Process ──────────────────────────────────────────────────────────────────
20
+ export const BATCH_SIZE = config.batchSize;
21
+
22
+ // ─── OTP ──────────────────────────────────────────────────────────────────────
23
+ export const OTP_TIMEOUT = config.otp.timeout;
24
+ export const OTP_POLL = config.otp.pollInterval;
25
+
26
+ // ─── CapCut Passport ────────────────────────────────────────────────────────────
27
+ export const CAPCUT_AID = config.capcut.aid;
28
+ export const CAPCUT_SDK_VERSION = config.capcut.sdkVersion;
29
+ export const CAPCUT_LANGUAGE = config.capcut.language;
30
+ export const CAPCUT_REGION = config.capcut.region;
31
+ export const CAPCUT_LOGIN_DOMAIN = config.capcut.loginDomain;
32
+
33
+ // ─── File Paths ───────────────────────────────────────────────────────────────
34
+ export const ACCOUNTS_FILE = config.paths.accounts;
35
+ export const RESULT_FILE = config.paths.result;
36
+ export const EMAIL_DB_FILE = config.paths.emailDb;