fastbrowser_cli 1.0.35 → 1.0.39
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/README.md +26 -5
- package/dist/contribs/_shared/fastbrowser_helper.d.ts +13 -0
- package/dist/contribs/_shared/fastbrowser_helper.d.ts.map +1 -0
- package/dist/contribs/_shared/fastbrowser_helper.js +39 -0
- package/dist/contribs/_shared/fastbrowser_helper.js.map +1 -0
- package/dist/contribs/linkedin_cli/src/cli.d.ts +3 -0
- package/dist/contribs/linkedin_cli/src/cli.d.ts.map +1 -0
- package/dist/contribs/linkedin_cli/src/cli.js +299 -0
- package/dist/contribs/linkedin_cli/src/cli.js.map +1 -0
- package/dist/contribs/linkedin_cli/src/libs/linkedin_profile_helper.d.ts +73 -0
- package/dist/contribs/linkedin_cli/src/libs/linkedin_profile_helper.d.ts.map +1 -0
- package/dist/contribs/linkedin_cli/src/libs/linkedin_profile_helper.js +866 -0
- package/dist/contribs/linkedin_cli/src/libs/linkedin_profile_helper.js.map +1 -0
- package/dist/contribs/linkedin_cli/src/libs/linkedin_recent_posts_helper.d.ts +61 -0
- package/dist/contribs/linkedin_cli/src/libs/linkedin_recent_posts_helper.d.ts.map +1 -0
- package/dist/contribs/linkedin_cli/src/libs/linkedin_recent_posts_helper.js +885 -0
- package/dist/contribs/linkedin_cli/src/libs/linkedin_recent_posts_helper.js.map +1 -0
- package/dist/contribs/linkedin_cli/src/libs/linkedin_thread_helper.d.ts +11 -0
- package/dist/contribs/linkedin_cli/src/libs/linkedin_thread_helper.d.ts.map +1 -0
- package/dist/contribs/linkedin_cli/src/libs/linkedin_thread_helper.js +145 -0
- package/dist/contribs/linkedin_cli/src/libs/linkedin_thread_helper.js.map +1 -0
- package/dist/contribs/twitter_cli/src/cli.d.ts +3 -0
- package/dist/contribs/twitter_cli/src/cli.d.ts.map +1 -0
- package/dist/contribs/twitter_cli/src/cli.js +273 -0
- package/dist/contribs/twitter_cli/src/cli.js.map +1 -0
- package/dist/contribs/twitter_cli/src/libs/twitter_profile_helper.d.ts +28 -0
- package/dist/contribs/twitter_cli/src/libs/twitter_profile_helper.d.ts.map +1 -0
- package/dist/contribs/twitter_cli/src/libs/twitter_profile_helper.js +274 -0
- package/dist/contribs/twitter_cli/src/libs/twitter_profile_helper.js.map +1 -0
- package/dist/contribs/twitter_cli/src/libs/twitter_recent_posts_helper.d.ts +43 -0
- package/dist/contribs/twitter_cli/src/libs/twitter_recent_posts_helper.d.ts.map +1 -0
- package/dist/contribs/twitter_cli/src/libs/twitter_recent_posts_helper.js +519 -0
- package/dist/contribs/twitter_cli/src/libs/twitter_recent_posts_helper.js.map +1 -0
- package/dist/contribs/twitter_cli/src/libs/twitter_thread_helper.d.ts +11 -0
- package/dist/contribs/twitter_cli/src/libs/twitter_thread_helper.d.ts.map +1 -0
- package/dist/contribs/twitter_cli/src/libs/twitter_thread_helper.js +213 -0
- package/dist/contribs/twitter_cli/src/libs/twitter_thread_helper.js.map +1 -0
- package/dist/fastbrowser_cli/fastbrowser_cli.js +43 -0
- package/dist/fastbrowser_cli/fastbrowser_cli.js.map +1 -1
- package/dist/fastbrowser_httpd/libs/tool-schemas.d.ts +4 -0
- package/dist/fastbrowser_httpd/libs/tool-schemas.d.ts.map +1 -1
- package/dist/fastbrowser_httpd/libs/tool-schemas.js +4 -0
- package/dist/fastbrowser_httpd/libs/tool-schemas.js.map +1 -1
- package/dist/fastbrowser_mcp/fastbrowser_mcp.js +36 -2
- package/dist/fastbrowser_mcp/fastbrowser_mcp.js.map +1 -1
- package/dist/fastbrowser_mcp/libs/mcp_target_helper.d.ts +2 -0
- package/dist/fastbrowser_mcp/libs/mcp_target_helper.d.ts.map +1 -1
- package/dist/fastbrowser_mcp/libs/mcp_target_helper.js +12 -0
- package/dist/fastbrowser_mcp/libs/mcp_target_helper.js.map +1 -1
- package/dist/fastbrowser_mcp/libs/response_formatter.d.ts +1 -0
- package/dist/fastbrowser_mcp/libs/response_formatter.d.ts.map +1 -1
- package/dist/fastbrowser_mcp/libs/response_formatter.js +27 -0
- package/dist/fastbrowser_mcp/libs/response_formatter.js.map +1 -1
- package/dist/shared/fastbrowser_helper.d.ts +13 -0
- package/dist/shared/fastbrowser_helper.d.ts.map +1 -0
- package/dist/shared/fastbrowser_helper.js +39 -0
- package/dist/shared/fastbrowser_helper.js.map +1 -0
- package/examples/linkedin_cli_TOREMOVE/README.md +7 -0
- package/examples/linkedin_cli_TOREMOVE/linkedin_dm.sh +40 -0
- package/examples/linkedin_cli_TOREMOVE/linkedin_dm.ts +326 -0
- package/examples/linkedin_cli_TOREMOVE/linkedin_dm_messages.ts +279 -0
- package/examples/linkedin_cli_TOREMOVE/linkedin_full_cycle.sh +5 -0
- package/examples/{linkedin_cli/linked_post.sh → linkedin_cli_TOREMOVE/linkedin_post.sh} +3 -0
- package/examples/linkedin_cli_TOREMOVE/message_thread.a11y.txt +252 -0
- package/examples/whatsapp/whatapp.a11y.txt +1521 -0
- package/examples/whatsapp/whatsapp.sh +10 -0
- package/listitem +7 -0
- package/package.json +7 -3
- package/skills/fastbrowser/SKILL.md +116 -29
- package/src/contribs/_shared/fastbrowser_helper.ts +49 -0
- package/src/contribs/linkedin_cli/README.md +80 -0
- package/src/contribs/linkedin_cli/data/linkedin_posts_jeromeetienne.a11y.txt +2364 -0
- package/src/contribs/linkedin_cli/data/linkedin_posts_jontwigge.a11y.txt +2740 -0
- package/src/contribs/linkedin_cli/data/linkedin_posts_julien_guezennec.a11y.txt +2073 -0
- package/src/contribs/linkedin_cli/data/linkedin_profile_jeromeetienne.a11y.txt +1863 -0
- package/src/contribs/linkedin_cli/data/linkedin_profile_jontwigge.a11y.txt +1738 -0
- package/src/contribs/linkedin_cli/data/linkedin_profile_julien_guezennec.a11y.txt +2182 -0
- package/src/contribs/linkedin_cli/src/cli.ts +345 -0
- package/src/contribs/linkedin_cli/src/libs/linkedin_profile_helper.ts +964 -0
- package/src/contribs/linkedin_cli/src/libs/linkedin_recent_posts_helper.ts +982 -0
- package/src/contribs/linkedin_cli/src/libs/linkedin_thread_helper.ts +171 -0
- package/src/contribs/twitter_cli/README.md +79 -0
- package/src/contribs/twitter_cli/data/twitter_chat.a11y.txt +215 -0
- package/src/contribs/twitter_cli/data/twitter_home.a11y.txt +467 -0
- package/src/contribs/twitter_cli/data/twitter_profile.a11y.txt +418 -0
- package/src/contribs/twitter_cli/data/twitter_profile_jontwigge.a11y.txt +484 -0
- package/src/contribs/twitter_cli/data/twitter_profile_molokoloco.a11y.txt +483 -0
- package/src/contribs/twitter_cli/src/cli.ts +315 -0
- package/src/contribs/twitter_cli/src/libs/twitter_profile_helper.ts +328 -0
- package/src/contribs/twitter_cli/src/libs/twitter_recent_posts_helper.ts +607 -0
- package/src/contribs/twitter_cli/src/libs/twitter_thread_helper.ts +240 -0
- package/src/fastbrowser_cli/fastbrowser_cli.ts +51 -0
- package/src/fastbrowser_httpd/libs/tool-schemas.ts +6 -0
- package/src/fastbrowser_mcp/fastbrowser_mcp.ts +46 -3
- package/src/fastbrowser_mcp/libs/mcp_target_helper.ts +11 -0
- package/src/fastbrowser_mcp/libs/response_formatter.ts +29 -0
- package/src/shared/fastbrowser_helper.ts +49 -0
- package/tsconfig.json +1 -1
- package/examples/linkedin_cli/linked_dm.sh +0 -19
- package/examples/mcp_client_playwright.ts +0 -34
- /package/examples/{linkedin_cli → linkedin_cli_TOREMOVE}/linkedin.snapshot.txt +0 -0
- /package/examples/{twitter_cli → twitter_cli_TOREMOVE}/twitter_post.sh +0 -0
|
@@ -197,6 +197,17 @@ export class McpTargetHelper {
|
|
|
197
197
|
throw new Error(`Unsupported MCP target: ${mcpTarget}`);
|
|
198
198
|
}
|
|
199
199
|
}
|
|
200
|
+
static async targetToolEvaluateScript(mcpTarget, functionText) {
|
|
201
|
+
if (mcpTarget === 'chrome_devtools') {
|
|
202
|
+
return { toolName: 'evaluate_script', toolArgs: { function: functionText } };
|
|
203
|
+
}
|
|
204
|
+
else if (mcpTarget === 'playwright') {
|
|
205
|
+
return { toolName: 'browser_evaluate', toolArgs: { function: functionText } };
|
|
206
|
+
}
|
|
207
|
+
else {
|
|
208
|
+
throw new Error(`Unsupported MCP target: ${mcpTarget}`);
|
|
209
|
+
}
|
|
210
|
+
}
|
|
200
211
|
}
|
|
201
212
|
McpTargetHelper.EXTERNAL_TOOL_NAME = {
|
|
202
213
|
listPages: "list_pages",
|
|
@@ -209,6 +220,7 @@ McpTargetHelper.EXTERNAL_TOOL_NAME = {
|
|
|
209
220
|
pressKeys: "pressKeys",
|
|
210
221
|
click: "click",
|
|
211
222
|
fillForm: "fill_form",
|
|
223
|
+
evaluateScript: "evaluate_script",
|
|
212
224
|
getCurrentDateTime: "get_current_datetime",
|
|
213
225
|
};
|
|
214
226
|
//# sourceMappingURL=mcp_target_helper.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mcp_target_helper.js","sourceRoot":"","sources":["../../../src/fastbrowser_mcp/libs/mcp_target_helper.ts"],"names":[],"mappings":"AAQA,MAAM,OAAO,eAAe;
|
|
1
|
+
{"version":3,"file":"mcp_target_helper.js","sourceRoot":"","sources":["../../../src/fastbrowser_mcp/libs/mcp_target_helper.ts"],"names":[],"mappings":"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"}
|
|
@@ -8,5 +8,6 @@ export declare class ResponseFormatter {
|
|
|
8
8
|
static formatTakeSnapshot(mcpTarget: FastBrowserMcpTarget, callToolResult: CallToolResult): Promise<string>;
|
|
9
9
|
static formatPressKeys(mcpTarget: FastBrowserMcpTarget, keysToSend: string[]): Promise<string>;
|
|
10
10
|
static formatClick(mcpTarget: FastBrowserMcpTarget, callToolResult: CallToolResult): Promise<string>;
|
|
11
|
+
static formatEvaluateScript(mcpTarget: FastBrowserMcpTarget, callToolResult: CallToolResult): Promise<string>;
|
|
11
12
|
}
|
|
12
13
|
//# sourceMappingURL=response_formatter.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"response_formatter.d.ts","sourceRoot":"","sources":["../../../src/fastbrowser_mcp/libs/response_formatter.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC;AAGjE,OAAO,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AAG/D,qBAAa,iBAAiB;WAChB,eAAe,CAAC,SAAS,EAAE,oBAAoB,EAAE,cAAc,EAAE,cAAc,GAAG,OAAO,CAAC,MAAM,CAAC;WA+CjG,kBAAkB,CAAC,SAAS,EAAE,oBAAoB,EAAE,cAAc,EAAE,cAAc,GAAG,OAAO,CAAC,MAAM,CAAC;WA6CpG,aAAa,CAAC,SAAS,EAAE,oBAAoB,EAAE,cAAc,EAAE,cAAc,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;WA2C5G,eAAe,CAAC,SAAS,EAAE,oBAAoB,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;WASjH,kBAAkB,CAAC,SAAS,EAAE,oBAAoB,EAAE,cAAc,EAAE,cAAc,GAAG,OAAO,CAAC,MAAM,CAAC;WAqBpG,eAAe,CAAC,SAAS,EAAE,oBAAoB,EAAE,UAAU,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC;WAKvF,WAAW,CAAC,SAAS,EAAE,oBAAoB,EAAE,cAAc,EAAE,cAAc,GAAG,OAAO,CAAC,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"response_formatter.d.ts","sourceRoot":"","sources":["../../../src/fastbrowser_mcp/libs/response_formatter.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC;AAGjE,OAAO,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AAG/D,qBAAa,iBAAiB;WAChB,eAAe,CAAC,SAAS,EAAE,oBAAoB,EAAE,cAAc,EAAE,cAAc,GAAG,OAAO,CAAC,MAAM,CAAC;WA+CjG,kBAAkB,CAAC,SAAS,EAAE,oBAAoB,EAAE,cAAc,EAAE,cAAc,GAAG,OAAO,CAAC,MAAM,CAAC;WA6CpG,aAAa,CAAC,SAAS,EAAE,oBAAoB,EAAE,cAAc,EAAE,cAAc,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;WA2C5G,eAAe,CAAC,SAAS,EAAE,oBAAoB,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;WASjH,kBAAkB,CAAC,SAAS,EAAE,oBAAoB,EAAE,cAAc,EAAE,cAAc,GAAG,OAAO,CAAC,MAAM,CAAC;WAqBpG,eAAe,CAAC,SAAS,EAAE,oBAAoB,EAAE,UAAU,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC;WAKvF,WAAW,CAAC,SAAS,EAAE,oBAAoB,EAAE,cAAc,EAAE,cAAc,GAAG,OAAO,CAAC,MAAM,CAAC;WAiC7F,oBAAoB,CAAC,SAAS,EAAE,oBAAoB,EAAE,cAAc,EAAE,cAAc,GAAG,OAAO,CAAC,MAAM,CAAC;CA4BnH"}
|
|
@@ -200,5 +200,32 @@ export class ResponseFormatter {
|
|
|
200
200
|
throw new Error(`Unsupported MCP target: ${mcpTarget}`);
|
|
201
201
|
}
|
|
202
202
|
}
|
|
203
|
+
static async formatEvaluateScript(mcpTarget, callToolResult) {
|
|
204
|
+
const resultContent = callToolResult.content[0];
|
|
205
|
+
if (resultContent.type !== "text")
|
|
206
|
+
throw new Error("Unexpected content type");
|
|
207
|
+
const resultText = resultContent.text;
|
|
208
|
+
// ### Result
|
|
209
|
+
// undefined
|
|
210
|
+
// ### Ran Playwright code
|
|
211
|
+
// ```js
|
|
212
|
+
// await page.evaluate('() => {\n const workspace = document.querySelector(\'main#workspace\');\n if (workspace === null) {\n throw new Error(\'Workspace element not found\');\n }\n const tryCount = 6;\n const delayMs = 500;\n (async () => {\n for (let i = 0; i < tryCount; i++) {\n workspace.scrollBy({\n top: 600000,\n behavior: \'smooth\'\n });\n await new Promise(resolve => setTimeout(resolve, delayMs));\n }\n })();\n}');
|
|
213
|
+
// ```
|
|
214
|
+
// ### Events
|
|
215
|
+
// - New console entries: .playwright-mcp/console-2026-05-04T05-43-55-775Z.log#L3959-L4058
|
|
216
|
+
// Target format example:
|
|
217
|
+
// Successfully clicked on the element
|
|
218
|
+
if (mcpTarget === 'chrome_devtools') {
|
|
219
|
+
// EXAMPLE:
|
|
220
|
+
// Successfully clicked on the element
|
|
221
|
+
return resultText;
|
|
222
|
+
}
|
|
223
|
+
else if (mcpTarget === 'playwright') {
|
|
224
|
+
return resultText;
|
|
225
|
+
}
|
|
226
|
+
else {
|
|
227
|
+
throw new Error(`Unsupported MCP target: ${mcpTarget}`);
|
|
228
|
+
}
|
|
229
|
+
}
|
|
203
230
|
}
|
|
204
231
|
//# sourceMappingURL=response_formatter.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"response_formatter.js","sourceRoot":"","sources":["../../../src/fastbrowser_mcp/libs/response_formatter.ts"],"names":[],"mappings":"AAAA,eAAe;AACf,OAAO,KAAK,MAAM,MAAM,QAAQ,CAAC;AAOjC,OAAO,EAAE,uBAAuB,EAAE,MAAM,6BAA6B,CAAC;AAEtE,MAAM,OAAO,iBAAiB;IAC7B,MAAM,CAAC,KAAK,CAAC,eAAe,CAAC,SAA+B,EAAE,cAA8B;QAC3F,MAAM,aAAa,GAAG,cAAc,CAAC,OAAO,CAAC,CAAC,CAAC,CAAA;QAC/C,IAAI,aAAa,CAAC,IAAI,KAAK,MAAM;YAAE,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;QAC9E,MAAM,UAAU,GAAW,aAAa,CAAC,IAAI,CAAA;QAE7C,IAAI,SAAS,KAAK,iBAAiB,EAAE,CAAC;YACrC,WAAW;YACX,WAAW;YACX,iBAAiB;YACjB,qCAAqC;YACrC,OAAO,UAAU,CAAA;QAClB,CAAC;aAAM,IAAI,SAAS,KAAK,YAAY,EAAE,CAAC;YACvC,WAAW;YACX,aAAa;YACb,8NAA8N;YAC9N,aAAa;YACb,qFAAqF;YAErF,4FAA4F;YAC5F,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YACrC,0DAA0D;YAC1D,MAAM,WAAW,GAAG,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC,CAAC;YAC3E,MAAM,kBAAkB,GAAG,WAAW,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;YACpF,MAAM,SAAS,GAAG,kBAAkB,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC;YAClF,MAAM,cAAc,GAAG,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE;gBAC3C,qDAAqD;gBACrD,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;gBACjD,IAAI,KAAK,EAAE,CAAC;oBACX,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;oBACvB,MAAM,WAAW,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;oBAC7B,8DAA8D;oBAC9D,MAAM,SAAS,GAAG,WAAW,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;oBACpD,MAAM,gBAAgB,GAAG,WAAW,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;oBACrE,MAAM,QAAQ,GAAG,gBAAgB,CAAC,KAAK,CAAC,qBAAqB,CAAC,CAAC;oBAC/D,MAAM,GAAG,GAAG,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;oBACxC,OAAO,GAAG,KAAK,KAAK,GAAG,GAAG,SAAS,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;gBAC5D,CAAC;qBAAM,CAAC;oBACP,OAAO,IAAI,CAAC,CAAC,qEAAqE;gBACnF,CAAC;YACF,CAAC,CAAC,CAAC;YACH,MAAM,SAAS,GAAG,aAAa,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YAC3D,OAAO,SAAS,CAAA;QACjB,CAAC;aAAM,CAAC;YACP,MAAM,IAAI,KAAK,CAAC,2BAA2B,SAAS,EAAE,CAAC,CAAC;QACzD,CAAC;IACF,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,kBAAkB,CAAC,SAA+B,EAAE,cAA8B;QAC9F,MAAM,aAAa,GAAG,cAAc,CAAC,OAAO,CAAC,CAAC,CAAC,CAAA;QAC/C,IAAI,aAAa,CAAC,IAAI,KAAK,MAAM;YAAE,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;QAC9E,MAAM,UAAU,GAAW,aAAa,CAAC,IAAI,CAAA;QAE7C,yBAAyB;QACzB,gDAAgD;QAEhD,IAAI,SAAS,KAAK,iBAAiB,EAAE,CAAC;YACrC,WAAW;YACX,gDAAgD;YAChD,WAAW;YACX,qCAAqC;YAErC,0FAA0F;YAC1F,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YACrC,+DAA+D;YAC/D,MAAM,CAAC,EAAE,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,wDAAwD,CAAC,CAAC;YACtF,MAAM,YAAY,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAA;YACpC,MAAM,SAAS,GAAG,YAAY,CAAC,CAAC,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,wEAAwE;YAC3I,OAAO,SAAS,CAAC;QAClB,CAAC;aAAM,IAAI,SAAS,KAAK,YAAY,EAAE,CAAC;YACvC,WAAW;YACX,0BAA0B;YAC1B,QAAQ;YACR,yCAAyC;YACzC,MAAM;YACN,WAAW;YACX,mCAAmC;YACnC,+BAA+B;YAC/B,eAAe;YACf,kEAAkE;YAElE,oFAAoF;YACpF,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YACrC,MAAM,WAAW,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC,CAAC;YAC9E,MAAM,OAAO,GAAG,WAAW,CAAC,CAAC,CAAC,WAAW,CAAC,OAAO,CAAC,aAAa,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACjF,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,uEAAuE,CAAC,CAAC;YAC5F,MAAM,SAAS,GAAG,6BAA6B,OAAO,EAAE,CAAA;YACxD,OAAO,SAAS,CAAC;QAClB,CAAC;aAAM,CAAC;YACP,MAAM,IAAI,KAAK,CAAC,2BAA2B,SAAS,EAAE,CAAC,CAAC;QACzD,CAAC;IACF,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,SAA+B,EAAE,cAA8B,EAAE,GAAW;QACtG,MAAM,aAAa,GAAG,cAAc,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QAChD,IAAI,aAAa,CAAC,IAAI,KAAK,MAAM;YAAE,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;QAC9E,MAAM,UAAU,GAAW,aAAa,CAAC,IAAI,CAAC;QAE9C,yBAAyB;QACzB,sDAAsD;QAEtD,IAAI,SAAS,KAAK,iBAAiB,EAAE,CAAC;YACrC,WAAW;YACX,sBAAsB;YACtB,qDAAqD;YACrD,WAAW;YACX,iBAAiB;YACjB,qCAAqC;YAErC,0FAA0F;YAC1F,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;YAC9F,MAAM,SAAS,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YACnD,MAAM,QAAQ,GAAG,SAAS,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC;YACrD,MAAM,YAAY,GAAG,QAAQ,KAAK,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;YAC3D,OAAO,mCAAmC,YAAY,EAAE,CAAC;QAC1D,CAAC;aAAM,IAAI,SAAS,KAAK,YAAY,EAAE,CAAC;YACvC,WAAW;YACX,0BAA0B;YAC1B,QAAQ;YACR,2BAA2B;YAC3B,MAAM;YACN,WAAW;YACX,mCAAmC;YACnC,+BAA+B;YAC/B,eAAe;YACf,4CAA4C;YAE5C,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YACrC,MAAM,WAAW,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC,CAAC;YAC9E,MAAM,OAAO,GAAG,WAAW,KAAK,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC,OAAO,CAAC,aAAa,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC;YAChG,OAAO,mCAAmC,OAAO,EAAE,CAAC;QACrD,CAAC;aAAM,CAAC;YACP,MAAM,IAAI,KAAK,CAAC,2BAA2B,SAAS,EAAE,CAAC,CAAC;QACzD,CAAC;IACF,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,eAAe,CAAC,SAA+B,EAAE,cAA8B,EAAE,MAAc;QAC3G,MAAM,aAAa,GAAG,cAAc,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QAChD,IAAI,aAAa,CAAC,IAAI,KAAK,MAAM;YAAE,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;QAE9E,yBAAyB;QACzB,6BAA6B;QAC7B,OAAO,4BAA4B,MAAM,EAAE,CAAC;IAC7C,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,kBAAkB,CAAC,SAA+B,EAAE,cAA8B;QAC9F,+HAA+H;QAC/H,IAAI,SAAS,KAAK,iBAAiB,EAAE,CAAC;YACrC,uDAAuD;YACvD,MAAM,YAAY,GAAG,cAAc,CAAC,OAAO,CAAC,CAAC,CAAC,CAAA;YAC9C,IAAI,YAAY,CAAC,IAAI,KAAK,MAAM;gBAAE,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;YAE7E,uEAAuE;YACvE,IAAI,YAAY,GAAG,YAAY,CAAC,IAAI,CAAC;YACrC,YAAY,GAAG,YAAY,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC5D,OAAO,YAAY,CAAC;QACrB,CAAC;aAAM,IAAI,SAAS,KAAK,YAAY,EAAE,CAAC;YACvC,MAAM,YAAY,GAAG,cAAc,CAAC,OAAO,CAAC,CAAC,CAAC,CAAA;YAC9C,IAAI,YAAY,CAAC,IAAI,KAAK,MAAM;gBAAE,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;YAC7E,MAAM,YAAY,GAAG,uBAAuB,CAAC,uBAAuB,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;YACxF,OAAO,YAAY,CAAC;QACrB,CAAC;aAAM,CAAC;YACP,MAAM,IAAI,KAAK,CAAC,2BAA2B,SAAS,EAAE,CAAC,CAAC;QACzD,CAAC;IACF,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,eAAe,CAAC,SAA+B,EAAE,UAAoB;QACjF,MAAM,SAAS,GAAG,iBAAiB,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAA;QAC1D,OAAO,SAAS,CAAC;IAClB,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,SAA+B,EAAE,cAA8B;QACvF,MAAM,aAAa,GAAG,cAAc,CAAC,OAAO,CAAC,CAAC,CAAC,CAAA;QAC/C,IAAI,aAAa,CAAC,IAAI,KAAK,MAAM;YAAE,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;QAC9E,MAAM,UAAU,GAAW,aAAa,CAAC,IAAI,CAAA;QAE7C,yBAAyB;QACzB,sCAAsC;QAEtC,IAAI,SAAS,KAAK,iBAAiB,EAAE,CAAC;YACrC,WAAW;YACX,sCAAsC;YAEtC,OAAO,UAAU,CAAA;QAClB,CAAC;aAAM,IAAI,SAAS,KAAK,YAAY,EAAE,CAAC;YACvC,WAAW;YACX,2BAA2B;YAC3B,QAAQ;YACR,gEAAgE;YAChE,MAAM;YACN,WAAW;YACX,wDAAwD;YACxD,gCAAgC;YAChC,eAAe;YACf,mEAAmE;YAEnE,oFAAoF;YACpF,MAAM,SAAS,GAAG,qCAAqC,CAAA;YACvD,OAAO,SAAS,CAAC;QAClB,CAAC;aAAM,CAAC;YACP,MAAM,IAAI,KAAK,CAAC,2BAA2B,SAAS,EAAE,CAAC,CAAC;QACzD,CAAC;IACF,CAAC;CACD"}
|
|
1
|
+
{"version":3,"file":"response_formatter.js","sourceRoot":"","sources":["../../../src/fastbrowser_mcp/libs/response_formatter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export declare class FastBrowserHelper {
|
|
2
|
+
static run(command: string): Promise<string>;
|
|
3
|
+
static navigatePage(url: string): Promise<void>;
|
|
4
|
+
static fillForm(selector: string, value: string): Promise<void>;
|
|
5
|
+
static pressKeys(keys: string): Promise<void>;
|
|
6
|
+
static click(selector: string): Promise<void>;
|
|
7
|
+
static querySelectorsAll(selector: string, limit: number): Promise<string>;
|
|
8
|
+
static querySelectorsAllWithChildren(selector: string, limit: number): Promise<string>;
|
|
9
|
+
static takeSnapshot(): Promise<string>;
|
|
10
|
+
static querySelectors(selector: string, withAncestors?: boolean): Promise<string>;
|
|
11
|
+
static evaluateScript(functionText: string): Promise<string>;
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=fastbrowser_helper.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fastbrowser_helper.d.ts","sourceRoot":"","sources":["../../src/shared/fastbrowser_helper.ts"],"names":[],"mappings":"AAIA,qBAAa,iBAAiB;WAChB,GAAG,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;WAOrC,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;WAIxC,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;WAIxD,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;WAItC,KAAK,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;WAItC,iBAAiB,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;WAInE,6BAA6B,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;WAI/E,YAAY,IAAI,OAAO,CAAC,MAAM,CAAC;WAI/B,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,aAAa,UAAO,GAAG,OAAO,CAAC,MAAM,CAAC;WAKvE,cAAc,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;CAGlE"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { execSync } from 'node:child_process';
|
|
2
|
+
const __dirname = new URL('.', import.meta.url).pathname;
|
|
3
|
+
export class FastBrowserHelper {
|
|
4
|
+
static async run(command) {
|
|
5
|
+
// const fullCommand = `npx fastbrowser_cli ${command}`;
|
|
6
|
+
const fullCommand = `npx tsx ${__dirname}../../src/fastbrowser_cli/fastbrowser_cli.ts ${command}`;
|
|
7
|
+
console.error(`Running command: ${fullCommand}`);
|
|
8
|
+
return execSync(fullCommand, { encoding: 'utf8' });
|
|
9
|
+
}
|
|
10
|
+
static async navigatePage(url) {
|
|
11
|
+
await FastBrowserHelper.run(`navigate_page --url '${url}'`);
|
|
12
|
+
}
|
|
13
|
+
static async fillForm(selector, value) {
|
|
14
|
+
await FastBrowserHelper.run(`fill_form --selector '${selector}' --value '${value}'`);
|
|
15
|
+
}
|
|
16
|
+
static async pressKeys(keys) {
|
|
17
|
+
await FastBrowserHelper.run(`press_keys --keys '${keys}'`);
|
|
18
|
+
}
|
|
19
|
+
static async click(selector) {
|
|
20
|
+
await FastBrowserHelper.run(`click -s '${selector}'`);
|
|
21
|
+
}
|
|
22
|
+
static async querySelectorsAll(selector, limit) {
|
|
23
|
+
return await FastBrowserHelper.run(`query_selectors --all --selector '${selector}' --limit ${limit}`);
|
|
24
|
+
}
|
|
25
|
+
static async querySelectorsAllWithChildren(selector, limit) {
|
|
26
|
+
return await FastBrowserHelper.run(`query_selectors --all --selector '${selector}' --limit ${limit} --with-ancestors --with-children`);
|
|
27
|
+
}
|
|
28
|
+
static async takeSnapshot() {
|
|
29
|
+
return await FastBrowserHelper.run('take_snapshot');
|
|
30
|
+
}
|
|
31
|
+
static async querySelectors(selector, withAncestors = true) {
|
|
32
|
+
const flag = withAncestors === false ? ' --no-with-ancestors' : '';
|
|
33
|
+
return await FastBrowserHelper.run(`query_selectors --selector '${selector}'${flag}`);
|
|
34
|
+
}
|
|
35
|
+
static async evaluateScript(functionText) {
|
|
36
|
+
return await FastBrowserHelper.run(`evaluate_script --script "${functionText}"`);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=fastbrowser_helper.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fastbrowser_helper.js","sourceRoot":"","sources":["../../src/shared/fastbrowser_helper.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAE9C,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,GAAG,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC;AAEzD,MAAM,OAAO,iBAAiB;IAC7B,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,OAAe;QAC/B,wDAAwD;QACxD,MAAM,WAAW,GAAG,WAAW,SAAS,iDAAiD,OAAO,EAAE,CAAC;QACnG,OAAO,CAAC,KAAK,CAAC,oBAAoB,WAAW,EAAE,CAAC,CAAC;QACjD,OAAO,QAAQ,CAAC,WAAW,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC;IACpD,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,GAAW;QACpC,MAAM,iBAAiB,CAAC,GAAG,CAAC,wBAAwB,GAAG,GAAG,CAAC,CAAC;IAC7D,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,QAAgB,EAAE,KAAa;QACpD,MAAM,iBAAiB,CAAC,GAAG,CAAC,yBAAyB,QAAQ,cAAc,KAAK,GAAG,CAAC,CAAC;IACtF,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,IAAY;QAClC,MAAM,iBAAiB,CAAC,GAAG,CAAC,sBAAsB,IAAI,GAAG,CAAC,CAAC;IAC5D,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,QAAgB;QAClC,MAAM,iBAAiB,CAAC,GAAG,CAAC,aAAa,QAAQ,GAAG,CAAC,CAAC;IACvD,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,iBAAiB,CAAC,QAAgB,EAAE,KAAa;QAC7D,OAAO,MAAM,iBAAiB,CAAC,GAAG,CAAC,qCAAqC,QAAQ,aAAa,KAAK,EAAE,CAAC,CAAC;IACvG,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,6BAA6B,CAAC,QAAgB,EAAE,KAAa;QACzE,OAAO,MAAM,iBAAiB,CAAC,GAAG,CAAC,qCAAqC,QAAQ,aAAa,KAAK,mCAAmC,CAAC,CAAC;IACxI,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,YAAY;QACxB,OAAO,MAAM,iBAAiB,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;IACrD,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,cAAc,CAAC,QAAgB,EAAE,aAAa,GAAG,IAAI;QACjE,MAAM,IAAI,GAAG,aAAa,KAAK,KAAK,CAAC,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,EAAE,CAAC;QACnE,OAAO,MAAM,iBAAiB,CAAC,GAAG,CAAC,+BAA+B,QAAQ,IAAI,IAAI,EAAE,CAAC,CAAC;IACvF,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,cAAc,CAAC,YAAoB;QAC/C,OAAO,MAAM,iBAAiB,CAAC,GAAG,CAAC,6BAA6B,YAAY,GAAG,CAAC,CAAC;IAClF,CAAC;CACD"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
|
|
3
|
+
# export NODE_OPTIONS=''
|
|
4
|
+
# export NPM_CONFIG_LOGLEVEL=silent
|
|
5
|
+
FASTBROWSER_CLI="npm run dev:cli --"
|
|
6
|
+
# FASTBROWSER_CLI="npx fastbrowser_cli"
|
|
7
|
+
|
|
8
|
+
# Function to sleep for a random duration between delayBase - delayRange/2 and delayBase + delayRange/2
|
|
9
|
+
# Usage: random_sleep <delayBase> <delayRange>
|
|
10
|
+
random_sleep() {
|
|
11
|
+
local delayBase="$1"
|
|
12
|
+
local delayRange="$2"
|
|
13
|
+
local delay
|
|
14
|
+
delay=$(awk -v b="$delayBase" -v r="$delayRange" 'BEGIN { srand(); printf "%.3f", b - r/2 + rand()*r }')
|
|
15
|
+
sleep "$delay"
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
#######################################################################################
|
|
19
|
+
|
|
20
|
+
# Check if the CLI is working properly
|
|
21
|
+
eval "$FASTBROWSER_CLI" check
|
|
22
|
+
|
|
23
|
+
# Goto linkedin messaging page using the CLI commands below:
|
|
24
|
+
eval "$FASTBROWSER_CLI" navigate_page --url https://www.linkedin.com/messaging/
|
|
25
|
+
|
|
26
|
+
# list all the threads conversations in the left sidebar
|
|
27
|
+
eval "$FASTBROWSER_CLI" query_selectors -s 'list[name="Conversation List"] > listitem heading' -a
|
|
28
|
+
|
|
29
|
+
#######################################################################################
|
|
30
|
+
|
|
31
|
+
# Select the conversation with Eric Defiez
|
|
32
|
+
eval "$FASTBROWSER_CLI" click -s 'list[name="Conversation List"] > listitem heading[name^="Eric Defiez"]'
|
|
33
|
+
|
|
34
|
+
#######################################################################################
|
|
35
|
+
|
|
36
|
+
# Fill the message content
|
|
37
|
+
eval "$FASTBROWSER_CLI" fill_form -s 'textbox[name^="Write"]' -v "Hello"
|
|
38
|
+
|
|
39
|
+
# Click the "Send" button to send the message
|
|
40
|
+
eval "$FASTBROWSER_CLI" click -s 'button[name^="Send"]'
|
|
@@ -0,0 +1,326 @@
|
|
|
1
|
+
#!/usr/bin/env npx tsx
|
|
2
|
+
|
|
3
|
+
import { Command } from 'commander';
|
|
4
|
+
|
|
5
|
+
import { A11yQuery, A11yTree, AxNode } from 'a11y_parse';
|
|
6
|
+
import { FastBrowserHelper } from '../wttj_cli/fastbrowser_helper.js';
|
|
7
|
+
|
|
8
|
+
///////////////////////////////////////////////////////////////////////////////
|
|
9
|
+
///////////////////////////////////////////////////////////////////////////////
|
|
10
|
+
//
|
|
11
|
+
///////////////////////////////////////////////////////////////////////////////
|
|
12
|
+
///////////////////////////////////////////////////////////////////////////////
|
|
13
|
+
|
|
14
|
+
class MessagesThreadHelper {
|
|
15
|
+
|
|
16
|
+
static async parseMessagesThread(
|
|
17
|
+
axNodeThread: AxNode,
|
|
18
|
+
overrideYear?: number,
|
|
19
|
+
): Promise<string> {
|
|
20
|
+
const lines: string[] = [];
|
|
21
|
+
let currentDate: Date | null = null;
|
|
22
|
+
let currentSender: string | null = null;
|
|
23
|
+
let currentTime: { hours: number; minutes: number } | null = null;
|
|
24
|
+
const year = overrideYear !== undefined ? overrideYear : new Date().getFullYear();
|
|
25
|
+
|
|
26
|
+
for (const item of axNodeThread.children) {
|
|
27
|
+
if (item.children.length === 0) {
|
|
28
|
+
continue;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
const dateChild = item.children.find(
|
|
32
|
+
(c) => c.role === 'time'
|
|
33
|
+
&& c.attributes['value'] !== undefined
|
|
34
|
+
&& c.attributes['value'].startsWith('•') === false,
|
|
35
|
+
);
|
|
36
|
+
if (dateChild !== undefined && dateChild.attributes['value'] !== undefined) {
|
|
37
|
+
currentDate = MessagesThreadHelper.parseDateMarker(dateChild.attributes['value'], year);
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
const headerChild = item.children.find(
|
|
41
|
+
(c) => c.role === 'generic'
|
|
42
|
+
&& c.attributes['value'] !== undefined
|
|
43
|
+
&& / sent the following messages at /.test(c.attributes['value']),
|
|
44
|
+
);
|
|
45
|
+
if (headerChild !== undefined && headerChild.attributes['value'] !== undefined) {
|
|
46
|
+
const parsed = MessagesThreadHelper.extractSenderFromHeader(headerChild.attributes['value']);
|
|
47
|
+
if (parsed !== null) {
|
|
48
|
+
currentSender = parsed.sender;
|
|
49
|
+
currentTime = MessagesThreadHelper.parseTimeOfDay(parsed.time);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
const innerTimes = A11yQuery.querySelectorAll(item, 'time');
|
|
54
|
+
const bulletTime = innerTimes.find(
|
|
55
|
+
(t) => t.attributes['value'] !== undefined && t.attributes['value'].startsWith('•'),
|
|
56
|
+
);
|
|
57
|
+
if (bulletTime !== undefined && bulletTime.attributes['value'] !== undefined) {
|
|
58
|
+
currentTime = MessagesThreadHelper.parseTimeOfDay(bulletTime.attributes['value']);
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
if (headerChild === undefined) {
|
|
62
|
+
const linkNodes = A11yQuery.querySelectorAll(item, 'link[url*="linkedin.com/in/"]');
|
|
63
|
+
const senderLink = linkNodes.find(
|
|
64
|
+
(l) => l.name !== undefined
|
|
65
|
+
&& l.name.length > 0
|
|
66
|
+
&& l.name.startsWith('View ') === false,
|
|
67
|
+
);
|
|
68
|
+
if (senderLink !== undefined && senderLink.name !== undefined) {
|
|
69
|
+
currentSender = senderLink.name;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
const paragraphs = A11yQuery.querySelectorAll(item, 'paragraph')
|
|
74
|
+
.filter((p) => MessagesThreadHelper.hasButtonAncestor(p, item) === false);
|
|
75
|
+
const texts = paragraphs
|
|
76
|
+
.map((p) => MessagesThreadHelper.extractParagraphText(p))
|
|
77
|
+
.filter((t) => t.length > 0);
|
|
78
|
+
if (texts.length === 0) {
|
|
79
|
+
continue;
|
|
80
|
+
}
|
|
81
|
+
if (currentDate === null || currentSender === null || currentTime === null) {
|
|
82
|
+
continue;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
const iso = MessagesThreadHelper.combineDateTime(currentDate, currentTime);
|
|
86
|
+
lines.push(`${iso}:${currentSender}: ${texts.join(' ')}`);
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
return lines.join('\n');
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
private static parseDateMarker(value: string, fallbackYear: number): Date {
|
|
93
|
+
const months: Record<string, number> = {
|
|
94
|
+
Jan: 0, Feb: 1, Mar: 2, Apr: 3, May: 4, Jun: 5,
|
|
95
|
+
Jul: 6, Aug: 7, Sep: 8, Oct: 9, Nov: 10, Dec: 11,
|
|
96
|
+
};
|
|
97
|
+
const match = value.match(/^([A-Za-z]+)\s+(\d{1,2})(?:,\s*(\d{4}))?$/);
|
|
98
|
+
if (match === null) {
|
|
99
|
+
throw new Error(`Cannot parse date marker: "${value}"`);
|
|
100
|
+
}
|
|
101
|
+
const monthIndex = months[match[1]];
|
|
102
|
+
if (monthIndex === undefined) {
|
|
103
|
+
throw new Error(`Unknown month name: "${match[1]}"`);
|
|
104
|
+
}
|
|
105
|
+
const year = match[3] !== undefined ? parseInt(match[3], 10) : fallbackYear;
|
|
106
|
+
return new Date(year, monthIndex, parseInt(match[2], 10));
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
private static parseTimeOfDay(value: string): { hours: number; minutes: number } {
|
|
110
|
+
const cleaned = value.replace(/^•\s*/, '').trim();
|
|
111
|
+
const match = cleaned.match(/^(\d{1,2}):(\d{2})\s*(AM|PM)$/i);
|
|
112
|
+
if (match === null) {
|
|
113
|
+
throw new Error(`Cannot parse time of day: "${value}"`);
|
|
114
|
+
}
|
|
115
|
+
let hours = parseInt(match[1], 10);
|
|
116
|
+
const minutes = parseInt(match[2], 10);
|
|
117
|
+
const meridiem = match[3].toUpperCase();
|
|
118
|
+
if (meridiem === 'AM' && hours === 12) {
|
|
119
|
+
hours = 0;
|
|
120
|
+
} else if (meridiem === 'PM' && hours !== 12) {
|
|
121
|
+
hours += 12;
|
|
122
|
+
}
|
|
123
|
+
return { hours, minutes };
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
private static combineDateTime(date: Date, time: { hours: number; minutes: number }): string {
|
|
127
|
+
const yyyy = date.getFullYear().toString().padStart(4, '0');
|
|
128
|
+
const mm = (date.getMonth() + 1).toString().padStart(2, '0');
|
|
129
|
+
const dd = date.getDate().toString().padStart(2, '0');
|
|
130
|
+
const hh = time.hours.toString().padStart(2, '0');
|
|
131
|
+
const mi = time.minutes.toString().padStart(2, '0');
|
|
132
|
+
return `${yyyy}-${mm}-${dd}T${hh}:${mi}:00`;
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
private static extractParagraphText(paragraph: AxNode): string {
|
|
136
|
+
if (paragraph.attributes['value'] !== undefined) {
|
|
137
|
+
return paragraph.attributes['value'].trim();
|
|
138
|
+
}
|
|
139
|
+
const parts: string[] = [];
|
|
140
|
+
for (const child of paragraph.children) {
|
|
141
|
+
if (child.name !== undefined && child.name.length > 0) {
|
|
142
|
+
parts.push(child.name);
|
|
143
|
+
continue;
|
|
144
|
+
}
|
|
145
|
+
if (child.attributes['value'] !== undefined) {
|
|
146
|
+
parts.push(child.attributes['value']);
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
return parts.join(' ').trim();
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
private static extractSenderFromHeader(value: string): { sender: string; time: string } | null {
|
|
153
|
+
const match = value.match(/^(.+?) sent the following messages at (.+)$/);
|
|
154
|
+
if (match === null) {
|
|
155
|
+
return null;
|
|
156
|
+
}
|
|
157
|
+
return { sender: match[1], time: match[2] };
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
private static hasButtonAncestor(node: AxNode, stopAt: AxNode): boolean {
|
|
161
|
+
let current: AxNode | undefined = node.parent;
|
|
162
|
+
while (current !== undefined && current.uid !== stopAt.uid) {
|
|
163
|
+
if (current.role === 'button') {
|
|
164
|
+
return true;
|
|
165
|
+
}
|
|
166
|
+
current = current.parent;
|
|
167
|
+
}
|
|
168
|
+
return false;
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
///////////////////////////////////////////////////////////////////////////////
|
|
173
|
+
///////////////////////////////////////////////////////////////////////////////
|
|
174
|
+
//
|
|
175
|
+
///////////////////////////////////////////////////////////////////////////////
|
|
176
|
+
///////////////////////////////////////////////////////////////////////////////
|
|
177
|
+
|
|
178
|
+
class LinkedinDmHelper {
|
|
179
|
+
|
|
180
|
+
///////////////////////////////////////////////////////////////////////////////
|
|
181
|
+
///////////////////////////////////////////////////////////////////////////////
|
|
182
|
+
//
|
|
183
|
+
///////////////////////////////////////////////////////////////////////////////
|
|
184
|
+
///////////////////////////////////////////////////////////////////////////////
|
|
185
|
+
|
|
186
|
+
static async gotoMessaging(): Promise<void> {
|
|
187
|
+
await FastBrowserHelper.run('check');
|
|
188
|
+
await FastBrowserHelper.navigatePage('https://www.linkedin.com/messaging/');
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
///////////////////////////////////////////////////////////////////////////////
|
|
192
|
+
///////////////////////////////////////////////////////////////////////////////
|
|
193
|
+
//
|
|
194
|
+
///////////////////////////////////////////////////////////////////////////////
|
|
195
|
+
///////////////////////////////////////////////////////////////////////////////
|
|
196
|
+
|
|
197
|
+
static async listConvoNames(): Promise<string[]> {
|
|
198
|
+
const output = await FastBrowserHelper.querySelectorsAll(
|
|
199
|
+
'list[name="Conversation List"] > listitem heading',
|
|
200
|
+
0,
|
|
201
|
+
);
|
|
202
|
+
const names: string[] = [];
|
|
203
|
+
for (const line of output.split('\n')) {
|
|
204
|
+
if (/^uid=\S+\s+heading\s+"/.test(line) === false) {
|
|
205
|
+
continue;
|
|
206
|
+
}
|
|
207
|
+
const axNode = A11yTree.parse(line);
|
|
208
|
+
if (axNode.name === undefined) {
|
|
209
|
+
continue;
|
|
210
|
+
}
|
|
211
|
+
names.push(axNode.name);
|
|
212
|
+
}
|
|
213
|
+
return names;
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
///////////////////////////////////////////////////////////////////////////////
|
|
217
|
+
///////////////////////////////////////////////////////////////////////////////
|
|
218
|
+
//
|
|
219
|
+
///////////////////////////////////////////////////////////////////////////////
|
|
220
|
+
///////////////////////////////////////////////////////////////////////////////
|
|
221
|
+
|
|
222
|
+
static async clickConversation(targetUser: string): Promise<void> {
|
|
223
|
+
const escaped = targetUser.replace(/"/g, '\\"');
|
|
224
|
+
await FastBrowserHelper.click(
|
|
225
|
+
`list[name="Conversation List"] > listitem heading[name^="${escaped}"]`,
|
|
226
|
+
);
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
///////////////////////////////////////////////////////////////////////////////
|
|
230
|
+
///////////////////////////////////////////////////////////////////////////////
|
|
231
|
+
//
|
|
232
|
+
///////////////////////////////////////////////////////////////////////////////
|
|
233
|
+
///////////////////////////////////////////////////////////////////////////////
|
|
234
|
+
|
|
235
|
+
static async fillAndSendMessage(message: string): Promise<void> {
|
|
236
|
+
await FastBrowserHelper.fillForm('textbox[name^="Write"]', message);
|
|
237
|
+
await FastBrowserHelper.click('button[name^="Send"]');
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
///////////////////////////////////////////////////////////////////////////////
|
|
241
|
+
///////////////////////////////////////////////////////////////////////////////
|
|
242
|
+
//
|
|
243
|
+
///////////////////////////////////////////////////////////////////////////////
|
|
244
|
+
///////////////////////////////////////////////////////////////////////////////
|
|
245
|
+
|
|
246
|
+
static async getMessagesTranscript(): Promise<string> {
|
|
247
|
+
const output = await FastBrowserHelper.takeSnapshot();
|
|
248
|
+
const axTree = A11yTree.parse(output);
|
|
249
|
+
const threadNode = LinkedinDmHelper.findThreadNode(axTree);
|
|
250
|
+
return await MessagesThreadHelper.parseMessagesThread(threadNode);
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
///////////////////////////////////////////////////////////////////////////////
|
|
254
|
+
///////////////////////////////////////////////////////////////////////////////
|
|
255
|
+
//
|
|
256
|
+
///////////////////////////////////////////////////////////////////////////////
|
|
257
|
+
///////////////////////////////////////////////////////////////////////////////
|
|
258
|
+
|
|
259
|
+
private static findThreadNode(axTree: AxNode): AxNode {
|
|
260
|
+
const convList = A11yQuery.querySelector(axTree, 'list[name="Conversation List"]');
|
|
261
|
+
if (convList === undefined) {
|
|
262
|
+
throw new Error('Could not find conversation list node');
|
|
263
|
+
}
|
|
264
|
+
const convListParent = convList.parent;
|
|
265
|
+
if (convListParent === undefined) {
|
|
266
|
+
throw new Error('Conversation list node has no parent');
|
|
267
|
+
}
|
|
268
|
+
const convDetails = A11yTree.nextSibling(convListParent);
|
|
269
|
+
if (convDetails === undefined) {
|
|
270
|
+
throw new Error('Could not find conversation details node');
|
|
271
|
+
}
|
|
272
|
+
const threadNode = A11yQuery.querySelector(convDetails, 'list');
|
|
273
|
+
if (threadNode === undefined) {
|
|
274
|
+
throw new Error('Could not find thread node');
|
|
275
|
+
}
|
|
276
|
+
return threadNode;
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
///////////////////////////////////////////////////////////////////////////////
|
|
281
|
+
///////////////////////////////////////////////////////////////////////////////
|
|
282
|
+
// Entry point
|
|
283
|
+
///////////////////////////////////////////////////////////////////////////////
|
|
284
|
+
///////////////////////////////////////////////////////////////////////////////
|
|
285
|
+
|
|
286
|
+
async function main(): Promise<void> {
|
|
287
|
+
const program = new Command();
|
|
288
|
+
|
|
289
|
+
program
|
|
290
|
+
.name('linkedin_dm')
|
|
291
|
+
.description('LinkedIn DM CLI');
|
|
292
|
+
|
|
293
|
+
program
|
|
294
|
+
.command('list_convos')
|
|
295
|
+
.description('List the names of people you have conversations with')
|
|
296
|
+
.action(async () => {
|
|
297
|
+
await LinkedinDmHelper.gotoMessaging();
|
|
298
|
+
const names = await LinkedinDmHelper.listConvoNames();
|
|
299
|
+
for (const name of names) {
|
|
300
|
+
console.log(name);
|
|
301
|
+
}
|
|
302
|
+
});
|
|
303
|
+
|
|
304
|
+
program
|
|
305
|
+
.command('send <target_user> <message>')
|
|
306
|
+
.description('Send a message in an existing conversation')
|
|
307
|
+
.action(async (targetUser: string, message: string) => {
|
|
308
|
+
await LinkedinDmHelper.gotoMessaging();
|
|
309
|
+
await LinkedinDmHelper.clickConversation(targetUser);
|
|
310
|
+
await LinkedinDmHelper.fillAndSendMessage(message);
|
|
311
|
+
});
|
|
312
|
+
|
|
313
|
+
program
|
|
314
|
+
.command('messages <target_user>')
|
|
315
|
+
.description('Print the message thread of a conversation')
|
|
316
|
+
.action(async (targetUser: string) => {
|
|
317
|
+
await LinkedinDmHelper.gotoMessaging();
|
|
318
|
+
await LinkedinDmHelper.clickConversation(targetUser);
|
|
319
|
+
const transcript = await LinkedinDmHelper.getMessagesTranscript();
|
|
320
|
+
console.log(transcript);
|
|
321
|
+
});
|
|
322
|
+
|
|
323
|
+
await program.parseAsync();
|
|
324
|
+
}
|
|
325
|
+
|
|
326
|
+
void main();
|