fastbrowser_cli 1.0.37 → 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 (98) hide show
  1. package/dist/contribs/_shared/fastbrowser_helper.d.ts +13 -0
  2. package/dist/contribs/_shared/fastbrowser_helper.d.ts.map +1 -0
  3. package/dist/contribs/_shared/fastbrowser_helper.js +39 -0
  4. package/dist/contribs/_shared/fastbrowser_helper.js.map +1 -0
  5. package/dist/contribs/linkedin_cli/src/cli.d.ts +3 -0
  6. package/dist/contribs/linkedin_cli/src/cli.d.ts.map +1 -0
  7. package/dist/contribs/linkedin_cli/src/cli.js +299 -0
  8. package/dist/contribs/linkedin_cli/src/cli.js.map +1 -0
  9. package/dist/contribs/linkedin_cli/src/libs/linkedin_profile_helper.d.ts +73 -0
  10. package/dist/contribs/linkedin_cli/src/libs/linkedin_profile_helper.d.ts.map +1 -0
  11. package/dist/contribs/linkedin_cli/src/libs/linkedin_profile_helper.js +866 -0
  12. package/dist/contribs/linkedin_cli/src/libs/linkedin_profile_helper.js.map +1 -0
  13. package/dist/contribs/linkedin_cli/src/libs/linkedin_recent_posts_helper.d.ts +61 -0
  14. package/dist/contribs/linkedin_cli/src/libs/linkedin_recent_posts_helper.d.ts.map +1 -0
  15. package/dist/contribs/linkedin_cli/src/libs/linkedin_recent_posts_helper.js +885 -0
  16. package/dist/contribs/linkedin_cli/src/libs/linkedin_recent_posts_helper.js.map +1 -0
  17. package/dist/contribs/linkedin_cli/src/libs/linkedin_thread_helper.d.ts +11 -0
  18. package/dist/contribs/linkedin_cli/src/libs/linkedin_thread_helper.d.ts.map +1 -0
  19. package/dist/contribs/linkedin_cli/src/libs/linkedin_thread_helper.js +145 -0
  20. package/dist/contribs/linkedin_cli/src/libs/linkedin_thread_helper.js.map +1 -0
  21. package/dist/contribs/twitter_cli/src/cli.d.ts +3 -0
  22. package/dist/contribs/twitter_cli/src/cli.d.ts.map +1 -0
  23. package/dist/contribs/twitter_cli/src/cli.js +273 -0
  24. package/dist/contribs/twitter_cli/src/cli.js.map +1 -0
  25. package/dist/contribs/twitter_cli/src/libs/twitter_profile_helper.d.ts +28 -0
  26. package/dist/contribs/twitter_cli/src/libs/twitter_profile_helper.d.ts.map +1 -0
  27. package/dist/contribs/twitter_cli/src/libs/twitter_profile_helper.js +274 -0
  28. package/dist/contribs/twitter_cli/src/libs/twitter_profile_helper.js.map +1 -0
  29. package/dist/contribs/twitter_cli/src/libs/twitter_recent_posts_helper.d.ts +43 -0
  30. package/dist/contribs/twitter_cli/src/libs/twitter_recent_posts_helper.d.ts.map +1 -0
  31. package/dist/contribs/twitter_cli/src/libs/twitter_recent_posts_helper.js +519 -0
  32. package/dist/contribs/twitter_cli/src/libs/twitter_recent_posts_helper.js.map +1 -0
  33. package/dist/contribs/twitter_cli/src/libs/twitter_thread_helper.d.ts +11 -0
  34. package/dist/contribs/twitter_cli/src/libs/twitter_thread_helper.d.ts.map +1 -0
  35. package/dist/contribs/twitter_cli/src/libs/twitter_thread_helper.js +213 -0
  36. package/dist/contribs/twitter_cli/src/libs/twitter_thread_helper.js.map +1 -0
  37. package/dist/fastbrowser_cli/fastbrowser_cli.js +43 -0
  38. package/dist/fastbrowser_cli/fastbrowser_cli.js.map +1 -1
  39. package/dist/fastbrowser_httpd/libs/tool-schemas.d.ts +4 -0
  40. package/dist/fastbrowser_httpd/libs/tool-schemas.d.ts.map +1 -1
  41. package/dist/fastbrowser_httpd/libs/tool-schemas.js +4 -0
  42. package/dist/fastbrowser_httpd/libs/tool-schemas.js.map +1 -1
  43. package/dist/fastbrowser_mcp/fastbrowser_mcp.js +36 -2
  44. package/dist/fastbrowser_mcp/fastbrowser_mcp.js.map +1 -1
  45. package/dist/fastbrowser_mcp/libs/mcp_target_helper.d.ts +2 -0
  46. package/dist/fastbrowser_mcp/libs/mcp_target_helper.d.ts.map +1 -1
  47. package/dist/fastbrowser_mcp/libs/mcp_target_helper.js +12 -0
  48. package/dist/fastbrowser_mcp/libs/mcp_target_helper.js.map +1 -1
  49. package/dist/fastbrowser_mcp/libs/response_formatter.d.ts +1 -0
  50. package/dist/fastbrowser_mcp/libs/response_formatter.d.ts.map +1 -1
  51. package/dist/fastbrowser_mcp/libs/response_formatter.js +27 -0
  52. package/dist/fastbrowser_mcp/libs/response_formatter.js.map +1 -1
  53. package/dist/shared/fastbrowser_helper.d.ts +13 -0
  54. package/dist/shared/fastbrowser_helper.d.ts.map +1 -0
  55. package/dist/shared/fastbrowser_helper.js +39 -0
  56. package/dist/shared/fastbrowser_helper.js.map +1 -0
  57. package/examples/linkedin_cli_TOREMOVE/README.md +7 -0
  58. package/examples/{linkedin_cli → linkedin_cli_TOREMOVE}/linkedin_dm.sh +8 -4
  59. package/examples/linkedin_cli_TOREMOVE/linkedin_dm.ts +326 -0
  60. package/examples/linkedin_cli_TOREMOVE/linkedin_dm_messages.ts +279 -0
  61. package/examples/linkedin_cli_TOREMOVE/linkedin_full_cycle.sh +5 -0
  62. package/examples/{linkedin_cli → linkedin_cli_TOREMOVE}/linkedin_post.sh +3 -0
  63. package/examples/linkedin_cli_TOREMOVE/message_thread.a11y.txt +252 -0
  64. package/listitem +4 -0
  65. package/package.json +7 -3
  66. package/skills/fastbrowser/SKILL.md +33 -25
  67. package/src/contribs/_shared/fastbrowser_helper.ts +49 -0
  68. package/src/contribs/linkedin_cli/README.md +80 -0
  69. package/src/contribs/linkedin_cli/data/linkedin_posts_jeromeetienne.a11y.txt +2364 -0
  70. package/src/contribs/linkedin_cli/data/linkedin_posts_jontwigge.a11y.txt +2740 -0
  71. package/src/contribs/linkedin_cli/data/linkedin_posts_julien_guezennec.a11y.txt +2073 -0
  72. package/src/contribs/linkedin_cli/data/linkedin_profile_jeromeetienne.a11y.txt +1863 -0
  73. package/src/contribs/linkedin_cli/data/linkedin_profile_jontwigge.a11y.txt +1738 -0
  74. package/src/contribs/linkedin_cli/data/linkedin_profile_julien_guezennec.a11y.txt +2182 -0
  75. package/src/contribs/linkedin_cli/src/cli.ts +345 -0
  76. package/src/contribs/linkedin_cli/src/libs/linkedin_profile_helper.ts +964 -0
  77. package/src/contribs/linkedin_cli/src/libs/linkedin_recent_posts_helper.ts +982 -0
  78. package/src/contribs/linkedin_cli/src/libs/linkedin_thread_helper.ts +171 -0
  79. package/src/contribs/twitter_cli/README.md +79 -0
  80. package/src/contribs/twitter_cli/data/twitter_chat.a11y.txt +215 -0
  81. package/src/contribs/twitter_cli/data/twitter_home.a11y.txt +467 -0
  82. package/src/contribs/twitter_cli/data/twitter_profile.a11y.txt +418 -0
  83. package/src/contribs/twitter_cli/data/twitter_profile_jontwigge.a11y.txt +484 -0
  84. package/src/contribs/twitter_cli/data/twitter_profile_molokoloco.a11y.txt +483 -0
  85. package/src/contribs/twitter_cli/src/cli.ts +315 -0
  86. package/src/contribs/twitter_cli/src/libs/twitter_profile_helper.ts +328 -0
  87. package/src/contribs/twitter_cli/src/libs/twitter_recent_posts_helper.ts +607 -0
  88. package/src/contribs/twitter_cli/src/libs/twitter_thread_helper.ts +240 -0
  89. package/src/fastbrowser_cli/fastbrowser_cli.ts +51 -0
  90. package/src/fastbrowser_httpd/libs/tool-schemas.ts +6 -0
  91. package/src/fastbrowser_mcp/fastbrowser_mcp.ts +46 -3
  92. package/src/fastbrowser_mcp/libs/mcp_target_helper.ts +11 -0
  93. package/src/fastbrowser_mcp/libs/response_formatter.ts +29 -0
  94. package/src/shared/fastbrowser_helper.ts +49 -0
  95. package/tsconfig.json +1 -1
  96. package/examples/mcp_client_playwright.ts +0 -34
  97. /package/examples/{linkedin_cli → linkedin_cli_TOREMOVE}/linkedin.snapshot.txt +0 -0
  98. /package/examples/{twitter_cli → twitter_cli_TOREMOVE}/twitter_post.sh +0 -0
@@ -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":"AASA,MAAM,MAAM,sBAAsB,GAAG;IACpC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG;IAChC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,KAAK,EAAE,sBAAsB,EAAE,CAAC;CAChC,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG;IAC/B,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CACrB,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,UAAU,EAAE,OAAO,CAAC;IACpB,UAAU,EAAE,kBAAkB,EAAE,CAAC;IACjC,SAAS,EAAE,iBAAiB,EAAE,CAAC;CAC/B,CAAC;AAmCF,qBAAa,qBAAqB;IAQjC,MAAM,CAAC,YAAY,CAAC,WAAW,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,eAAe;IAmDvE,MAAM,CAAC,cAAc,CAAC,OAAO,EAAE,eAAe,GAAG,MAAM;IA2DvD,MAAM,CAAC,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM;IAoB5C,OAAO,CAAC,MAAM,CAAC,iBAAiB;IAUhC,OAAO,CAAC,MAAM,CAAC,WAAW;IAW1B,OAAO,CAAC,MAAM,CAAC,QAAQ;IAIvB,OAAO,CAAC,MAAM,CAAC,sBAAsB;IAMrC,OAAO,CAAC,MAAM,CAAC,2BAA2B;IAe1C,OAAO,CAAC,MAAM,CAAC,kBAAkB;IAsBjC,OAAO,CAAC,MAAM,CAAC,mBAAmB;IAWlC,OAAO,CAAC,MAAM,CAAC,YAAY;IAwB3B,OAAO,CAAC,MAAM,CAAC,kBAAkB;IAWjC,OAAO,CAAC,MAAM,CAAC,eAAe;IAwB9B,OAAO,CAAC,MAAM,CAAC,eAAe;IA0B9B,OAAO,CAAC,MAAM,CAAC,uBAAuB;IAkBtC,OAAO,CAAC,MAAM,CAAC,qBAAqB;IAoBpC,OAAO,CAAC,MAAM,CAAC,YAAY;IAY3B,OAAO,CAAC,MAAM,CAAC,iBAAiB;IAehC,OAAO,CAAC,MAAM,CAAC,kBAAkB;IAqBjC,OAAO,CAAC,MAAM,CAAC,cAAc;IA+C7B,OAAO,CAAC,MAAM,CAAC,uBAAuB;IAyBtC,OAAO,CAAC,MAAM,CAAC,kBAAkB;IAYjC,OAAO,CAAC,MAAM,CAAC,eAAe;IA8B9B,OAAO,CAAC,MAAM,CAAC,kBAAkB;IAqBjC,OAAO,CAAC,MAAM,CAAC,iBAAiB;IAuBhC,OAAO,CAAC,MAAM,CAAC,oBAAoB;IASnC,OAAO,CAAC,MAAM,CAAC,eAAe;IAW9B,OAAO,CAAC,MAAM,CAAC,YAAY;IAgB3B,OAAO,CAAC,MAAM,CAAC,mBAAmB;IAsBlC,OAAO,CAAC,MAAM,CAAC,wBAAwB;IAmBvC,OAAO,CAAC,MAAM,CAAC,yBAAyB;IA0BxC,OAAO,CAAC,MAAM,CAAC,cAAc;IA8D7B,OAAO,CAAC,MAAM,CAAC,qBAAqB;IAapC,OAAO,CAAC,MAAM,CAAC,mBAAmB;IAgDlC,OAAO,CAAC,MAAM,CAAC,gBAAgB;IAuB/B,OAAO,CAAC,MAAM,CAAC,mBAAmB;IAsDlC,OAAO,CAAC,MAAM,CAAC,cAAc;IAsB7B,OAAO,CAAC,MAAM,CAAC,mBAAmB;CAclC"}