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.
Files changed (102) hide show
  1. package/README.md +26 -5
  2. package/dist/contribs/_shared/fastbrowser_helper.d.ts +13 -0
  3. package/dist/contribs/_shared/fastbrowser_helper.d.ts.map +1 -0
  4. package/dist/contribs/_shared/fastbrowser_helper.js +39 -0
  5. package/dist/contribs/_shared/fastbrowser_helper.js.map +1 -0
  6. package/dist/contribs/linkedin_cli/src/cli.d.ts +3 -0
  7. package/dist/contribs/linkedin_cli/src/cli.d.ts.map +1 -0
  8. package/dist/contribs/linkedin_cli/src/cli.js +299 -0
  9. package/dist/contribs/linkedin_cli/src/cli.js.map +1 -0
  10. package/dist/contribs/linkedin_cli/src/libs/linkedin_profile_helper.d.ts +73 -0
  11. package/dist/contribs/linkedin_cli/src/libs/linkedin_profile_helper.d.ts.map +1 -0
  12. package/dist/contribs/linkedin_cli/src/libs/linkedin_profile_helper.js +866 -0
  13. package/dist/contribs/linkedin_cli/src/libs/linkedin_profile_helper.js.map +1 -0
  14. package/dist/contribs/linkedin_cli/src/libs/linkedin_recent_posts_helper.d.ts +61 -0
  15. package/dist/contribs/linkedin_cli/src/libs/linkedin_recent_posts_helper.d.ts.map +1 -0
  16. package/dist/contribs/linkedin_cli/src/libs/linkedin_recent_posts_helper.js +885 -0
  17. package/dist/contribs/linkedin_cli/src/libs/linkedin_recent_posts_helper.js.map +1 -0
  18. package/dist/contribs/linkedin_cli/src/libs/linkedin_thread_helper.d.ts +11 -0
  19. package/dist/contribs/linkedin_cli/src/libs/linkedin_thread_helper.d.ts.map +1 -0
  20. package/dist/contribs/linkedin_cli/src/libs/linkedin_thread_helper.js +145 -0
  21. package/dist/contribs/linkedin_cli/src/libs/linkedin_thread_helper.js.map +1 -0
  22. package/dist/contribs/twitter_cli/src/cli.d.ts +3 -0
  23. package/dist/contribs/twitter_cli/src/cli.d.ts.map +1 -0
  24. package/dist/contribs/twitter_cli/src/cli.js +273 -0
  25. package/dist/contribs/twitter_cli/src/cli.js.map +1 -0
  26. package/dist/contribs/twitter_cli/src/libs/twitter_profile_helper.d.ts +28 -0
  27. package/dist/contribs/twitter_cli/src/libs/twitter_profile_helper.d.ts.map +1 -0
  28. package/dist/contribs/twitter_cli/src/libs/twitter_profile_helper.js +274 -0
  29. package/dist/contribs/twitter_cli/src/libs/twitter_profile_helper.js.map +1 -0
  30. package/dist/contribs/twitter_cli/src/libs/twitter_recent_posts_helper.d.ts +43 -0
  31. package/dist/contribs/twitter_cli/src/libs/twitter_recent_posts_helper.d.ts.map +1 -0
  32. package/dist/contribs/twitter_cli/src/libs/twitter_recent_posts_helper.js +519 -0
  33. package/dist/contribs/twitter_cli/src/libs/twitter_recent_posts_helper.js.map +1 -0
  34. package/dist/contribs/twitter_cli/src/libs/twitter_thread_helper.d.ts +11 -0
  35. package/dist/contribs/twitter_cli/src/libs/twitter_thread_helper.d.ts.map +1 -0
  36. package/dist/contribs/twitter_cli/src/libs/twitter_thread_helper.js +213 -0
  37. package/dist/contribs/twitter_cli/src/libs/twitter_thread_helper.js.map +1 -0
  38. package/dist/fastbrowser_cli/fastbrowser_cli.js +43 -0
  39. package/dist/fastbrowser_cli/fastbrowser_cli.js.map +1 -1
  40. package/dist/fastbrowser_httpd/libs/tool-schemas.d.ts +4 -0
  41. package/dist/fastbrowser_httpd/libs/tool-schemas.d.ts.map +1 -1
  42. package/dist/fastbrowser_httpd/libs/tool-schemas.js +4 -0
  43. package/dist/fastbrowser_httpd/libs/tool-schemas.js.map +1 -1
  44. package/dist/fastbrowser_mcp/fastbrowser_mcp.js +36 -2
  45. package/dist/fastbrowser_mcp/fastbrowser_mcp.js.map +1 -1
  46. package/dist/fastbrowser_mcp/libs/mcp_target_helper.d.ts +2 -0
  47. package/dist/fastbrowser_mcp/libs/mcp_target_helper.d.ts.map +1 -1
  48. package/dist/fastbrowser_mcp/libs/mcp_target_helper.js +12 -0
  49. package/dist/fastbrowser_mcp/libs/mcp_target_helper.js.map +1 -1
  50. package/dist/fastbrowser_mcp/libs/response_formatter.d.ts +1 -0
  51. package/dist/fastbrowser_mcp/libs/response_formatter.d.ts.map +1 -1
  52. package/dist/fastbrowser_mcp/libs/response_formatter.js +27 -0
  53. package/dist/fastbrowser_mcp/libs/response_formatter.js.map +1 -1
  54. package/dist/shared/fastbrowser_helper.d.ts +13 -0
  55. package/dist/shared/fastbrowser_helper.d.ts.map +1 -0
  56. package/dist/shared/fastbrowser_helper.js +39 -0
  57. package/dist/shared/fastbrowser_helper.js.map +1 -0
  58. package/examples/linkedin_cli_TOREMOVE/README.md +7 -0
  59. package/examples/linkedin_cli_TOREMOVE/linkedin_dm.sh +40 -0
  60. package/examples/linkedin_cli_TOREMOVE/linkedin_dm.ts +326 -0
  61. package/examples/linkedin_cli_TOREMOVE/linkedin_dm_messages.ts +279 -0
  62. package/examples/linkedin_cli_TOREMOVE/linkedin_full_cycle.sh +5 -0
  63. package/examples/{linkedin_cli/linked_post.sh → linkedin_cli_TOREMOVE/linkedin_post.sh} +3 -0
  64. package/examples/linkedin_cli_TOREMOVE/message_thread.a11y.txt +252 -0
  65. package/examples/whatsapp/whatapp.a11y.txt +1521 -0
  66. package/examples/whatsapp/whatsapp.sh +10 -0
  67. package/listitem +7 -0
  68. package/package.json +7 -3
  69. package/skills/fastbrowser/SKILL.md +116 -29
  70. package/src/contribs/_shared/fastbrowser_helper.ts +49 -0
  71. package/src/contribs/linkedin_cli/README.md +80 -0
  72. package/src/contribs/linkedin_cli/data/linkedin_posts_jeromeetienne.a11y.txt +2364 -0
  73. package/src/contribs/linkedin_cli/data/linkedin_posts_jontwigge.a11y.txt +2740 -0
  74. package/src/contribs/linkedin_cli/data/linkedin_posts_julien_guezennec.a11y.txt +2073 -0
  75. package/src/contribs/linkedin_cli/data/linkedin_profile_jeromeetienne.a11y.txt +1863 -0
  76. package/src/contribs/linkedin_cli/data/linkedin_profile_jontwigge.a11y.txt +1738 -0
  77. package/src/contribs/linkedin_cli/data/linkedin_profile_julien_guezennec.a11y.txt +2182 -0
  78. package/src/contribs/linkedin_cli/src/cli.ts +345 -0
  79. package/src/contribs/linkedin_cli/src/libs/linkedin_profile_helper.ts +964 -0
  80. package/src/contribs/linkedin_cli/src/libs/linkedin_recent_posts_helper.ts +982 -0
  81. package/src/contribs/linkedin_cli/src/libs/linkedin_thread_helper.ts +171 -0
  82. package/src/contribs/twitter_cli/README.md +79 -0
  83. package/src/contribs/twitter_cli/data/twitter_chat.a11y.txt +215 -0
  84. package/src/contribs/twitter_cli/data/twitter_home.a11y.txt +467 -0
  85. package/src/contribs/twitter_cli/data/twitter_profile.a11y.txt +418 -0
  86. package/src/contribs/twitter_cli/data/twitter_profile_jontwigge.a11y.txt +484 -0
  87. package/src/contribs/twitter_cli/data/twitter_profile_molokoloco.a11y.txt +483 -0
  88. package/src/contribs/twitter_cli/src/cli.ts +315 -0
  89. package/src/contribs/twitter_cli/src/libs/twitter_profile_helper.ts +328 -0
  90. package/src/contribs/twitter_cli/src/libs/twitter_recent_posts_helper.ts +607 -0
  91. package/src/contribs/twitter_cli/src/libs/twitter_thread_helper.ts +240 -0
  92. package/src/fastbrowser_cli/fastbrowser_cli.ts +51 -0
  93. package/src/fastbrowser_httpd/libs/tool-schemas.ts +6 -0
  94. package/src/fastbrowser_mcp/fastbrowser_mcp.ts +46 -3
  95. package/src/fastbrowser_mcp/libs/mcp_target_helper.ts +11 -0
  96. package/src/fastbrowser_mcp/libs/response_formatter.ts +29 -0
  97. package/src/shared/fastbrowser_helper.ts +49 -0
  98. package/tsconfig.json +1 -1
  99. package/examples/linkedin_cli/linked_dm.sh +0 -19
  100. package/examples/mcp_client_playwright.ts +0 -34
  101. /package/examples/{linkedin_cli → linkedin_cli_TOREMOVE}/linkedin.snapshot.txt +0 -0
  102. /package/examples/{twitter_cli → twitter_cli_TOREMOVE}/twitter_post.sh +0 -0
package/README.md CHANGED
@@ -13,7 +13,8 @@ A lighter alternative to Chrome DevTools MCP or Puppeteer, designed for AI agent
13
13
  - **Lean output** — reduces LLM input size, parsing complexity, and iteration cost while improving response quality
14
14
 
15
15
 
16
- ## How to install the CLI tool for claude
16
+ ## How to Install it
17
+ ### How to install the CLI tool for claude terminal
17
18
 
18
19
  fastbrowser can be used at the cli level, with a SKILL.md that maps CLI commands to tools. To install the SKILL.md into a claude agent folder:
19
20
 
@@ -24,8 +25,8 @@ cd ~/.claude
24
25
  npx fastbrowser_cli install
25
26
  ```
26
27
 
27
- ### How to include Playwright chrome extension
28
- It is use by fastbrowser_mcp to ontrol the browser.
28
+ ### How to install Playwright chrome extension
29
+ It is used by fastbrowser_mcp to control the browser.
29
30
 
30
31
  [Playwright MCP Bridge](
31
32
  https://chromewebstore.google.com/detail/playwright-mcp-bridge/mmlmfjhmonkocbjadbfplnigmagldckm)
@@ -35,7 +36,7 @@ https://chromewebstore.google.com/detail/playwright-mcp-bridge/mmlmfjhmonkocbjad
35
36
  How to launch the MCP server that the CLI relies on to control the browser:
36
37
 
37
38
  ```bash
38
- npx -p fastbrowser_cli fastbrowser_mcp mcp_server
39
+ npx -p fastbrowser_cli@latest fastbrowser_mcp mcp_server
39
40
  ```
40
41
 
41
42
  how to install it in [Claude Desktop](https://code.claude.com/docs/en/desktop) - [more details](https://modelcontextprotocol.io/docs/develop/connect-local-servers#installing-the-filesystem-server)
@@ -51,13 +52,33 @@ how to install it in [Claude Desktop](https://code.claude.com/docs/en/desktop) -
51
52
  "fastbrowser_mcp": {
52
53
  "command": "npx",
53
54
  "args": [
54
- "-p", "fastbrowser_cli", "fastbrowser_mcp", "mcp_server"
55
+ "-p", "fastbrowser_cli@latest", "fastbrowser_mcp", "mcp_server"
55
56
  ]
56
57
  }
57
58
  }
58
59
  }
59
60
  ```
60
61
 
62
+ ### Check it is properly installed ?
63
+ Just ask to claude `hat fastbrowser skill can do for me ?`
64
+
65
+ ## Warning
66
+
67
+ **Never manually close pages opened by Playwright MCP Bridge.** These pages maintain the MCP connection.
68
+
69
+ ### Proper cleanup
70
+ - Use `npx fastbrowser_cli close_page` to close individual pages
71
+ - Use `npx fastbrowser_cli server stop` to shut down the daemon
72
+
73
+ ### If pages are manually closed
74
+ The MCP connection will break. To recover:
75
+
76
+ ```bash
77
+ npx npx fastbrowser_cli server restart
78
+ ```
79
+
80
+ This re-establishes the MCP connection and opens a new control page.
81
+
61
82
  ## Architecture
62
83
 
63
84
  Three components ship together in this package:
@@ -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/contribs/_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}../../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/contribs/_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,6CAA6C,OAAO,EAAE,CAAC;QAC/F,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,3 @@
1
+ #!/usr/bin/env npx tsx
2
+ export {};
3
+ //# sourceMappingURL=cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../../../../src/contribs/linkedin_cli/src/cli.ts"],"names":[],"mappings":""}
@@ -0,0 +1,299 @@
1
+ #!/usr/bin/env npx tsx
2
+ // npm imports
3
+ import { Command } from 'commander';
4
+ import { A11yQuery, A11yTree } from 'a11y_parse';
5
+ // local imports
6
+ import { FastBrowserHelper } from '../../_shared/fastbrowser_helper.js';
7
+ import { LinkedinThreadHelper } from './libs/linkedin_thread_helper.js';
8
+ import { LinkedinProfileHelper } from './libs/linkedin_profile_helper.js';
9
+ import { LinkedinRecentPostsHelper } from './libs/linkedin_recent_posts_helper.js';
10
+ ///////////////////////////////////////////////////////////////////////////////
11
+ ///////////////////////////////////////////////////////////////////////////////
12
+ //
13
+ ///////////////////////////////////////////////////////////////////////////////
14
+ ///////////////////////////////////////////////////////////////////////////////
15
+ class MainHelper {
16
+ ///////////////////////////////////////////////////////////////////////////////
17
+ ///////////////////////////////////////////////////////////////////////////////
18
+ //
19
+ ///////////////////////////////////////////////////////////////////////////////
20
+ ///////////////////////////////////////////////////////////////////////////////
21
+ static async gotoPageMessaging() {
22
+ await FastBrowserHelper.run('check');
23
+ await FastBrowserHelper.navigatePage('https://www.linkedin.com/messaging/');
24
+ }
25
+ ///////////////////////////////////////////////////////////////////////////////
26
+ ///////////////////////////////////////////////////////////////////////////////
27
+ //
28
+ ///////////////////////////////////////////////////////////////////////////////
29
+ ///////////////////////////////////////////////////////////////////////////////
30
+ static async gotoPageFeed() {
31
+ await FastBrowserHelper.run('check');
32
+ await FastBrowserHelper.navigatePage('https://www.linkedin.com/feed/');
33
+ }
34
+ ///////////////////////////////////////////////////////////////////////////////
35
+ ///////////////////////////////////////////////////////////////////////////////
36
+ //
37
+ ///////////////////////////////////////////////////////////////////////////////
38
+ ///////////////////////////////////////////////////////////////////////////////
39
+ static async gotoPageProfile(slug) {
40
+ if (slug.length === 0) {
41
+ throw new Error('slug is required');
42
+ }
43
+ await FastBrowserHelper.run('check');
44
+ await FastBrowserHelper.navigatePage(`https://www.linkedin.com/in/${slug}/`);
45
+ }
46
+ ///////////////////////////////////////////////////////////////////////////////
47
+ ///////////////////////////////////////////////////////////////////////////////
48
+ //
49
+ ///////////////////////////////////////////////////////////////////////////////
50
+ ///////////////////////////////////////////////////////////////////////////////
51
+ static async gotoPageRecentPosts(slug) {
52
+ if (slug.length === 0) {
53
+ throw new Error('slug is required');
54
+ }
55
+ await FastBrowserHelper.run('check');
56
+ await FastBrowserHelper.navigatePage(`https://www.linkedin.com/in/${slug}/recent-activity/all/`);
57
+ }
58
+ ///////////////////////////////////////////////////////////////////////////////
59
+ ///////////////////////////////////////////////////////////////////////////////
60
+ //
61
+ ///////////////////////////////////////////////////////////////////////////////
62
+ ///////////////////////////////////////////////////////////////////////////////
63
+ static async exportRecentPosts(slug, limit) {
64
+ // Trigger LinkedIn's infinite-scroll inside the window so that more than the initial posts get rendered.
65
+ const scrollFunctionTxt = [
66
+ `() => {`,
67
+ ` const tryCount = 6;`,
68
+ ` const delayMs = 500;`,
69
+ ` (async () => {`,
70
+ ` for (let i = 0; i < tryCount; i++) {`,
71
+ ` window.scrollTo({`,
72
+ ` top: 600000,`,
73
+ ` behavior: 'smooth'`,
74
+ ` });`,
75
+ ` await new Promise(resolve => setTimeout(resolve, delayMs));`,
76
+ ` }`,
77
+ ` })();`,
78
+ `}`,
79
+ ].join('\n');
80
+ await FastBrowserHelper.evaluateScript(scrollFunctionTxt);
81
+ // take snapshot and parse posts
82
+ const snapshot = await FastBrowserHelper.takeSnapshot();
83
+ let posts = LinkedinRecentPostsHelper.parsePosts(snapshot, slug);
84
+ // apply limit
85
+ if (limit > 0 && posts.length > limit) {
86
+ posts = posts.slice(0, limit);
87
+ }
88
+ // return posts
89
+ return posts;
90
+ }
91
+ ///////////////////////////////////////////////////////////////////////////////
92
+ ///////////////////////////////////////////////////////////////////////////////
93
+ //
94
+ ///////////////////////////////////////////////////////////////////////////////
95
+ ///////////////////////////////////////////////////////////////////////////////
96
+ static async exportProfile(slug) {
97
+ // scroll to the bottom of the page multiple times to load dynamic content (like experience details, recommendations, etc.)
98
+ const functionTxt = [
99
+ `() => {`,
100
+ ` // select the element`,
101
+ ` const workspace = document.querySelector('main#workspace');`,
102
+ ` if (workspace === null) {`,
103
+ ` throw new Error('Workspace element not found');`,
104
+ ` }`,
105
+ ` // scroll to the bottom of the page multiple times to load dynamic content (like experience details, recommendations, etc.)`,
106
+ ` const tryCount = 6;`,
107
+ ` const delayMs = 500;`,
108
+ ` (async () => {`,
109
+ ` for (let i = 0; i < tryCount; i++) {`,
110
+ ` workspace.scrollBy({`,
111
+ ` top: 600000,`,
112
+ ` behavior: 'smooth'`,
113
+ ` });`,
114
+ ` await new Promise(resolve => setTimeout(resolve, delayMs));`,
115
+ ` }`,
116
+ ` resolve(true);`,
117
+ ` })();`,
118
+ `}`,
119
+ ].join('\n');
120
+ const resultEvaluateStr = await FastBrowserHelper.evaluateScript(functionTxt);
121
+ // Take snapshot
122
+ const snapshot = await FastBrowserHelper.takeSnapshot();
123
+ // Parse profile
124
+ const linkedinProfile = LinkedinProfileHelper.parseProfile(snapshot, slug);
125
+ // Return profile
126
+ return linkedinProfile;
127
+ }
128
+ ///////////////////////////////////////////////////////////////////////////////
129
+ ///////////////////////////////////////////////////////////////////////////////
130
+ //
131
+ ///////////////////////////////////////////////////////////////////////////////
132
+ ///////////////////////////////////////////////////////////////////////////////
133
+ static async createPost(content) {
134
+ await FastBrowserHelper.click('button[name^="Start a post"]');
135
+ await FastBrowserHelper.fillForm('textbox[name^="Text editor"]', content);
136
+ await FastBrowserHelper.click('button[name^="Post"]');
137
+ }
138
+ ///////////////////////////////////////////////////////////////////////////////
139
+ ///////////////////////////////////////////////////////////////////////////////
140
+ //
141
+ ///////////////////////////////////////////////////////////////////////////////
142
+ ///////////////////////////////////////////////////////////////////////////////
143
+ static async listConvoNames() {
144
+ const output = await FastBrowserHelper.querySelectorsAll('list[name="Conversation List"] > listitem heading', 0);
145
+ const names = [];
146
+ for (const line of output.split('\n')) {
147
+ if (/^uid=\S+\s+heading\s+"/.test(line) === false) {
148
+ continue;
149
+ }
150
+ const axNode = A11yTree.parse(line);
151
+ if (axNode.name === undefined) {
152
+ continue;
153
+ }
154
+ names.push(axNode.name);
155
+ }
156
+ return names;
157
+ }
158
+ ///////////////////////////////////////////////////////////////////////////////
159
+ ///////////////////////////////////////////////////////////////////////////////
160
+ //
161
+ ///////////////////////////////////////////////////////////////////////////////
162
+ ///////////////////////////////////////////////////////////////////////////////
163
+ static async selectConversation(targetUser) {
164
+ const escaped = targetUser.replace(/"/g, '\\"');
165
+ await FastBrowserHelper.click(`list[name="Conversation List"] > listitem heading[name^="${escaped}"]`);
166
+ }
167
+ ///////////////////////////////////////////////////////////////////////////////
168
+ ///////////////////////////////////////////////////////////////////////////////
169
+ //
170
+ ///////////////////////////////////////////////////////////////////////////////
171
+ ///////////////////////////////////////////////////////////////////////////////
172
+ static async fillAndSendMessage(message) {
173
+ await FastBrowserHelper.fillForm('textbox[name^="Write"]', message);
174
+ await FastBrowserHelper.click('button[name^="Send"]');
175
+ }
176
+ ///////////////////////////////////////////////////////////////////////////////
177
+ ///////////////////////////////////////////////////////////////////////////////
178
+ //
179
+ ///////////////////////////////////////////////////////////////////////////////
180
+ ///////////////////////////////////////////////////////////////////////////////
181
+ static async getMessagesTranscript() {
182
+ const output = await FastBrowserHelper.takeSnapshot();
183
+ const axTree = A11yTree.parse(output);
184
+ const threadNode = MainHelper.findThreadNode(axTree);
185
+ return await LinkedinThreadHelper.parseMessagesThread(threadNode);
186
+ }
187
+ ///////////////////////////////////////////////////////////////////////////////
188
+ ///////////////////////////////////////////////////////////////////////////////
189
+ //
190
+ ///////////////////////////////////////////////////////////////////////////////
191
+ ///////////////////////////////////////////////////////////////////////////////
192
+ static findThreadNode(axTree) {
193
+ const convList = A11yQuery.querySelector(axTree, 'list[name="Conversation List"]');
194
+ if (convList === undefined) {
195
+ throw new Error('Could not find conversation list node');
196
+ }
197
+ const convListParent = convList.parent;
198
+ if (convListParent === undefined) {
199
+ throw new Error('Conversation list node has no parent');
200
+ }
201
+ const convDetails = A11yTree.nextSibling(convListParent);
202
+ if (convDetails === undefined) {
203
+ throw new Error('Could not find conversation details node');
204
+ }
205
+ const threadNode = A11yQuery.querySelector(convDetails, 'list');
206
+ if (threadNode === undefined) {
207
+ throw new Error('Could not find thread node');
208
+ }
209
+ return threadNode;
210
+ }
211
+ }
212
+ ///////////////////////////////////////////////////////////////////////////////
213
+ ///////////////////////////////////////////////////////////////////////////////
214
+ // Entry point
215
+ ///////////////////////////////////////////////////////////////////////////////
216
+ ///////////////////////////////////////////////////////////////////////////////
217
+ async function main() {
218
+ const program = new Command();
219
+ program
220
+ .name('linkedin_cli')
221
+ .description('LinkedIn DM CLI - command line tool to interact with LinkedIn using the FastBrowser CLI');
222
+ program
223
+ .command('post <content>')
224
+ .description('Create a post on the LinkedIn feed')
225
+ .action(async (content) => {
226
+ await MainHelper.gotoPageFeed();
227
+ await MainHelper.createPost(content);
228
+ });
229
+ program
230
+ .command('dm_page')
231
+ .description('Navigate to the LinkedIn messaging page')
232
+ .action(async () => {
233
+ await MainHelper.gotoPageMessaging();
234
+ });
235
+ program
236
+ .command('dm_list')
237
+ .description('List the names of people you have conversations with. (assume you did \'dm_page\' first)')
238
+ .action(async () => {
239
+ const names = await MainHelper.listConvoNames();
240
+ for (const name of names) {
241
+ console.log(name);
242
+ }
243
+ });
244
+ program
245
+ .command('dm_send <target_user> <message>')
246
+ .description('Send a message in an existing conversation. (assume you did \'dm_page\' first)')
247
+ .action(async (targetUser, message) => {
248
+ await MainHelper.selectConversation(targetUser);
249
+ await MainHelper.fillAndSendMessage(message);
250
+ });
251
+ program
252
+ .command('dm_thread <target_user>')
253
+ .description('Get the message thread of a conversation. (assume you did \'dm_page\' first)')
254
+ .action(async (targetUser) => {
255
+ await MainHelper.selectConversation(targetUser);
256
+ const transcript = await MainHelper.getMessagesTranscript();
257
+ console.log(transcript);
258
+ });
259
+ program
260
+ .command('profile <slug>')
261
+ .description('Export a LinkedIn profile by slug (path component of /in/<slug>/)')
262
+ .option('-f, --format <format>', 'output format: markdown or json', 'markdown')
263
+ .action(async (slug, opts) => {
264
+ if (opts.format !== 'markdown' && opts.format !== 'json') {
265
+ throw new Error(`unknown format '${opts.format}', expected 'markdown' or 'json'`);
266
+ }
267
+ await MainHelper.gotoPageProfile(slug);
268
+ const profile = await MainHelper.exportProfile(slug);
269
+ if (opts.format === 'json') {
270
+ console.log(JSON.stringify(profile));
271
+ return;
272
+ }
273
+ console.log(LinkedinProfileHelper.formatMarkdown(profile));
274
+ });
275
+ program
276
+ .command('recent_posts <slug>')
277
+ .description('Export the recent activity (posts) of a LinkedIn profile')
278
+ .option('-f, --format <format>', 'output format: markdown or json', 'markdown')
279
+ .option('-l, --limit <limit>', 'max number of posts to return (0 = all visible)', '0')
280
+ .action(async (slug, opts) => {
281
+ if (opts.format !== 'markdown' && opts.format !== 'json') {
282
+ throw new Error(`unknown format '${opts.format}', expected 'markdown' or 'json'`);
283
+ }
284
+ const limit = parseInt(opts.limit, 10);
285
+ if (Number.isNaN(limit) === true || limit < 0) {
286
+ throw new Error(`invalid limit '${opts.limit}', expected a non-negative integer`);
287
+ }
288
+ await MainHelper.gotoPageRecentPosts(slug);
289
+ const posts = await MainHelper.exportRecentPosts(slug, limit);
290
+ if (opts.format === 'json') {
291
+ console.log(JSON.stringify(posts));
292
+ return;
293
+ }
294
+ console.log(LinkedinRecentPostsHelper.formatMarkdown(posts));
295
+ });
296
+ await program.parseAsync();
297
+ }
298
+ void main();
299
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../../../../src/contribs/linkedin_cli/src/cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,73 @@
1
+ export type LinkedinExperienceRole = {
2
+ role: string | null;
3
+ employmentType: string | null;
4
+ duration: string | null;
5
+ location: string | null;
6
+ description: string | null;
7
+ };
8
+ export type LinkedinExperience = {
9
+ company: string | null;
10
+ totalDuration: string | null;
11
+ roles: LinkedinExperienceRole[];
12
+ };
13
+ export type LinkedinEducation = {
14
+ school: string | null;
15
+ degree: string | null;
16
+ dates: string | null;
17
+ };
18
+ export type LinkedinProfile = {
19
+ slug: string;
20
+ displayName: string | null;
21
+ headline: string | null;
22
+ location: string | null;
23
+ connectionsCount: string | null;
24
+ followersCount: string | null;
25
+ about: string | null;
26
+ website: string | null;
27
+ currentCompany: string | null;
28
+ currentEducation: string | null;
29
+ openToWork: boolean;
30
+ experience: LinkedinExperience[];
31
+ education: LinkedinEducation[];
32
+ };
33
+ export declare class LinkedinProfileHelper {
34
+ static parseProfile(rawSnapshot: string, slug: string): LinkedinProfile;
35
+ static formatMarkdown(profile: LinkedinProfile): string;
36
+ static resolveSafetyUrl(url: string): string;
37
+ private static extractAxTreeText;
38
+ private static cleanString;
39
+ private static getValue;
40
+ private static collectParagraphValues;
41
+ private static collectParagraphValuesInner;
42
+ private static collectSubtreeText;
43
+ private static findHeroProfileLink;
44
+ private static findHeroCard;
45
+ private static extractDisplayName;
46
+ private static extractLocation;
47
+ private static extractHeadline;
48
+ private static extractConnectionsCount;
49
+ private static extractFollowersCount;
50
+ private static extractAbout;
51
+ private static extractOpenToWork;
52
+ private static collectHeroButtons;
53
+ private static extractWebsite;
54
+ private static extractCompanyAndSchool;
55
+ private static findSectionHeading;
56
+ private static findSectionBody;
57
+ private static isControlContainer;
58
+ private static extractExperience;
59
+ private static parseExperienceEntry;
60
+ private static buildSkipValues;
61
+ private static findLogoName;
62
+ private static findDirectChildList;
63
+ private static parseMultiRoleExperience;
64
+ private static parseSingleRoleExperience;
65
+ private static parseRoleEntry;
66
+ private static extractEmploymentType;
67
+ private static findRoleDescription;
68
+ private static extractEducation;
69
+ private static parseEducationEntry;
70
+ private static formatRoleLine;
71
+ private static formatEducationLine;
72
+ }
73
+ //# sourceMappingURL=linkedin_profile_helper.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"linkedin_profile_helper.d.ts","sourceRoot":"","sources":["../../../../../src/contribs/linkedin_cli/src/libs/linkedin_profile_helper.ts"],"names":[],"mappings":"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"}