skool-cli 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.
- package/LICENSE +21 -0
- package/README.md +179 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +33 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/create-folder.d.ts +3 -0
- package/dist/commands/create-folder.d.ts.map +1 -0
- package/dist/commands/create-folder.js +24 -0
- package/dist/commands/create-folder.js.map +1 -0
- package/dist/commands/create-lesson.d.ts +3 -0
- package/dist/commands/create-lesson.d.ts.map +1 -0
- package/dist/commands/create-lesson.js +35 -0
- package/dist/commands/create-lesson.js.map +1 -0
- package/dist/commands/create-post.d.ts +3 -0
- package/dist/commands/create-post.d.ts.map +1 -0
- package/dist/commands/create-post.js +36 -0
- package/dist/commands/create-post.js.map +1 -0
- package/dist/commands/debug-api.d.ts +3 -0
- package/dist/commands/debug-api.d.ts.map +1 -0
- package/dist/commands/debug-api.js +112 -0
- package/dist/commands/debug-api.js.map +1 -0
- package/dist/commands/debug-manual.d.ts +3 -0
- package/dist/commands/debug-manual.d.ts.map +1 -0
- package/dist/commands/debug-manual.js +66 -0
- package/dist/commands/debug-manual.js.map +1 -0
- package/dist/commands/debug.d.ts +3 -0
- package/dist/commands/debug.d.ts.map +1 -0
- package/dist/commands/debug.js +114 -0
- package/dist/commands/debug.js.map +1 -0
- package/dist/commands/delete-lesson.d.ts +3 -0
- package/dist/commands/delete-lesson.d.ts.map +1 -0
- package/dist/commands/delete-lesson.js +17 -0
- package/dist/commands/delete-lesson.js.map +1 -0
- package/dist/commands/get-categories.d.ts +3 -0
- package/dist/commands/get-categories.d.ts.map +1 -0
- package/dist/commands/get-categories.js +34 -0
- package/dist/commands/get-categories.js.map +1 -0
- package/dist/commands/get-members.d.ts +3 -0
- package/dist/commands/get-members.d.ts.map +1 -0
- package/dist/commands/get-members.js +35 -0
- package/dist/commands/get-members.js.map +1 -0
- package/dist/commands/get-posts.d.ts +3 -0
- package/dist/commands/get-posts.d.ts.map +1 -0
- package/dist/commands/get-posts.js +41 -0
- package/dist/commands/get-posts.js.map +1 -0
- package/dist/commands/list-lessons.d.ts +3 -0
- package/dist/commands/list-lessons.d.ts.map +1 -0
- package/dist/commands/list-lessons.js +45 -0
- package/dist/commands/list-lessons.js.map +1 -0
- package/dist/commands/login.d.ts +3 -0
- package/dist/commands/login.d.ts.map +1 -0
- package/dist/commands/login.js +30 -0
- package/dist/commands/login.js.map +1 -0
- package/dist/commands/test-api.d.ts +3 -0
- package/dist/commands/test-api.d.ts.map +1 -0
- package/dist/commands/test-api.js +143 -0
- package/dist/commands/test-api.js.map +1 -0
- package/dist/commands/whoami.d.ts +3 -0
- package/dist/commands/whoami.d.ts.map +1 -0
- package/dist/commands/whoami.js +17 -0
- package/dist/commands/whoami.js.map +1 -0
- package/dist/core/browser-manager.d.ts +25 -0
- package/dist/core/browser-manager.d.ts.map +1 -0
- package/dist/core/browser-manager.js +104 -0
- package/dist/core/browser-manager.js.map +1 -0
- package/dist/core/config.d.ts +15 -0
- package/dist/core/config.d.ts.map +1 -0
- package/dist/core/config.js +17 -0
- package/dist/core/config.js.map +1 -0
- package/dist/core/html-generator.d.ts +15 -0
- package/dist/core/html-generator.d.ts.map +1 -0
- package/dist/core/html-generator.js +254 -0
- package/dist/core/html-generator.js.map +1 -0
- package/dist/core/page-ops.d.ts +69 -0
- package/dist/core/page-ops.d.ts.map +1 -0
- package/dist/core/page-ops.js +511 -0
- package/dist/core/page-ops.js.map +1 -0
- package/dist/core/skool-api.d.ts +74 -0
- package/dist/core/skool-api.d.ts.map +1 -0
- package/dist/core/skool-api.js +389 -0
- package/dist/core/skool-api.js.map +1 -0
- package/dist/core/skool-client.d.ts +63 -0
- package/dist/core/skool-client.d.ts.map +1 -0
- package/dist/core/skool-client.js +501 -0
- package/dist/core/skool-client.js.map +1 -0
- package/dist/core/types.d.ts +58 -0
- package/dist/core/types.d.ts.map +1 -0
- package/dist/core/types.js +2 -0
- package/dist/core/types.js.map +1 -0
- package/package.json +51 -0
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
import { Command } from "commander";
|
|
2
|
+
import { BrowserManager } from "../core/browser-manager.js";
|
|
3
|
+
import { PageOps } from "../core/page-ops.js";
|
|
4
|
+
import { writeFileSync } from "node:fs";
|
|
5
|
+
export const debugCommand = new Command("debug")
|
|
6
|
+
.description("Debug: take screenshot and dump page structure")
|
|
7
|
+
.requiredOption("-g, --group <slug>", "Skool group slug", process.env.SKOOL_GROUP)
|
|
8
|
+
.option("-p, --page <type>", "Page to debug: community, classroom, members", "community")
|
|
9
|
+
.action(async (opts) => {
|
|
10
|
+
const browser = new BrowserManager();
|
|
11
|
+
const ops = new PageOps(browser);
|
|
12
|
+
try {
|
|
13
|
+
const pageType = opts.page;
|
|
14
|
+
if (pageType === "classroom") {
|
|
15
|
+
await ops.gotoClassroom(opts.group);
|
|
16
|
+
}
|
|
17
|
+
else if (pageType === "classroom-course") {
|
|
18
|
+
await ops.gotoClassroom(opts.group);
|
|
19
|
+
const p = await browser.getPage();
|
|
20
|
+
// Click first course card
|
|
21
|
+
const courseCard = p.getByText("Fundamentos de IA y Claude", { exact: false });
|
|
22
|
+
await courseCard.first().click();
|
|
23
|
+
await p.waitForTimeout(3000);
|
|
24
|
+
}
|
|
25
|
+
else if (pageType === "classroom-module") {
|
|
26
|
+
await ops.gotoClassroom(opts.group);
|
|
27
|
+
const p = await browser.getPage();
|
|
28
|
+
const courseCard = p.getByText("Fundamentos de IA y Claude", { exact: false });
|
|
29
|
+
await courseCard.first().click();
|
|
30
|
+
await p.waitForTimeout(3000);
|
|
31
|
+
// Click the module to expand it
|
|
32
|
+
const mod = p.locator('div[class*="MenuItemTitle"]').filter({ hasText: "Fundamentos de IA" }).first();
|
|
33
|
+
await mod.click();
|
|
34
|
+
await p.waitForTimeout(2000);
|
|
35
|
+
// Screenshot after expanding
|
|
36
|
+
await p.screenshot({ path: "/tmp/skool-debug-module-expanded.png", fullPage: false });
|
|
37
|
+
console.log("Module expanded screenshot: /tmp/skool-debug-module-expanded.png");
|
|
38
|
+
}
|
|
39
|
+
else if (pageType === "classroom-hover") {
|
|
40
|
+
await ops.gotoClassroom(opts.group);
|
|
41
|
+
const p = await browser.getPage();
|
|
42
|
+
const courseCard = p.getByText("Fundamentos de IA y Claude", { exact: false });
|
|
43
|
+
await courseCard.first().click();
|
|
44
|
+
await p.waitForTimeout(3000);
|
|
45
|
+
// Hover over "Fundamentos de IA" module
|
|
46
|
+
const mod = p.locator('div[class*="MenuItemWrapper"]').filter({ hasText: "Fundamentos de IA" }).first();
|
|
47
|
+
await mod.hover();
|
|
48
|
+
await p.waitForTimeout(1000);
|
|
49
|
+
// Take screenshot after hover
|
|
50
|
+
await p.screenshot({ path: "/tmp/skool-debug-hover.png", fullPage: false });
|
|
51
|
+
console.log("Hover screenshot: /tmp/skool-debug-hover.png");
|
|
52
|
+
// Now right-click the module
|
|
53
|
+
await mod.click({ button: "right" });
|
|
54
|
+
await p.waitForTimeout(1000);
|
|
55
|
+
await p.screenshot({ path: "/tmp/skool-debug-rightclick.png", fullPage: false });
|
|
56
|
+
console.log("Right-click screenshot: /tmp/skool-debug-rightclick.png");
|
|
57
|
+
}
|
|
58
|
+
else if (pageType === "members") {
|
|
59
|
+
await ops.gotoMembers(opts.group);
|
|
60
|
+
}
|
|
61
|
+
else {
|
|
62
|
+
await ops.gotoCommunity(opts.group);
|
|
63
|
+
}
|
|
64
|
+
const page = await browser.getPage();
|
|
65
|
+
// If community, also click "Write something" to open post form
|
|
66
|
+
if (pageType === "post-form") {
|
|
67
|
+
await ops.gotoCommunity(opts.group);
|
|
68
|
+
const writeTrigger = page.locator('div[class*="CreatePost"], [placeholder*="Write"], button:has-text("Write")');
|
|
69
|
+
await writeTrigger.first().click({ timeout: 10000 }).catch(() => {
|
|
70
|
+
// Try alternative: text-based
|
|
71
|
+
return page.getByText("Write something").click({ timeout: 5000 });
|
|
72
|
+
});
|
|
73
|
+
await page.waitForTimeout(2000);
|
|
74
|
+
}
|
|
75
|
+
// Screenshot
|
|
76
|
+
const ssPath = `/tmp/skool-debug-${pageType}.png`;
|
|
77
|
+
await page.screenshot({ path: ssPath, fullPage: false });
|
|
78
|
+
console.log(`Screenshot: ${ssPath}`);
|
|
79
|
+
// Dump relevant HTML structure (not full page, just key areas)
|
|
80
|
+
const structure = await page.evaluate(() => {
|
|
81
|
+
const result = [];
|
|
82
|
+
// Get ALL interactive elements and text nodes in sidebar area
|
|
83
|
+
const allElements = document.querySelectorAll("button, a, input, textarea, [contenteditable], [role], div[class*='Module'], div[class*='Folder'], div[class*='Sidebar'], div[class*='sidebar'], div[class*='Nav'], div[class*='Course'], span[class*='title'], div[class*='menu'], div[class*='Menu']");
|
|
84
|
+
allElements.forEach((el) => {
|
|
85
|
+
const text = el.textContent?.trim().slice(0, 60);
|
|
86
|
+
const tag = el.tagName;
|
|
87
|
+
const cls = el.className?.toString().slice(0, 100) || "";
|
|
88
|
+
const role = el.getAttribute("role") || "";
|
|
89
|
+
const href = el.getAttribute("href") || "";
|
|
90
|
+
const aria = el.getAttribute("aria-label") || "";
|
|
91
|
+
if (text || role || aria) {
|
|
92
|
+
let line = `${tag}: "${text || ""}"`;
|
|
93
|
+
if (cls)
|
|
94
|
+
line += ` class="${cls}"`;
|
|
95
|
+
if (role)
|
|
96
|
+
line += ` role="${role}"`;
|
|
97
|
+
if (href)
|
|
98
|
+
line += ` href="${href}"`;
|
|
99
|
+
if (aria)
|
|
100
|
+
line += ` aria="${aria}"`;
|
|
101
|
+
result.push(line);
|
|
102
|
+
}
|
|
103
|
+
});
|
|
104
|
+
return result;
|
|
105
|
+
});
|
|
106
|
+
const dumpPath = `/tmp/skool-debug-${pageType}.txt`;
|
|
107
|
+
writeFileSync(dumpPath, structure.join("\n"));
|
|
108
|
+
console.log(`Structure dump: ${dumpPath} (${structure.length} elements)`);
|
|
109
|
+
}
|
|
110
|
+
finally {
|
|
111
|
+
await browser.close();
|
|
112
|
+
}
|
|
113
|
+
});
|
|
114
|
+
//# sourceMappingURL=debug.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"debug.js","sourceRoot":"","sources":["../../src/commands/debug.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"delete-lesson.d.ts","sourceRoot":"","sources":["../../src/commands/delete-lesson.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAGpC,eAAO,MAAM,mBAAmB,SAY5B,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { Command } from "commander";
|
|
2
|
+
import { SkoolClient } from "../core/skool-client.js";
|
|
3
|
+
export const deleteLessonCommand = new Command("delete-lesson")
|
|
4
|
+
.description("Delete a lesson or folder by ID")
|
|
5
|
+
.requiredOption("--id <pageId>", "Page or folder ID to delete")
|
|
6
|
+
.action(async (opts) => {
|
|
7
|
+
const client = new SkoolClient();
|
|
8
|
+
try {
|
|
9
|
+
const result = await client.deleteLesson(opts.id);
|
|
10
|
+
console.log(result.success ? `OK: ${result.message}` : `FAIL: ${result.message}`);
|
|
11
|
+
process.exit(result.success ? 0 : 1);
|
|
12
|
+
}
|
|
13
|
+
finally {
|
|
14
|
+
await client.close();
|
|
15
|
+
}
|
|
16
|
+
});
|
|
17
|
+
//# sourceMappingURL=delete-lesson.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"delete-lesson.js","sourceRoot":"","sources":["../../src/commands/delete-lesson.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAEtD,MAAM,CAAC,MAAM,mBAAmB,GAAG,IAAI,OAAO,CAAC,eAAe,CAAC;KAC5D,WAAW,CAAC,iCAAiC,CAAC;KAC9C,cAAc,CAAC,eAAe,EAAE,6BAA6B,CAAC;KAC9D,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;IACrB,MAAM,MAAM,GAAG,IAAI,WAAW,EAAE,CAAC;IACjC,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAClD,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,SAAS,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC;QAClF,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACvC,CAAC;YAAS,CAAC;QACT,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;IACvB,CAAC;AACH,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get-categories.d.ts","sourceRoot":"","sources":["../../src/commands/get-categories.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAGpC,eAAO,MAAM,oBAAoB,SA6B7B,CAAC"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { Command } from "commander";
|
|
2
|
+
import { SkoolClient } from "../core/skool-client.js";
|
|
3
|
+
export const getCategoriesCommand = new Command("get-categories")
|
|
4
|
+
.description("List post categories in a Skool group")
|
|
5
|
+
.requiredOption("-g, --group <slug>", "Skool group slug", process.env.SKOOL_GROUP)
|
|
6
|
+
.option("--json", "Output as JSON")
|
|
7
|
+
.action(async (opts) => {
|
|
8
|
+
const client = new SkoolClient();
|
|
9
|
+
try {
|
|
10
|
+
const result = await client.getCategories(opts.group);
|
|
11
|
+
if (!result.success) {
|
|
12
|
+
console.error("Failed to get categories.");
|
|
13
|
+
process.exit(1);
|
|
14
|
+
}
|
|
15
|
+
if (opts.json) {
|
|
16
|
+
console.log(JSON.stringify(result.categories, null, 2));
|
|
17
|
+
}
|
|
18
|
+
else {
|
|
19
|
+
if (result.categories.length === 0) {
|
|
20
|
+
console.log("No categories found.");
|
|
21
|
+
}
|
|
22
|
+
else {
|
|
23
|
+
console.log("Categories:\n");
|
|
24
|
+
for (const cat of result.categories) {
|
|
25
|
+
console.log(` - ${cat}`);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
finally {
|
|
31
|
+
await client.close();
|
|
32
|
+
}
|
|
33
|
+
});
|
|
34
|
+
//# sourceMappingURL=get-categories.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get-categories.js","sourceRoot":"","sources":["../../src/commands/get-categories.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAEtD,MAAM,CAAC,MAAM,oBAAoB,GAAG,IAAI,OAAO,CAAC,gBAAgB,CAAC;KAC9D,WAAW,CAAC,uCAAuC,CAAC;KACpD,cAAc,CAAC,oBAAoB,EAAE,kBAAkB,EAAE,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC;KACjF,MAAM,CAAC,QAAQ,EAAE,gBAAgB,CAAC;KAClC,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;IACrB,MAAM,MAAM,GAAG,IAAI,WAAW,EAAE,CAAC;IACjC,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAEtD,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;YACpB,OAAO,CAAC,KAAK,CAAC,2BAA2B,CAAC,CAAC;YAC3C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;YACd,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,UAAU,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAC1D,CAAC;aAAM,CAAC;YACN,IAAI,MAAM,CAAC,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACnC,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC;YACtC,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;gBAC7B,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,UAAU,EAAE,CAAC;oBACpC,OAAO,CAAC,GAAG,CAAC,OAAO,GAAG,EAAE,CAAC,CAAC;gBAC5B,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;YAAS,CAAC;QACT,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;IACvB,CAAC;AACH,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get-members.d.ts","sourceRoot":"","sources":["../../src/commands/get-members.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAGpC,eAAO,MAAM,iBAAiB,SA8B1B,CAAC"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { Command } from "commander";
|
|
2
|
+
import { SkoolClient } from "../core/skool-client.js";
|
|
3
|
+
export const getMembersCommand = new Command("get-members")
|
|
4
|
+
.description("List or search members in a Skool group")
|
|
5
|
+
.requiredOption("-g, --group <slug>", "Skool group slug", process.env.SKOOL_GROUP)
|
|
6
|
+
.option("-s, --search <query>", "Search by name")
|
|
7
|
+
.option("--json", "Output as JSON")
|
|
8
|
+
.action(async (opts) => {
|
|
9
|
+
const client = new SkoolClient();
|
|
10
|
+
try {
|
|
11
|
+
const result = await client.getMembers(opts.group, opts.search);
|
|
12
|
+
if (!result.success) {
|
|
13
|
+
console.error("Failed to get members.");
|
|
14
|
+
process.exit(1);
|
|
15
|
+
}
|
|
16
|
+
if (opts.json) {
|
|
17
|
+
console.log(JSON.stringify(result.members, null, 2));
|
|
18
|
+
}
|
|
19
|
+
else {
|
|
20
|
+
if (result.members.length === 0) {
|
|
21
|
+
console.log(opts.search ? `No members found matching "${opts.search}".` : "No members found.");
|
|
22
|
+
}
|
|
23
|
+
else {
|
|
24
|
+
console.log(`Members${opts.search ? ` matching "${opts.search}"` : ""}:\n`);
|
|
25
|
+
for (const [i, m] of result.members.entries()) {
|
|
26
|
+
console.log(`${i + 1}. ${m.name} (Level ${m.level})`);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
finally {
|
|
32
|
+
await client.close();
|
|
33
|
+
}
|
|
34
|
+
});
|
|
35
|
+
//# sourceMappingURL=get-members.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get-members.js","sourceRoot":"","sources":["../../src/commands/get-members.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAEtD,MAAM,CAAC,MAAM,iBAAiB,GAAG,IAAI,OAAO,CAAC,aAAa,CAAC;KACxD,WAAW,CAAC,yCAAyC,CAAC;KACtD,cAAc,CAAC,oBAAoB,EAAE,kBAAkB,EAAE,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC;KACjF,MAAM,CAAC,sBAAsB,EAAE,gBAAgB,CAAC;KAChD,MAAM,CAAC,QAAQ,EAAE,gBAAgB,CAAC;KAClC,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;IACrB,MAAM,MAAM,GAAG,IAAI,WAAW,EAAE,CAAC;IACjC,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;QAEhE,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;YACpB,OAAO,CAAC,KAAK,CAAC,wBAAwB,CAAC,CAAC;YACxC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;YACd,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QACvD,CAAC;aAAM,CAAC;YACN,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAChC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,8BAA8B,IAAI,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC;YACjG,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,GAAG,CAAC,UAAU,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,cAAc,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;gBAC5E,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC;oBAC9C,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,IAAI,WAAW,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC;gBACxD,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;YAAS,CAAC;QACT,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;IACvB,CAAC;AACH,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get-posts.d.ts","sourceRoot":"","sources":["../../src/commands/get-posts.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAGpC,eAAO,MAAM,eAAe,SAiCxB,CAAC"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { Command } from "commander";
|
|
2
|
+
import { SkoolClient } from "../core/skool-client.js";
|
|
3
|
+
export const getPostsCommand = new Command("get-posts")
|
|
4
|
+
.description("List community posts from a Skool group")
|
|
5
|
+
.requiredOption("-g, --group <slug>", "Skool group slug", process.env.SKOOL_GROUP)
|
|
6
|
+
.option("--json", "Output as JSON")
|
|
7
|
+
.action(async (opts) => {
|
|
8
|
+
const client = new SkoolClient();
|
|
9
|
+
try {
|
|
10
|
+
const result = await client.getPosts(opts.group);
|
|
11
|
+
if (!result.success) {
|
|
12
|
+
console.error("Failed to get posts. Check your session: skool whoami --group " + opts.group);
|
|
13
|
+
process.exit(1);
|
|
14
|
+
}
|
|
15
|
+
if (opts.json) {
|
|
16
|
+
console.log(JSON.stringify(result.posts, null, 2));
|
|
17
|
+
}
|
|
18
|
+
else {
|
|
19
|
+
if (result.posts.length === 0) {
|
|
20
|
+
console.log("No posts found.");
|
|
21
|
+
}
|
|
22
|
+
else {
|
|
23
|
+
console.log(`Posts in ${opts.group}:\n`);
|
|
24
|
+
for (const [i, post] of result.posts.entries()) {
|
|
25
|
+
console.log(`${i + 1}. ${post.title}`);
|
|
26
|
+
if (post.author)
|
|
27
|
+
console.log(` Author: ${post.author}`);
|
|
28
|
+
if (post.category)
|
|
29
|
+
console.log(` Category: ${post.category}`);
|
|
30
|
+
if (post.preview)
|
|
31
|
+
console.log(` ${post.preview.slice(0, 100)}...`);
|
|
32
|
+
console.log();
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
finally {
|
|
38
|
+
await client.close();
|
|
39
|
+
}
|
|
40
|
+
});
|
|
41
|
+
//# sourceMappingURL=get-posts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get-posts.js","sourceRoot":"","sources":["../../src/commands/get-posts.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAEtD,MAAM,CAAC,MAAM,eAAe,GAAG,IAAI,OAAO,CAAC,WAAW,CAAC;KACpD,WAAW,CAAC,yCAAyC,CAAC;KACtD,cAAc,CAAC,oBAAoB,EAAE,kBAAkB,EAAE,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC;KACjF,MAAM,CAAC,QAAQ,EAAE,gBAAgB,CAAC;KAClC,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;IACrB,MAAM,MAAM,GAAG,IAAI,WAAW,EAAE,CAAC;IACjC,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAEjD,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;YACpB,OAAO,CAAC,KAAK,CAAC,gEAAgE,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC;YAC7F,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;YACd,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QACrD,CAAC;aAAM,CAAC;YACN,IAAI,MAAM,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC9B,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;YACjC,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,GAAG,CAAC,YAAY,IAAI,CAAC,KAAK,KAAK,CAAC,CAAC;gBACzC,KAAK,MAAM,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,EAAE,CAAC;oBAC/C,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;oBACvC,IAAI,IAAI,CAAC,MAAM;wBAAE,OAAO,CAAC,GAAG,CAAC,cAAc,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;oBAC1D,IAAI,IAAI,CAAC,QAAQ;wBAAE,OAAO,CAAC,GAAG,CAAC,gBAAgB,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;oBAChE,IAAI,IAAI,CAAC,OAAO;wBAAE,OAAO,CAAC,GAAG,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC;oBACrE,OAAO,CAAC,GAAG,EAAE,CAAC;gBAChB,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;YAAS,CAAC;QACT,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;IACvB,CAAC;AACH,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list-lessons.d.ts","sourceRoot":"","sources":["../../src/commands/list-lessons.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAGpC,eAAO,MAAM,kBAAkB,SAuC3B,CAAC"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { Command } from "commander";
|
|
2
|
+
import { SkoolClient } from "../core/skool-client.js";
|
|
3
|
+
export const listLessonsCommand = new Command("list-lessons")
|
|
4
|
+
.description("List all lessons and folders in a Skool classroom course")
|
|
5
|
+
.requiredOption("-g, --group <slug>", "Skool group slug", process.env.SKOOL_GROUP)
|
|
6
|
+
.option("--course <name>", "Course name (if multiple courses exist)")
|
|
7
|
+
.option("--json", "Output as JSON")
|
|
8
|
+
.action(async (opts) => {
|
|
9
|
+
const client = new SkoolClient();
|
|
10
|
+
try {
|
|
11
|
+
const result = await client.listLessons(opts.group, opts.course);
|
|
12
|
+
if (!result.success) {
|
|
13
|
+
console.error(`FAIL: ${result.message}`);
|
|
14
|
+
process.exit(1);
|
|
15
|
+
}
|
|
16
|
+
if (opts.json) {
|
|
17
|
+
console.log(JSON.stringify(result.items, null, 2));
|
|
18
|
+
}
|
|
19
|
+
else {
|
|
20
|
+
if (result.items.length === 0) {
|
|
21
|
+
console.log("No lessons or folders found.");
|
|
22
|
+
}
|
|
23
|
+
else {
|
|
24
|
+
for (const item of result.items) {
|
|
25
|
+
if (item.type === "folder") {
|
|
26
|
+
console.log(`\n ${item.name}`);
|
|
27
|
+
if (item.children) {
|
|
28
|
+
for (const child of item.children) {
|
|
29
|
+
console.log(` - ${child.name}`);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
else {
|
|
34
|
+
console.log(` - ${item.name}`);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
console.log();
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
finally {
|
|
42
|
+
await client.close();
|
|
43
|
+
}
|
|
44
|
+
});
|
|
45
|
+
//# sourceMappingURL=list-lessons.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list-lessons.js","sourceRoot":"","sources":["../../src/commands/list-lessons.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAEtD,MAAM,CAAC,MAAM,kBAAkB,GAAG,IAAI,OAAO,CAAC,cAAc,CAAC;KAC1D,WAAW,CAAC,0DAA0D,CAAC;KACvE,cAAc,CAAC,oBAAoB,EAAE,kBAAkB,EAAE,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC;KACjF,MAAM,CAAC,iBAAiB,EAAE,yCAAyC,CAAC;KACpE,MAAM,CAAC,QAAQ,EAAE,gBAAgB,CAAC;KAClC,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;IACrB,MAAM,MAAM,GAAG,IAAI,WAAW,EAAE,CAAC;IACjC,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;QAEjE,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;YACpB,OAAO,CAAC,KAAK,CAAC,SAAS,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC;YACzC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;YACd,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QACrD,CAAC;aAAM,CAAC;YACN,IAAI,MAAM,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC9B,OAAO,CAAC,GAAG,CAAC,8BAA8B,CAAC,CAAC;YAC9C,CAAC;iBAAM,CAAC;gBACN,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;oBAChC,IAAI,IAAI,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;wBAC3B,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;wBAChC,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;4BAClB,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;gCAClC,OAAO,CAAC,GAAG,CAAC,SAAS,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;4BACrC,CAAC;wBACH,CAAC;oBACH,CAAC;yBAAM,CAAC;wBACN,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;oBAClC,CAAC;gBACH,CAAC;gBACD,OAAO,CAAC,GAAG,EAAE,CAAC;YAChB,CAAC;QACH,CAAC;IACH,CAAC;YAAS,CAAC;QACT,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;IACvB,CAAC;AACH,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"login.d.ts","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAGpC,eAAO,MAAM,YAAY,SA+BrB,CAAC"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { Command } from "commander";
|
|
2
|
+
import { SkoolClient } from "../core/skool-client.js";
|
|
3
|
+
export const loginCommand = new Command("login")
|
|
4
|
+
.description("Login to your Skool account")
|
|
5
|
+
.option("-e, --email <email>", "Skool account email")
|
|
6
|
+
.option("-p, --password <password>", "Skool account password")
|
|
7
|
+
.action(async (opts) => {
|
|
8
|
+
const email = opts.email || process.env.SKOOL_EMAIL;
|
|
9
|
+
const password = opts.password || process.env.SKOOL_PASSWORD;
|
|
10
|
+
if (!email || !password) {
|
|
11
|
+
console.error("Error: Email and password required.\n\n" +
|
|
12
|
+
"Usage:\n" +
|
|
13
|
+
" skool login --email you@email.com --password yourpass\n\n" +
|
|
14
|
+
"Or set environment variables:\n" +
|
|
15
|
+
" export SKOOL_EMAIL=you@email.com\n" +
|
|
16
|
+
" export SKOOL_PASSWORD=yourpass");
|
|
17
|
+
process.exit(1);
|
|
18
|
+
}
|
|
19
|
+
const client = new SkoolClient();
|
|
20
|
+
try {
|
|
21
|
+
console.log("Logging in to Skool...");
|
|
22
|
+
const result = await client.login(email, password);
|
|
23
|
+
console.log(result.success ? `OK: ${result.message}` : `FAIL: ${result.message}`);
|
|
24
|
+
process.exit(result.success ? 0 : 1);
|
|
25
|
+
}
|
|
26
|
+
finally {
|
|
27
|
+
await client.close();
|
|
28
|
+
}
|
|
29
|
+
});
|
|
30
|
+
//# sourceMappingURL=login.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"login.js","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAEtD,MAAM,CAAC,MAAM,YAAY,GAAG,IAAI,OAAO,CAAC,OAAO,CAAC;KAC7C,WAAW,CAAC,6BAA6B,CAAC;KAC1C,MAAM,CAAC,qBAAqB,EAAE,qBAAqB,CAAC;KACpD,MAAM,CAAC,2BAA2B,EAAE,wBAAwB,CAAC;KAC7D,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;IACrB,MAAM,KAAK,GACT,IAAI,CAAC,KAAK,IAAI,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC;IACxC,MAAM,QAAQ,GACZ,IAAI,CAAC,QAAQ,IAAI,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC;IAE9C,IAAI,CAAC,KAAK,IAAI,CAAC,QAAQ,EAAE,CAAC;QACxB,OAAO,CAAC,KAAK,CACX,yCAAyC;YACvC,UAAU;YACV,6DAA6D;YAC7D,iCAAiC;YACjC,sCAAsC;YACtC,kCAAkC,CACrC,CAAC;QACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,MAAM,GAAG,IAAI,WAAW,EAAE,CAAC;IACjC,IAAI,CAAC;QACH,OAAO,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAC;QACtC,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;QACnD,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,SAAS,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC;QAClF,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACvC,CAAC;YAAS,CAAC;QACT,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;IACvB,CAAC;AACH,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test-api.d.ts","sourceRoot":"","sources":["../../src/commands/test-api.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAKpC,eAAO,MAAM,cAAc,SAqJvB,CAAC"}
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
import { Command } from "commander";
|
|
2
|
+
import { BrowserManager } from "../core/browser-manager.js";
|
|
3
|
+
import { SkoolApi } from "../core/skool-api.js";
|
|
4
|
+
import { PageOps } from "../core/page-ops.js";
|
|
5
|
+
export const testApiCommand = new Command("test-api")
|
|
6
|
+
.description("Test direct API creation of a lesson")
|
|
7
|
+
.requiredOption("-g, --group <slug>", "Skool group slug", process.env.SKOOL_GROUP)
|
|
8
|
+
.option("--course <name>", "Course name", "Fundamentos de IA y Claude")
|
|
9
|
+
.action(async (opts) => {
|
|
10
|
+
const browser = new BrowserManager();
|
|
11
|
+
const api = new SkoolApi(browser);
|
|
12
|
+
const ops = new PageOps(browser);
|
|
13
|
+
try {
|
|
14
|
+
const page = await browser.getPage();
|
|
15
|
+
// Set up request interception BEFORE navigating
|
|
16
|
+
let groupId = "";
|
|
17
|
+
let userId = "";
|
|
18
|
+
let rootId = "";
|
|
19
|
+
// Intercept API calls to capture IDs
|
|
20
|
+
page.on("request", (req) => {
|
|
21
|
+
const body = req.postData();
|
|
22
|
+
if (!body)
|
|
23
|
+
return;
|
|
24
|
+
// Capture group_id from telemetry
|
|
25
|
+
const gMatch = body.match(/"group_id"\s*:\s*"([a-f0-9]{32})"/);
|
|
26
|
+
if (gMatch && !groupId)
|
|
27
|
+
groupId = gMatch[1];
|
|
28
|
+
const uMatch = body.match(/"member_id"\s*:\s*"([a-f0-9]{32})"/);
|
|
29
|
+
if (uMatch && !userId)
|
|
30
|
+
userId = uMatch[1];
|
|
31
|
+
});
|
|
32
|
+
// Also capture API calls to api2.skool.com for root_id
|
|
33
|
+
page.on("request", (req) => {
|
|
34
|
+
const url = req.url();
|
|
35
|
+
const body = req.postData();
|
|
36
|
+
if (url.includes("api2.skool.com") && body) {
|
|
37
|
+
const rMatch = body.match(/"root_id"\s*:\s*"([a-f0-9]{32})"/);
|
|
38
|
+
if (rMatch && !rootId)
|
|
39
|
+
rootId = rMatch[1];
|
|
40
|
+
}
|
|
41
|
+
});
|
|
42
|
+
console.log("Step 1: Navigate to classroom...");
|
|
43
|
+
await ops.gotoClassroom(opts.group);
|
|
44
|
+
console.log("Step 2: Enter course...");
|
|
45
|
+
await page.getByText(opts.course, { exact: false }).first().click();
|
|
46
|
+
await page.waitForTimeout(3000);
|
|
47
|
+
// Extract group_id from the page URL/assets (the group ID is in the OG image URL)
|
|
48
|
+
if (!groupId) {
|
|
49
|
+
const metaContent = await page.evaluate(() => {
|
|
50
|
+
const str = document.documentElement.innerHTML;
|
|
51
|
+
const match = str.match(/01fe[a-f0-9]{28}/);
|
|
52
|
+
return match ? match[0] : "";
|
|
53
|
+
});
|
|
54
|
+
if (metaContent)
|
|
55
|
+
groupId = metaContent;
|
|
56
|
+
}
|
|
57
|
+
console.log(`\nAfter navigation - groupId: ${groupId}, userId: ${userId}, rootId: ${rootId}`);
|
|
58
|
+
// If we don't have rootId yet, we need to trigger an API call
|
|
59
|
+
// Do the "Add page" action to capture the root_id from the POST to api2.skool.com
|
|
60
|
+
if (!rootId) {
|
|
61
|
+
console.log("\nStep 3: Triggering Add page to discover root_id...");
|
|
62
|
+
// Set up listener for the api2.skool.com/courses POST
|
|
63
|
+
const rootIdPromise = new Promise((resolve) => {
|
|
64
|
+
const timeout = setTimeout(() => resolve(""), 15000);
|
|
65
|
+
page.on("response", async (res) => {
|
|
66
|
+
if (res.url().includes("api2.skool.com/courses") && res.request().method() === "POST") {
|
|
67
|
+
try {
|
|
68
|
+
const data = await res.json();
|
|
69
|
+
const rid = data.root_id || "";
|
|
70
|
+
if (rid) {
|
|
71
|
+
clearTimeout(timeout);
|
|
72
|
+
resolve(rid);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
catch { /* ignore */ }
|
|
76
|
+
}
|
|
77
|
+
});
|
|
78
|
+
});
|
|
79
|
+
// Click "..." and "Add page"
|
|
80
|
+
const courseTopArea = page.locator('div[class*="CourseMenuTop"]').first();
|
|
81
|
+
await courseTopArea.hover();
|
|
82
|
+
await page.waitForTimeout(500);
|
|
83
|
+
await page.evaluate(() => {
|
|
84
|
+
const topArea = document.querySelector('div[class*="CourseMenuTop"]');
|
|
85
|
+
if (!topArea)
|
|
86
|
+
return;
|
|
87
|
+
topArea.querySelectorAll("div, button, span, svg").forEach((el) => {
|
|
88
|
+
const rect = el.getBoundingClientRect();
|
|
89
|
+
const text = el.textContent?.trim() || "";
|
|
90
|
+
if (rect.width > 10 && rect.width < 50 && rect.height > 10 && rect.height < 50 && text.length < 4) {
|
|
91
|
+
el.dispatchEvent(new MouseEvent("click", { bubbles: true, cancelable: true }));
|
|
92
|
+
}
|
|
93
|
+
});
|
|
94
|
+
});
|
|
95
|
+
await page.waitForTimeout(800);
|
|
96
|
+
try {
|
|
97
|
+
await page.getByText("Add page", { exact: true }).click({ timeout: 5000 });
|
|
98
|
+
}
|
|
99
|
+
catch {
|
|
100
|
+
await page.getByText("Add page", { exact: true }).click({ force: true, timeout: 5000 });
|
|
101
|
+
}
|
|
102
|
+
rootId = await rootIdPromise;
|
|
103
|
+
console.log(`Captured root_id: ${rootId}`);
|
|
104
|
+
// Also get user_id from the create request
|
|
105
|
+
// We already have it from telemetry
|
|
106
|
+
}
|
|
107
|
+
// ALWAYS extract userId from the auth_token JWT (member_id from telemetry is NOT the same)
|
|
108
|
+
const cookies = await page.context().cookies();
|
|
109
|
+
const authCookie = cookies.find(c => c.name === "auth_token");
|
|
110
|
+
if (authCookie) {
|
|
111
|
+
try {
|
|
112
|
+
const payload = JSON.parse(Buffer.from(authCookie.value.split(".")[1], "base64").toString());
|
|
113
|
+
userId = payload.sub || payload.user_id || payload.id || "";
|
|
114
|
+
console.log(`userId from JWT: ${userId}`);
|
|
115
|
+
console.log(`JWT payload keys: ${Object.keys(payload).join(", ")}`);
|
|
116
|
+
}
|
|
117
|
+
catch { /* ignore */ }
|
|
118
|
+
}
|
|
119
|
+
console.log(`\nDiscovered IDs:`);
|
|
120
|
+
console.log(` group_id: ${groupId}`);
|
|
121
|
+
console.log(` user_id: ${userId}`);
|
|
122
|
+
console.log(` root_id: ${rootId}`);
|
|
123
|
+
if (!groupId || !userId || !rootId) {
|
|
124
|
+
console.error("\nCould not discover all required IDs.");
|
|
125
|
+
return;
|
|
126
|
+
}
|
|
127
|
+
// Now test: create a page via direct API with the correct root_id
|
|
128
|
+
console.log("\nStep 4: Creating test page via API...");
|
|
129
|
+
const result = await api.createPage({
|
|
130
|
+
groupId,
|
|
131
|
+
userId,
|
|
132
|
+
parentId: rootId, // Top-level page in the course
|
|
133
|
+
rootId,
|
|
134
|
+
title: "API Test Page",
|
|
135
|
+
content: "<h2>Hola desde la API</h2><p>Esta pagina fue creada directamente via api2.skool.com</p><ul><li>Punto 1</li><li>Punto 2</li></ul>",
|
|
136
|
+
});
|
|
137
|
+
console.log(`\nResult: ${JSON.stringify(result, null, 2)}`);
|
|
138
|
+
}
|
|
139
|
+
finally {
|
|
140
|
+
await browser.close();
|
|
141
|
+
}
|
|
142
|
+
});
|
|
143
|
+
//# sourceMappingURL=test-api.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test-api.js","sourceRoot":"","sources":["../../src/commands/test-api.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"whoami.d.ts","sourceRoot":"","sources":["../../src/commands/whoami.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAGpC,eAAO,MAAM,aAAa,SAYtB,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { Command } from "commander";
|
|
2
|
+
import { SkoolClient } from "../core/skool-client.js";
|
|
3
|
+
export const whoamiCommand = new Command("whoami")
|
|
4
|
+
.description("Check if your Skool session is active")
|
|
5
|
+
.requiredOption("-g, --group <slug>", "Skool group slug", process.env.SKOOL_GROUP)
|
|
6
|
+
.action(async (opts) => {
|
|
7
|
+
const client = new SkoolClient();
|
|
8
|
+
try {
|
|
9
|
+
const result = await client.checkSession(opts.group);
|
|
10
|
+
console.log(result.success ? `OK: ${result.message}` : `FAIL: ${result.message}`);
|
|
11
|
+
process.exit(result.success ? 0 : 1);
|
|
12
|
+
}
|
|
13
|
+
finally {
|
|
14
|
+
await client.close();
|
|
15
|
+
}
|
|
16
|
+
});
|
|
17
|
+
//# sourceMappingURL=whoami.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"whoami.js","sourceRoot":"","sources":["../../src/commands/whoami.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAEtD,MAAM,CAAC,MAAM,aAAa,GAAG,IAAI,OAAO,CAAC,QAAQ,CAAC;KAC/C,WAAW,CAAC,uCAAuC,CAAC;KACpD,cAAc,CAAC,oBAAoB,EAAE,kBAAkB,EAAE,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC;KACjF,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;IACrB,MAAM,MAAM,GAAG,IAAI,WAAW,EAAE,CAAC;IACjC,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACrD,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,SAAS,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC;QAClF,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACvC,CAAC;YAAS,CAAC;QACT,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;IACvB,CAAC;AACH,CAAC,CAAC,CAAC"}
|