@lhremote/core 0.11.0 → 0.13.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.ts +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -4
- package/dist/index.js.map +1 -1
- package/dist/linkedin/dom-automation-mentions.test.d.ts +2 -0
- package/dist/linkedin/dom-automation-mentions.test.d.ts.map +1 -0
- package/dist/linkedin/dom-automation-mentions.test.js +165 -0
- package/dist/linkedin/dom-automation-mentions.test.js.map +1 -0
- package/dist/linkedin/dom-automation.d.ts +30 -0
- package/dist/linkedin/dom-automation.d.ts.map +1 -1
- package/dist/linkedin/dom-automation.js +147 -0
- package/dist/linkedin/dom-automation.js.map +1 -1
- package/dist/linkedin/index.d.ts +2 -2
- package/dist/linkedin/index.d.ts.map +1 -1
- package/dist/linkedin/index.js +2 -2
- package/dist/linkedin/index.js.map +1 -1
- package/dist/linkedin/selectors.d.ts +27 -0
- package/dist/linkedin/selectors.d.ts.map +1 -1
- package/dist/linkedin/selectors.js +29 -0
- package/dist/linkedin/selectors.js.map +1 -1
- package/dist/operations/comment-on-post.d.ts +24 -0
- package/dist/operations/comment-on-post.d.ts.map +1 -1
- package/dist/operations/comment-on-post.js +64 -13
- package/dist/operations/comment-on-post.js.map +1 -1
- package/dist/operations/comment-on-post.test.js +93 -1
- package/dist/operations/comment-on-post.test.js.map +1 -1
- package/dist/operations/dismiss-feed-post.d.ts +28 -0
- package/dist/operations/dismiss-feed-post.d.ts.map +1 -0
- package/dist/operations/dismiss-feed-post.js +115 -0
- package/dist/operations/dismiss-feed-post.js.map +1 -0
- package/dist/operations/dismiss-feed-post.test.d.ts +2 -0
- package/dist/operations/dismiss-feed-post.test.d.ts.map +1 -0
- package/dist/operations/dismiss-feed-post.test.js +137 -0
- package/dist/operations/dismiss-feed-post.test.js.map +1 -0
- package/dist/operations/get-post.d.ts.map +1 -1
- package/dist/operations/get-post.js +5 -1
- package/dist/operations/get-post.js.map +1 -1
- package/dist/operations/get-post.test.js +10 -9
- package/dist/operations/get-post.test.js.map +1 -1
- package/dist/operations/hide-feed-author.d.ts +32 -0
- package/dist/operations/hide-feed-author.d.ts.map +1 -0
- package/dist/operations/hide-feed-author.js +116 -0
- package/dist/operations/hide-feed-author.js.map +1 -0
- package/dist/operations/hide-feed-author.test.d.ts +2 -0
- package/dist/operations/hide-feed-author.test.d.ts.map +1 -0
- package/dist/operations/hide-feed-author.test.js +160 -0
- package/dist/operations/hide-feed-author.test.js.map +1 -0
- package/dist/operations/index.d.ts +3 -0
- package/dist/operations/index.d.ts.map +1 -1
- package/dist/operations/index.js +3 -0
- package/dist/operations/index.js.map +1 -1
- package/dist/operations/react-to-post.d.ts +9 -0
- package/dist/operations/react-to-post.d.ts.map +1 -1
- package/dist/operations/react-to-post.js +15 -4
- package/dist/operations/react-to-post.js.map +1 -1
- package/dist/operations/react-to-post.test.js +49 -0
- package/dist/operations/react-to-post.test.js.map +1 -1
- package/dist/operations/unfollow-from-feed.d.ts +30 -0
- package/dist/operations/unfollow-from-feed.d.ts.map +1 -0
- package/dist/operations/unfollow-from-feed.js +114 -0
- package/dist/operations/unfollow-from-feed.js.map +1 -0
- package/dist/operations/unfollow-from-feed.test.d.ts +2 -0
- package/dist/operations/unfollow-from-feed.test.d.ts.map +1 -0
- package/dist/operations/unfollow-from-feed.test.js +141 -0
- package/dist/operations/unfollow-from-feed.test.js.map +1 -0
- package/dist/testing/e2e-helpers.d.ts +9 -0
- package/dist/testing/e2e-helpers.d.ts.map +1 -1
- package/dist/testing/e2e-helpers.js +14 -0
- package/dist/testing/e2e-helpers.js.map +1 -1
- package/dist/testing/index.d.ts +1 -1
- package/dist/testing/index.d.ts.map +1 -1
- package/dist/testing/index.js +1 -1
- package/dist/testing/index.js.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/linkedin/index.ts"],"names":[],"mappings":"AAAA,yCAAyC;AACzC,oCAAoC;AAEpC,OAAO,EACL,KAAK,EACL,gBAAgB,EAChB,KAAK,EACL,cAAc,EACd,cAAc,EACd,gBAAgB,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/linkedin/index.ts"],"names":[],"mappings":"AAAA,yCAAyC;AACzC,oCAAoC;AAEpC,OAAO,EACL,KAAK,EACL,gBAAgB,EAChB,KAAK,EACL,cAAc,EACd,cAAc,EACd,gBAAgB,EAEhB,QAAQ,EACR,QAAQ,EACR,oBAAoB,EAEpB,gBAAgB,EAChB,cAAc,GAEf,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAEtD,OAAO,EACL,aAAa,EACb,qBAAqB,EACrB,mBAAmB,EACnB,cAAc,EACd,iBAAiB,EACjB,kBAAkB,EAClB,cAAc,EACd,mBAAmB,EACnB,aAAa,EACb,aAAa,EACb,gBAAgB,EAChB,gBAAgB,EAChB,SAAS,GAEV,MAAM,gBAAgB,CAAC"}
|
|
@@ -62,6 +62,30 @@ export declare const REACTION_LOVE = "button[aria-label=\"Love\"], button[aria-l
|
|
|
62
62
|
export declare const REACTION_INSIGHTFUL = "button[aria-label=\"Insightful\"], button[aria-label=\"React Insightful\"]";
|
|
63
63
|
/** Funny reaction button (appears after hovering trigger). */
|
|
64
64
|
export declare const REACTION_FUNNY = "button[aria-label=\"Funny\"], button[aria-label=\"React Funny\"]";
|
|
65
|
+
/**
|
|
66
|
+
* Reply button inside a comment `article`.
|
|
67
|
+
*
|
|
68
|
+
* Each comment on the post detail page has a Reply button whose
|
|
69
|
+
* `aria-label` follows the pattern "Reply to {name}'s comment".
|
|
70
|
+
* The button uses the BEM class
|
|
71
|
+
* `comments-comment-social-bar__reply-action-button--cr`.
|
|
72
|
+
*/
|
|
73
|
+
export declare const COMMENT_REPLY_BUTTON = "button[aria-label^=\"Reply to \"]";
|
|
74
|
+
/**
|
|
75
|
+
* Mention typeahead popup (appears after typing `@` in the comment editor).
|
|
76
|
+
*
|
|
77
|
+
* LinkedIn's Quill editor triggers a typeahead dropdown whose listbox
|
|
78
|
+
* is rendered inside a `.editor-typeahead-fetch` wrapper. The listbox
|
|
79
|
+
* itself uses `role="listbox"` with class `basic-typeahead__triggered-content`.
|
|
80
|
+
*/
|
|
81
|
+
export declare const MENTION_TYPEAHEAD = ".editor-typeahead-fetch .basic-typeahead__triggered-content[role=\"listbox\"]";
|
|
82
|
+
/**
|
|
83
|
+
* Individual mention option inside the typeahead popup.
|
|
84
|
+
*
|
|
85
|
+
* Each option has `role="option"` and toggles `aria-selected` on
|
|
86
|
+
* keyboard navigation (ArrowDown / ArrowUp).
|
|
87
|
+
*/
|
|
88
|
+
export declare const MENTION_OPTION = ".basic-typeahead__selectable.editor-typeahead__typeahead-item[role=\"option\"]";
|
|
65
89
|
/**
|
|
66
90
|
* Submit button for the comment form.
|
|
67
91
|
*
|
|
@@ -79,6 +103,9 @@ export declare const COMMENT_SUBMIT_BUTTON = "button[type=\"submit\"], button[cl
|
|
|
79
103
|
export declare const SELECTORS: {
|
|
80
104
|
readonly FEED_POST_CONTAINER: "[data-testid=\"mainFeed\"] [role=\"listitem\"]";
|
|
81
105
|
readonly COMMENT_INPUT: "[role=\"textbox\"][aria-label^=\"Text editor for creating\"]";
|
|
106
|
+
readonly COMMENT_REPLY_BUTTON: "button[aria-label^=\"Reply to \"]";
|
|
107
|
+
readonly MENTION_TYPEAHEAD: ".editor-typeahead-fetch .basic-typeahead__triggered-content[role=\"listbox\"]";
|
|
108
|
+
readonly MENTION_OPTION: ".basic-typeahead__selectable.editor-typeahead__typeahead-item[role=\"option\"]";
|
|
82
109
|
readonly REACTION_TRIGGER: "button[aria-label^=\"Reaction button state\"], button.react-button__trigger";
|
|
83
110
|
readonly REACTION_LIKE: "button[aria-label=\"Like\"], button[aria-label=\"React Like\"]";
|
|
84
111
|
readonly REACTION_CELEBRATE: "button[aria-label=\"Celebrate\"], button[aria-label=\"React Celebrate\"]";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"selectors.d.ts","sourceRoot":"","sources":["../../src/linkedin/selectors.ts"],"names":[],"mappings":"AAGA;;;;;;;;;;;;;;;;;;GAkBG;AAIH,oEAAoE;AACpE,eAAO,MAAM,mBAAmB,mDAA+C,CAAC;AAIhF;;;;;;;;;;GAUG;AACH,eAAO,MAAM,aAAa,iEACkC,CAAC;AAI7D;;;;;;GAMG;AACH,eAAO,MAAM,gBAAgB,gFACgD,CAAC;AAE9E;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,aAAa,mEACoC,CAAC;AAE/D,kEAAkE;AAClE,eAAO,MAAM,kBAAkB,6EACyC,CAAC;AAEzE,gEAAgE;AAChE,eAAO,MAAM,gBAAgB,yEACuC,CAAC;AAErE,6DAA6D;AAC7D,eAAO,MAAM,aAAa,mEACoC,CAAC;AAE/D,mEAAmE;AACnE,eAAO,MAAM,mBAAmB,+EAC0C,CAAC;AAE3E,8DAA8D;AAC9D,eAAO,MAAM,cAAc,qEACqC,CAAC;AAIjE;;;;;;GAMG;AACH,eAAO,MAAM,qBAAqB,oFAC6C,CAAC;AAEhF;;;;;GAKG;AACH,eAAO,MAAM,SAAS
|
|
1
|
+
{"version":3,"file":"selectors.d.ts","sourceRoot":"","sources":["../../src/linkedin/selectors.ts"],"names":[],"mappings":"AAGA;;;;;;;;;;;;;;;;;;GAkBG;AAIH,oEAAoE;AACpE,eAAO,MAAM,mBAAmB,mDAA+C,CAAC;AAIhF;;;;;;;;;;GAUG;AACH,eAAO,MAAM,aAAa,iEACkC,CAAC;AAI7D;;;;;;GAMG;AACH,eAAO,MAAM,gBAAgB,gFACgD,CAAC;AAE9E;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,aAAa,mEACoC,CAAC;AAE/D,kEAAkE;AAClE,eAAO,MAAM,kBAAkB,6EACyC,CAAC;AAEzE,gEAAgE;AAChE,eAAO,MAAM,gBAAgB,yEACuC,CAAC;AAErE,6DAA6D;AAC7D,eAAO,MAAM,aAAa,mEACoC,CAAC;AAE/D,mEAAmE;AACnE,eAAO,MAAM,mBAAmB,+EAC0C,CAAC;AAE3E,8DAA8D;AAC9D,eAAO,MAAM,cAAc,qEACqC,CAAC;AAIjE;;;;;;;GAOG;AACH,eAAO,MAAM,oBAAoB,sCAAoC,CAAC;AAItE;;;;;;GAMG;AACH,eAAO,MAAM,iBAAiB,kFACiD,CAAC;AAEhF;;;;;GAKG;AACH,eAAO,MAAM,cAAc,mFACqD,CAAC;AAIjF;;;;;;GAMG;AACH,eAAO,MAAM,qBAAqB,oFAC6C,CAAC;AAEhF;;;;;GAKG;AACH,eAAO,MAAM,SAAS;;;;;;;;;;;;;;CAcZ,CAAC;AAEX,mDAAmD;AACnD,MAAM,MAAM,YAAY,GAAG,MAAM,OAAO,SAAS,CAAC"}
|
|
@@ -67,6 +67,32 @@ export const REACTION_LOVE = 'button[aria-label="Love"], button[aria-label="Reac
|
|
|
67
67
|
export const REACTION_INSIGHTFUL = 'button[aria-label="Insightful"], button[aria-label="React Insightful"]';
|
|
68
68
|
/** Funny reaction button (appears after hovering trigger). */
|
|
69
69
|
export const REACTION_FUNNY = 'button[aria-label="Funny"], button[aria-label="React Funny"]';
|
|
70
|
+
// ── Comment reply ────────────────────────────────────────────────
|
|
71
|
+
/**
|
|
72
|
+
* Reply button inside a comment `article`.
|
|
73
|
+
*
|
|
74
|
+
* Each comment on the post detail page has a Reply button whose
|
|
75
|
+
* `aria-label` follows the pattern "Reply to {name}'s comment".
|
|
76
|
+
* The button uses the BEM class
|
|
77
|
+
* `comments-comment-social-bar__reply-action-button--cr`.
|
|
78
|
+
*/
|
|
79
|
+
export const COMMENT_REPLY_BUTTON = 'button[aria-label^="Reply to "]';
|
|
80
|
+
// ── Mention autocomplete ─────────────────────────────────────────
|
|
81
|
+
/**
|
|
82
|
+
* Mention typeahead popup (appears after typing `@` in the comment editor).
|
|
83
|
+
*
|
|
84
|
+
* LinkedIn's Quill editor triggers a typeahead dropdown whose listbox
|
|
85
|
+
* is rendered inside a `.editor-typeahead-fetch` wrapper. The listbox
|
|
86
|
+
* itself uses `role="listbox"` with class `basic-typeahead__triggered-content`.
|
|
87
|
+
*/
|
|
88
|
+
export const MENTION_TYPEAHEAD = '.editor-typeahead-fetch .basic-typeahead__triggered-content[role="listbox"]';
|
|
89
|
+
/**
|
|
90
|
+
* Individual mention option inside the typeahead popup.
|
|
91
|
+
*
|
|
92
|
+
* Each option has `role="option"` and toggles `aria-selected` on
|
|
93
|
+
* keyboard navigation (ArrowDown / ArrowUp).
|
|
94
|
+
*/
|
|
95
|
+
export const MENTION_OPTION = '.basic-typeahead__selectable.editor-typeahead__typeahead-item[role="option"]';
|
|
70
96
|
// ── Send / submit buttons ─────────────────────────────────────────
|
|
71
97
|
/**
|
|
72
98
|
* Submit button for the comment form.
|
|
@@ -85,6 +111,9 @@ export const COMMENT_SUBMIT_BUTTON = 'button[type="submit"], button[class*="comm
|
|
|
85
111
|
export const SELECTORS = {
|
|
86
112
|
FEED_POST_CONTAINER,
|
|
87
113
|
COMMENT_INPUT,
|
|
114
|
+
COMMENT_REPLY_BUTTON,
|
|
115
|
+
MENTION_TYPEAHEAD,
|
|
116
|
+
MENTION_OPTION,
|
|
88
117
|
REACTION_TRIGGER,
|
|
89
118
|
REACTION_LIKE,
|
|
90
119
|
REACTION_CELEBRATE,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"selectors.js","sourceRoot":"","sources":["../../src/linkedin/selectors.ts"],"names":[],"mappings":"AAAA,yCAAyC;AACzC,oCAAoC;AAEpC;;;;;;;;;;;;;;;;;;GAkBG;AAEH,qEAAqE;AAErE,oEAAoE;AACpE,MAAM,CAAC,MAAM,mBAAmB,GAAG,4CAA4C,CAAC;AAEhF,qEAAqE;AAErE;;;;;;;;;;GAUG;AACH,MAAM,CAAC,MAAM,aAAa,GACxB,0DAA0D,CAAC;AAE7D,qEAAqE;AAErE;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAC3B,2EAA2E,CAAC;AAE9E;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,MAAM,aAAa,GACxB,4DAA4D,CAAC;AAE/D,kEAAkE;AAClE,MAAM,CAAC,MAAM,kBAAkB,GAC7B,sEAAsE,CAAC;AAEzE,gEAAgE;AAChE,MAAM,CAAC,MAAM,gBAAgB,GAC3B,kEAAkE,CAAC;AAErE,6DAA6D;AAC7D,MAAM,CAAC,MAAM,aAAa,GACxB,4DAA4D,CAAC;AAE/D,mEAAmE;AACnE,MAAM,CAAC,MAAM,mBAAmB,GAC9B,wEAAwE,CAAC;AAE3E,8DAA8D;AAC9D,MAAM,CAAC,MAAM,cAAc,GACzB,8DAA8D,CAAC;AAEjE,qEAAqE;AAErE;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAChC,6EAA6E,CAAC;AAEhF;;;;;GAKG;AACH,MAAM,CAAC,MAAM,SAAS,GAAG;IACvB,mBAAmB;IACnB,aAAa;IACb,gBAAgB;IAChB,aAAa;IACb,kBAAkB;IAClB,gBAAgB;IAChB,aAAa;IACb,mBAAmB;IACnB,cAAc;IACd,qBAAqB;CACb,CAAC"}
|
|
1
|
+
{"version":3,"file":"selectors.js","sourceRoot":"","sources":["../../src/linkedin/selectors.ts"],"names":[],"mappings":"AAAA,yCAAyC;AACzC,oCAAoC;AAEpC;;;;;;;;;;;;;;;;;;GAkBG;AAEH,qEAAqE;AAErE,oEAAoE;AACpE,MAAM,CAAC,MAAM,mBAAmB,GAAG,4CAA4C,CAAC;AAEhF,qEAAqE;AAErE;;;;;;;;;;GAUG;AACH,MAAM,CAAC,MAAM,aAAa,GACxB,0DAA0D,CAAC;AAE7D,qEAAqE;AAErE;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAC3B,2EAA2E,CAAC;AAE9E;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,MAAM,aAAa,GACxB,4DAA4D,CAAC;AAE/D,kEAAkE;AAClE,MAAM,CAAC,MAAM,kBAAkB,GAC7B,sEAAsE,CAAC;AAEzE,gEAAgE;AAChE,MAAM,CAAC,MAAM,gBAAgB,GAC3B,kEAAkE,CAAC;AAErE,6DAA6D;AAC7D,MAAM,CAAC,MAAM,aAAa,GACxB,4DAA4D,CAAC;AAE/D,mEAAmE;AACnE,MAAM,CAAC,MAAM,mBAAmB,GAC9B,wEAAwE,CAAC;AAE3E,8DAA8D;AAC9D,MAAM,CAAC,MAAM,cAAc,GACzB,8DAA8D,CAAC;AAEjE,oEAAoE;AAEpE;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAG,iCAAiC,CAAC;AAEtE,oEAAoE;AAEpE;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAC5B,6EAA6E,CAAC;AAEhF;;;;;GAKG;AACH,MAAM,CAAC,MAAM,cAAc,GACzB,8EAA8E,CAAC;AAEjF,qEAAqE;AAErE;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAChC,6EAA6E,CAAC;AAEhF;;;;;GAKG;AACH,MAAM,CAAC,MAAM,SAAS,GAAG;IACvB,mBAAmB;IACnB,aAAa;IACb,oBAAoB;IACpB,iBAAiB;IACjB,cAAc;IACd,gBAAgB;IAChB,aAAa;IACb,kBAAkB;IAClB,gBAAgB;IAChB,aAAa;IACb,mBAAmB;IACnB,cAAc;IACd,qBAAqB;CACb,CAAC"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { MentionEntry } from "../linkedin/dom-automation.js";
|
|
1
2
|
import type { HumanizedMouse } from "../linkedin/humanized-mouse.js";
|
|
2
3
|
import { type ConnectionOptions } from "./types.js";
|
|
3
4
|
/**
|
|
@@ -8,8 +9,24 @@ export interface CommentOnPostInput extends ConnectionOptions {
|
|
|
8
9
|
readonly postUrl: string;
|
|
9
10
|
/** Comment text to post. */
|
|
10
11
|
readonly text: string;
|
|
12
|
+
/**
|
|
13
|
+
* When provided, the comment is posted as a reply to the specified
|
|
14
|
+
* comment instead of as a top-level comment. The URN comes from
|
|
15
|
+
* the `commentUrn` field in `get-post` output (e.g.
|
|
16
|
+
* `urn:li:comment:(activity:1234567890,9876543210)`).
|
|
17
|
+
*/
|
|
18
|
+
readonly parentCommentUrn?: string | undefined;
|
|
19
|
+
/**
|
|
20
|
+
* People to @mention in the comment. Each entry's `name` must
|
|
21
|
+
* appear as a literal `@Name` token in {@link text}. During typing,
|
|
22
|
+
* each `@Name` triggers LinkedIn's mention autocomplete and selects
|
|
23
|
+
* the matching profile.
|
|
24
|
+
*/
|
|
25
|
+
readonly mentions?: readonly MentionEntry[] | undefined;
|
|
11
26
|
/** Optional humanized mouse for natural cursor movement and clicks. */
|
|
12
27
|
readonly mouse?: HumanizedMouse | null | undefined;
|
|
28
|
+
/** When true, validate the comment flow but skip typing and clicking submit. */
|
|
29
|
+
readonly dryRun?: boolean | undefined;
|
|
13
30
|
}
|
|
14
31
|
/**
|
|
15
32
|
* Output from the comment-on-post operation.
|
|
@@ -18,6 +35,9 @@ export interface CommentOnPostOutput {
|
|
|
18
35
|
readonly success: true;
|
|
19
36
|
readonly postUrl: string;
|
|
20
37
|
readonly commentText: string;
|
|
38
|
+
/** The parent comment URN when this was posted as a reply, or `null` for top-level comments. */
|
|
39
|
+
readonly parentCommentUrn: string | null;
|
|
40
|
+
readonly dryRun: boolean;
|
|
21
41
|
}
|
|
22
42
|
/**
|
|
23
43
|
* Post a comment on a LinkedIn post.
|
|
@@ -26,6 +46,10 @@ export interface CommentOnPostOutput {
|
|
|
26
46
|
* input via selectors, types the comment text character-by-character
|
|
27
47
|
* for human-like behaviour, and clicks submit.
|
|
28
48
|
*
|
|
49
|
+
* When {@link CommentOnPostInput.dryRun | dryRun} is `true`, the
|
|
50
|
+
* operation validates that the comment input and submit button are
|
|
51
|
+
* present but skips typing and clicking submit.
|
|
52
|
+
*
|
|
29
53
|
* Checks the action budget before attempting the comment and fails
|
|
30
54
|
* with a {@link BudgetExceededError} if the PostComment limit has
|
|
31
55
|
* been reached.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"comment-on-post.d.ts","sourceRoot":"","sources":["../../src/operations/comment-on-post.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AAMrE,OAAO,EAAmB,KAAK,iBAAiB,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"comment-on-post.d.ts","sourceRoot":"","sources":["../../src/operations/comment-on-post.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAClE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AAMrE,OAAO,EAAmB,KAAK,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAYrE;;GAEG;AACH,MAAM,WAAW,kBAAmB,SAAQ,iBAAiB;IAC3D,mGAAmG;IACnG,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,4BAA4B;IAC5B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB;;;;;OAKG;IACH,QAAQ,CAAC,gBAAgB,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC/C;;;;;OAKG;IACH,QAAQ,CAAC,QAAQ,CAAC,EAAE,SAAS,YAAY,EAAE,GAAG,SAAS,CAAC;IACxD,uEAAuE;IACvE,QAAQ,CAAC,KAAK,CAAC,EAAE,cAAc,GAAG,IAAI,GAAG,SAAS,CAAC;IACnD,gFAAgF;IAChF,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;CACvC;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,OAAO,EAAE,IAAI,CAAC;IACvB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,gGAAgG;IAChG,QAAQ,CAAC,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IACzC,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;CAC1B;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAsB,aAAa,CACjC,KAAK,EAAE,kBAAkB,GACxB,OAAO,CAAC,mBAAmB,CAAC,CAmJ9B"}
|
|
@@ -4,8 +4,8 @@ import { resolveInstancePort } from "../cdp/index.js";
|
|
|
4
4
|
import { CDPClient } from "../cdp/client.js";
|
|
5
5
|
import { discoverTargets } from "../cdp/discovery.js";
|
|
6
6
|
import { ActionBudgetRepository } from "../db/index.js";
|
|
7
|
-
import { waitForElement, humanizedScrollTo, humanizedClick, typeText } from "../linkedin/dom-automation.js";
|
|
8
|
-
import { COMMENT_INPUT, COMMENT_SUBMIT_BUTTON } from "../linkedin/selectors.js";
|
|
7
|
+
import { waitForElement, humanizedScrollTo, humanizedClick, typeText, typeTextWithMentions } from "../linkedin/dom-automation.js";
|
|
8
|
+
import { COMMENT_INPUT, COMMENT_REPLY_BUTTON, COMMENT_SUBMIT_BUTTON } from "../linkedin/selectors.js";
|
|
9
9
|
import { resolveAccount } from "../services/account-resolution.js";
|
|
10
10
|
import { BudgetExceededError } from "../services/errors.js";
|
|
11
11
|
import { withDatabase } from "../services/instance-context.js";
|
|
@@ -13,6 +13,8 @@ import { gaussianDelay } from "../utils/delay.js";
|
|
|
13
13
|
import { buildCdpOptions } from "./types.js";
|
|
14
14
|
/** Pattern matching supported LinkedIn post URL formats. */
|
|
15
15
|
const LINKEDIN_POST_URL_RE = /linkedin\.com\/(?:feed\/update\/urn:li:\w+:\d+|posts\/[^/]+)/;
|
|
16
|
+
/** Pattern matching a LinkedIn comment URN (e.g. `urn:li:comment:(activity:123,456)`). */
|
|
17
|
+
const COMMENT_URN_RE = /^urn:li:comment:\(\w+:\d+,\d+\)$/;
|
|
16
18
|
/** Limit type ID for PostComment in the LinkedHelper budget system. */
|
|
17
19
|
const POST_COMMENT_LIMIT_TYPE_ID = 19;
|
|
18
20
|
/**
|
|
@@ -22,6 +24,10 @@ const POST_COMMENT_LIMIT_TYPE_ID = 19;
|
|
|
22
24
|
* input via selectors, types the comment text character-by-character
|
|
23
25
|
* for human-like behaviour, and clicks submit.
|
|
24
26
|
*
|
|
27
|
+
* When {@link CommentOnPostInput.dryRun | dryRun} is `true`, the
|
|
28
|
+
* operation validates that the comment input and submit button are
|
|
29
|
+
* present but skips typing and clicking submit.
|
|
30
|
+
*
|
|
25
31
|
* Checks the action budget before attempting the comment and fails
|
|
26
32
|
* with a {@link BudgetExceededError} if the PostComment limit has
|
|
27
33
|
* been reached.
|
|
@@ -42,6 +48,11 @@ export async function commentOnPost(input) {
|
|
|
42
48
|
"Expected a URL like https://www.linkedin.com/feed/update/urn:li:activity:... " +
|
|
43
49
|
"or https://www.linkedin.com/posts/...");
|
|
44
50
|
}
|
|
51
|
+
// Validate comment URN format when provided
|
|
52
|
+
if (input.parentCommentUrn !== undefined && !COMMENT_URN_RE.test(input.parentCommentUrn)) {
|
|
53
|
+
throw new Error(`Invalid comment URN: ${input.parentCommentUrn}. ` +
|
|
54
|
+
"Expected format: urn:li:comment:(activity:1234567890,9876543210)");
|
|
55
|
+
}
|
|
45
56
|
// Enforce loopback guard
|
|
46
57
|
if (!allowRemote && cdpHost !== "127.0.0.1" && cdpHost !== "localhost") {
|
|
47
58
|
throw new Error(`Non-loopback CDP host "${cdpHost}" requires --allow-remote. ` +
|
|
@@ -78,23 +89,63 @@ export async function commentOnPost(input) {
|
|
|
78
89
|
await client.send("Page.disable").catch(() => { });
|
|
79
90
|
}
|
|
80
91
|
const mouse = input.mouse;
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
92
|
+
const parentUrn = input.parentCommentUrn;
|
|
93
|
+
const mentions = input.mentions ?? [];
|
|
94
|
+
const dryRun = input.dryRun ?? false;
|
|
95
|
+
if (parentUrn) {
|
|
96
|
+
// --- Reply to a specific comment ---
|
|
97
|
+
// Find the target comment article by its data-id attribute
|
|
98
|
+
const commentSelector = `article[data-id="${parentUrn}"]`;
|
|
99
|
+
await waitForElement(client, commentSelector, undefined, mouse);
|
|
100
|
+
await humanizedScrollTo(client, commentSelector, mouse);
|
|
101
|
+
// Click the Reply button within that comment
|
|
102
|
+
const replySelector = `${commentSelector} ${COMMENT_REPLY_BUTTON}`;
|
|
103
|
+
await waitForElement(client, replySelector, undefined, mouse);
|
|
104
|
+
await humanizedClick(client, replySelector, mouse);
|
|
105
|
+
await gaussianDelay(550, 75, 400, 700);
|
|
106
|
+
// After clicking Reply, LinkedIn focuses the reply editor.
|
|
107
|
+
// Wait for a focused COMMENT_INPUT to avoid matching the
|
|
108
|
+
// pre-existing top-level comment input.
|
|
109
|
+
await waitForElement(client, `${COMMENT_INPUT}:focus`, undefined, mouse);
|
|
110
|
+
await gaussianDelay(350, 50, 250, 500);
|
|
111
|
+
if (!dryRun) {
|
|
112
|
+
if (mentions.length > 0) {
|
|
113
|
+
await typeTextWithMentions(client, `${COMMENT_INPUT}:focus`, input.text, mentions);
|
|
114
|
+
}
|
|
115
|
+
else {
|
|
116
|
+
await typeText(client, `${COMMENT_INPUT}:focus`, input.text);
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
else {
|
|
121
|
+
// --- Top-level comment ---
|
|
122
|
+
await waitForElement(client, COMMENT_INPUT, undefined, mouse);
|
|
123
|
+
await humanizedScrollTo(client, COMMENT_INPUT, mouse);
|
|
124
|
+
await humanizedClick(client, COMMENT_INPUT, mouse);
|
|
125
|
+
await gaussianDelay(550, 75, 400, 700);
|
|
126
|
+
if (!dryRun) {
|
|
127
|
+
if (mentions.length > 0) {
|
|
128
|
+
await typeTextWithMentions(client, COMMENT_INPUT, input.text, mentions);
|
|
129
|
+
}
|
|
130
|
+
else {
|
|
131
|
+
await typeText(client, COMMENT_INPUT, input.text);
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
// Wait for submit button to validate the submit flow would work
|
|
89
136
|
await waitForElement(client, COMMENT_SUBMIT_BUTTON, undefined, mouse);
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
137
|
+
if (!dryRun) {
|
|
138
|
+
await humanizedClick(client, COMMENT_SUBMIT_BUTTON, mouse);
|
|
139
|
+
// Brief wait for the comment to post
|
|
140
|
+
await gaussianDelay(2_000, 250, 1_500, 2_500);
|
|
141
|
+
}
|
|
93
142
|
await gaussianDelay(1_500, 500, 700, 3_500); // Post-action dwell
|
|
94
143
|
return {
|
|
95
144
|
success: true,
|
|
96
145
|
postUrl: input.postUrl,
|
|
97
146
|
commentText: input.text,
|
|
147
|
+
parentCommentUrn: parentUrn ?? null,
|
|
148
|
+
dryRun,
|
|
98
149
|
};
|
|
99
150
|
}
|
|
100
151
|
finally {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"comment-on-post.js","sourceRoot":"","sources":["../../src/operations/comment-on-post.ts"],"names":[],"mappings":"AAAA,yCAAyC;AACzC,oCAAoC;AAEpC,OAAO,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AACtD,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAC;AACxD,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,+BAA+B,CAAC;
|
|
1
|
+
{"version":3,"file":"comment-on-post.js","sourceRoot":"","sources":["../../src/operations/comment-on-post.ts"],"names":[],"mappings":"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"}
|
|
@@ -22,6 +22,7 @@ vi.mock("../linkedin/dom-automation.js", () => ({
|
|
|
22
22
|
click: vi.fn(),
|
|
23
23
|
humanizedClick: vi.fn(),
|
|
24
24
|
typeText: vi.fn(),
|
|
25
|
+
typeTextWithMentions: vi.fn(),
|
|
25
26
|
}));
|
|
26
27
|
vi.mock("../utils/delay.js", () => ({
|
|
27
28
|
delay: vi.fn().mockResolvedValue(undefined),
|
|
@@ -32,7 +33,7 @@ import { withDatabase } from "../services/instance-context.js";
|
|
|
32
33
|
import { ActionBudgetRepository } from "../db/index.js";
|
|
33
34
|
import { discoverTargets } from "../cdp/discovery.js";
|
|
34
35
|
import { CDPClient } from "../cdp/client.js";
|
|
35
|
-
import { waitForElement, humanizedScrollTo, humanizedClick, typeText } from "../linkedin/dom-automation.js";
|
|
36
|
+
import { waitForElement, humanizedScrollTo, humanizedClick, typeText, typeTextWithMentions } from "../linkedin/dom-automation.js";
|
|
36
37
|
import { BudgetExceededError } from "../services/errors.js";
|
|
37
38
|
import { commentOnPost } from "./comment-on-post.js";
|
|
38
39
|
const MOCK_CDP_PORT = 9222;
|
|
@@ -77,6 +78,7 @@ function setupMocks(budgetEntries = [
|
|
|
77
78
|
vi.mocked(humanizedScrollTo).mockResolvedValue(undefined);
|
|
78
79
|
vi.mocked(humanizedClick).mockResolvedValue(undefined);
|
|
79
80
|
vi.mocked(typeText).mockResolvedValue(undefined);
|
|
81
|
+
vi.mocked(typeTextWithMentions).mockResolvedValue(undefined);
|
|
80
82
|
return mockClient;
|
|
81
83
|
}
|
|
82
84
|
describe("commentOnPost", () => {
|
|
@@ -157,6 +159,7 @@ describe("commentOnPost", () => {
|
|
|
157
159
|
expect(result.success).toBe(true);
|
|
158
160
|
expect(result.postUrl).toBe(MOCK_POST_URL);
|
|
159
161
|
expect(result.commentText).toBe("Great post!");
|
|
162
|
+
expect(result.parentCommentUrn).toBeNull();
|
|
160
163
|
});
|
|
161
164
|
it("proceeds when PostComment has no daily limit (unlimited)", async () => {
|
|
162
165
|
setupMocks([
|
|
@@ -238,5 +241,94 @@ describe("commentOnPost", () => {
|
|
|
238
241
|
allowRemote: true,
|
|
239
242
|
});
|
|
240
243
|
});
|
|
244
|
+
it("clicks Reply button when parentCommentUrn is provided", async () => {
|
|
245
|
+
setupMocks();
|
|
246
|
+
const parentUrn = "urn:li:comment:(activity:123,999)";
|
|
247
|
+
const result = await commentOnPost({
|
|
248
|
+
postUrl: MOCK_POST_URL,
|
|
249
|
+
text: "Reply text",
|
|
250
|
+
parentCommentUrn: parentUrn,
|
|
251
|
+
cdpPort: MOCK_CDP_PORT,
|
|
252
|
+
});
|
|
253
|
+
expect(result.success).toBe(true);
|
|
254
|
+
expect(result.parentCommentUrn).toBe(parentUrn);
|
|
255
|
+
// Reply flow: waitForElement called for comment article, reply button, focused input, submit button
|
|
256
|
+
expect(waitForElement).toHaveBeenCalledTimes(4);
|
|
257
|
+
// First call: wait for the target comment article
|
|
258
|
+
const firstSelector = vi.mocked(waitForElement).mock.calls[0]?.[1];
|
|
259
|
+
expect(firstSelector).toContain(`article[data-id="${parentUrn}"]`);
|
|
260
|
+
// Second call: wait for reply button within the article
|
|
261
|
+
const secondSelector = vi.mocked(waitForElement).mock.calls[1]?.[1];
|
|
262
|
+
expect(secondSelector).toContain('button[aria-label^="Reply to "]');
|
|
263
|
+
// Third call: wait for focused comment input (not the global one)
|
|
264
|
+
const thirdSelector = vi.mocked(waitForElement).mock.calls[2]?.[1];
|
|
265
|
+
expect(thirdSelector).toContain(":focus");
|
|
266
|
+
// scrollTo called for the comment article (not the top-level input)
|
|
267
|
+
expect(humanizedScrollTo).toHaveBeenCalledTimes(1);
|
|
268
|
+
const scrollSelector = vi.mocked(humanizedScrollTo).mock.calls[0]?.[1];
|
|
269
|
+
expect(scrollSelector).toContain(`article[data-id="${parentUrn}"]`);
|
|
270
|
+
});
|
|
271
|
+
it("rejects invalid parentCommentUrn format", async () => {
|
|
272
|
+
await expect(commentOnPost({
|
|
273
|
+
postUrl: MOCK_POST_URL,
|
|
274
|
+
text: "hello",
|
|
275
|
+
parentCommentUrn: "not-a-valid-urn",
|
|
276
|
+
cdpPort: MOCK_CDP_PORT,
|
|
277
|
+
})).rejects.toThrow("Invalid comment URN");
|
|
278
|
+
});
|
|
279
|
+
it("returns parentCommentUrn as null for top-level comments", async () => {
|
|
280
|
+
setupMocks();
|
|
281
|
+
const result = await commentOnPost({
|
|
282
|
+
postUrl: MOCK_POST_URL,
|
|
283
|
+
text: "Top level",
|
|
284
|
+
cdpPort: MOCK_CDP_PORT,
|
|
285
|
+
});
|
|
286
|
+
expect(result.parentCommentUrn).toBeNull();
|
|
287
|
+
});
|
|
288
|
+
it("uses typeTextWithMentions when mentions are provided", async () => {
|
|
289
|
+
setupMocks();
|
|
290
|
+
await commentOnPost({
|
|
291
|
+
postUrl: MOCK_POST_URL,
|
|
292
|
+
text: "Hello @John Doe!",
|
|
293
|
+
mentions: [{ name: "John Doe" }],
|
|
294
|
+
cdpPort: MOCK_CDP_PORT,
|
|
295
|
+
});
|
|
296
|
+
expect(typeTextWithMentions).toHaveBeenCalledWith(expect.anything(), expect.any(String), "Hello @John Doe!", [{ name: "John Doe" }]);
|
|
297
|
+
expect(typeText).not.toHaveBeenCalled();
|
|
298
|
+
});
|
|
299
|
+
it("uses typeText when mentions array is empty", async () => {
|
|
300
|
+
setupMocks();
|
|
301
|
+
await commentOnPost({
|
|
302
|
+
postUrl: MOCK_POST_URL,
|
|
303
|
+
text: "No mentions here",
|
|
304
|
+
mentions: [],
|
|
305
|
+
cdpPort: MOCK_CDP_PORT,
|
|
306
|
+
});
|
|
307
|
+
expect(typeText).toHaveBeenCalled();
|
|
308
|
+
expect(typeTextWithMentions).not.toHaveBeenCalled();
|
|
309
|
+
});
|
|
310
|
+
it("uses typeText when mentions is undefined", async () => {
|
|
311
|
+
setupMocks();
|
|
312
|
+
await commentOnPost({
|
|
313
|
+
postUrl: MOCK_POST_URL,
|
|
314
|
+
text: "No mentions here",
|
|
315
|
+
cdpPort: MOCK_CDP_PORT,
|
|
316
|
+
});
|
|
317
|
+
expect(typeText).toHaveBeenCalled();
|
|
318
|
+
expect(typeTextWithMentions).not.toHaveBeenCalled();
|
|
319
|
+
});
|
|
320
|
+
it("uses typeTextWithMentions for reply with mentions", async () => {
|
|
321
|
+
setupMocks();
|
|
322
|
+
const parentUrn = "urn:li:comment:(activity:123,999)";
|
|
323
|
+
await commentOnPost({
|
|
324
|
+
postUrl: MOCK_POST_URL,
|
|
325
|
+
text: "@Jane Smith thanks!",
|
|
326
|
+
mentions: [{ name: "Jane Smith" }],
|
|
327
|
+
parentCommentUrn: parentUrn,
|
|
328
|
+
cdpPort: MOCK_CDP_PORT,
|
|
329
|
+
});
|
|
330
|
+
expect(typeTextWithMentions).toHaveBeenCalledWith(expect.anything(), expect.stringContaining(":focus"), "@Jane Smith thanks!", [{ name: "Jane Smith" }]);
|
|
331
|
+
expect(typeText).not.toHaveBeenCalled();
|
|
332
|
+
});
|
|
241
333
|
});
|
|
242
334
|
//# sourceMappingURL=comment-on-post.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"comment-on-post.test.js","sourceRoot":"","sources":["../../src/operations/comment-on-post.test.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"comment-on-post.test.js","sourceRoot":"","sources":["../../src/operations/comment-on-post.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import type { HumanizedMouse } from "../linkedin/humanized-mouse.js";
|
|
2
|
+
import type { ConnectionOptions } from "./types.js";
|
|
3
|
+
export interface DismissFeedPostInput extends ConnectionOptions {
|
|
4
|
+
/** Zero-based index of the post in the visible LinkedIn feed. */
|
|
5
|
+
readonly feedIndex: number;
|
|
6
|
+
/** Optional humanized mouse for natural cursor movement and clicks. */
|
|
7
|
+
readonly mouse?: HumanizedMouse | null | undefined;
|
|
8
|
+
/** When true, locate the menu item but do not click it. */
|
|
9
|
+
readonly dryRun?: boolean | undefined;
|
|
10
|
+
}
|
|
11
|
+
export interface DismissFeedPostOutput {
|
|
12
|
+
readonly success: true;
|
|
13
|
+
readonly feedIndex: number;
|
|
14
|
+
readonly dryRun: boolean;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Dismiss a post from the LinkedIn feed by clicking "Not interested".
|
|
18
|
+
*
|
|
19
|
+
* Navigates to the LinkedIn home feed, opens the three-dot menu of the
|
|
20
|
+
* post at the given `feedIndex`, and clicks "Not interested".
|
|
21
|
+
*
|
|
22
|
+
* @param input - Feed index, CDP connection parameters, and optional mouse.
|
|
23
|
+
* @returns Confirmation that the post was dismissed.
|
|
24
|
+
* @throws When the menu button is not found or "Not interested" is not
|
|
25
|
+
* available in its menu.
|
|
26
|
+
*/
|
|
27
|
+
export declare function dismissFeedPost(input: DismissFeedPostInput): Promise<DismissFeedPostOutput>;
|
|
28
|
+
//# sourceMappingURL=dismiss-feed-post.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dismiss-feed-post.d.ts","sourceRoot":"","sources":["../../src/operations/dismiss-feed-post.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AAErE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAQpD,MAAM,WAAW,oBAAqB,SAAQ,iBAAiB;IAC7D,iEAAiE;IACjE,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,uEAAuE;IACvE,QAAQ,CAAC,KAAK,CAAC,EAAE,cAAc,GAAG,IAAI,GAAG,SAAS,CAAC;IACnD,2DAA2D;IAC3D,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;CACvC;AAED,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,OAAO,EAAE,IAAI,CAAC;IACvB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;CAC1B;AAmED;;;;;;;;;;GAUG;AACH,wBAAsB,eAAe,CACnC,KAAK,EAAE,oBAAoB,GAC1B,OAAO,CAAC,qBAAqB,CAAC,CA0DhC"}
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
// SPDX-License-Identifier: AGPL-3.0-only
|
|
2
|
+
// Copyright (C) 2026 Oleksii PELYKH
|
|
3
|
+
import { resolveInstancePort } from "../cdp/index.js";
|
|
4
|
+
import { CDPClient } from "../cdp/client.js";
|
|
5
|
+
import { discoverTargets } from "../cdp/discovery.js";
|
|
6
|
+
import { humanizedScrollToByIndex } from "../linkedin/dom-automation.js";
|
|
7
|
+
import { gaussianDelay, maybeHesitate } from "../utils/delay.js";
|
|
8
|
+
import { navigateAwayIf } from "./navigate-away.js";
|
|
9
|
+
import { waitForFeedLoad } from "./get-feed.js";
|
|
10
|
+
/** CSS selector for feed post menu buttons. */
|
|
11
|
+
const FEED_MENU_BUTTON_SELECTOR = '[data-testid="mainFeed"] div[role="listitem"] button[aria-label^="Open control menu for post"]';
|
|
12
|
+
/**
|
|
13
|
+
* Open the three-dot menu for a feed post at the given index and click
|
|
14
|
+
* the "Not interested" menu item.
|
|
15
|
+
*
|
|
16
|
+
* @returns `true` if "Not interested" was clicked, `false` if the menu
|
|
17
|
+
* item was not found.
|
|
18
|
+
* @throws If the menu button could not be clicked.
|
|
19
|
+
*/
|
|
20
|
+
async function clickNotInterested(client, postIndex, mouse, dryRun) {
|
|
21
|
+
await maybeHesitate();
|
|
22
|
+
await humanizedScrollToByIndex(client, FEED_MENU_BUTTON_SELECTOR, postIndex, mouse);
|
|
23
|
+
const clicked = await client.evaluate(`(() => {
|
|
24
|
+
const btns = document.querySelectorAll(
|
|
25
|
+
${JSON.stringify(FEED_MENU_BUTTON_SELECTOR)}
|
|
26
|
+
);
|
|
27
|
+
const btn = btns[${postIndex}];
|
|
28
|
+
if (!btn) return false;
|
|
29
|
+
btn.click();
|
|
30
|
+
return true;
|
|
31
|
+
})()`);
|
|
32
|
+
if (!clicked) {
|
|
33
|
+
throw new Error("Failed to open the three-dot menu for the target post.");
|
|
34
|
+
}
|
|
35
|
+
await gaussianDelay(700, 100, 500, 900);
|
|
36
|
+
const dismissed = await client.evaluate(`(() => {
|
|
37
|
+
const dryRun = ${!!dryRun};
|
|
38
|
+
for (const el of document.querySelectorAll('[role="menuitem"]')) {
|
|
39
|
+
if (el.textContent.trim() === 'Not interested') {
|
|
40
|
+
if (!dryRun) el.click();
|
|
41
|
+
return true;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
return false;
|
|
45
|
+
})()`);
|
|
46
|
+
if (!dismissed) {
|
|
47
|
+
// Dismiss the open menu to avoid leaving the UI in a modal state
|
|
48
|
+
await client.evaluate(`(() => {
|
|
49
|
+
document.dispatchEvent(new KeyboardEvent('keydown', { key: 'Escape', bubbles: true }));
|
|
50
|
+
})()`);
|
|
51
|
+
await gaussianDelay(300, 75, 200, 500);
|
|
52
|
+
}
|
|
53
|
+
if (dismissed && dryRun) {
|
|
54
|
+
await client.evaluate(`(() => {
|
|
55
|
+
document.dispatchEvent(new KeyboardEvent('keydown', { key: 'Escape', bubbles: true }));
|
|
56
|
+
})()`);
|
|
57
|
+
await gaussianDelay(300, 75, 200, 500);
|
|
58
|
+
}
|
|
59
|
+
return dismissed;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Dismiss a post from the LinkedIn feed by clicking "Not interested".
|
|
63
|
+
*
|
|
64
|
+
* Navigates to the LinkedIn home feed, opens the three-dot menu of the
|
|
65
|
+
* post at the given `feedIndex`, and clicks "Not interested".
|
|
66
|
+
*
|
|
67
|
+
* @param input - Feed index, CDP connection parameters, and optional mouse.
|
|
68
|
+
* @returns Confirmation that the post was dismissed.
|
|
69
|
+
* @throws When the menu button is not found or "Not interested" is not
|
|
70
|
+
* available in its menu.
|
|
71
|
+
*/
|
|
72
|
+
export async function dismissFeedPost(input) {
|
|
73
|
+
const cdpPort = await resolveInstancePort(input.cdpPort, input.cdpHost);
|
|
74
|
+
const cdpHost = input.cdpHost ?? "127.0.0.1";
|
|
75
|
+
const allowRemote = input.allowRemote ?? false;
|
|
76
|
+
// Enforce loopback guard
|
|
77
|
+
if (!allowRemote && cdpHost !== "127.0.0.1" && cdpHost !== "localhost") {
|
|
78
|
+
throw new Error(`Non-loopback CDP host "${cdpHost}" requires --allow-remote. ` +
|
|
79
|
+
"This is a security measure to prevent remote code execution.");
|
|
80
|
+
}
|
|
81
|
+
const targets = await discoverTargets(cdpPort, cdpHost);
|
|
82
|
+
const linkedInTarget = targets.find((t) => t.type === "page" && t.url?.includes("linkedin.com"));
|
|
83
|
+
if (!linkedInTarget) {
|
|
84
|
+
throw new Error("No LinkedIn page found in LinkedHelper. " +
|
|
85
|
+
"Ensure LinkedHelper is running with an active LinkedIn session.");
|
|
86
|
+
}
|
|
87
|
+
const client = new CDPClient(cdpPort, { host: cdpHost, allowRemote });
|
|
88
|
+
await client.connect(linkedInTarget.id);
|
|
89
|
+
try {
|
|
90
|
+
const mouse = input.mouse;
|
|
91
|
+
const dryRun = input.dryRun ?? false;
|
|
92
|
+
const feedIndex = input.feedIndex;
|
|
93
|
+
// Navigate to the feed (force fresh load if already there)
|
|
94
|
+
await navigateAwayIf(client, "/feed");
|
|
95
|
+
await client.navigate("https://www.linkedin.com/feed/");
|
|
96
|
+
await waitForFeedLoad(client);
|
|
97
|
+
// Click "Not interested" on the post at the given feed index
|
|
98
|
+
const dismissed = await clickNotInterested(client, feedIndex, mouse, dryRun);
|
|
99
|
+
if (!dismissed) {
|
|
100
|
+
throw new Error('The post\'s three-dot menu does not contain "Not interested". ' +
|
|
101
|
+
"This may happen for your own posts or sponsored content.");
|
|
102
|
+
}
|
|
103
|
+
await gaussianDelay(550, 75, 400, 700);
|
|
104
|
+
await gaussianDelay(1_500, 500, 700, 3_500); // Post-action dwell
|
|
105
|
+
return {
|
|
106
|
+
success: true,
|
|
107
|
+
feedIndex: input.feedIndex,
|
|
108
|
+
dryRun,
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
finally {
|
|
112
|
+
client.disconnect();
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
//# sourceMappingURL=dismiss-feed-post.js.map
|