@lhremote/core 0.13.0 → 0.15.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 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/operations/get-feed.d.ts +1 -1
- package/dist/operations/get-feed.d.ts.map +1 -1
- package/dist/operations/get-feed.js +99 -32
- package/dist/operations/get-feed.js.map +1 -1
- package/dist/operations/get-feed.test.js +177 -30
- package/dist/operations/get-feed.test.js.map +1 -1
- package/dist/services/launcher.d.ts +60 -12
- package/dist/services/launcher.d.ts.map +1 -1
- package/dist/services/launcher.js +231 -33
- package/dist/services/launcher.js.map +1 -1
- package/dist/services/launcher.test.js +103 -0
- package/dist/services/launcher.test.js.map +1 -1
- package/dist/types/account.d.ts +25 -0
- package/dist/types/account.d.ts.map +1 -1
- package/dist/types/index.d.ts +2 -0
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js +1 -1
- package/dist/types/index.js.map +1 -1
- package/dist/types/workspace.d.ts +63 -0
- package/dist/types/workspace.d.ts.map +1 -0
- package/dist/types/workspace.js +31 -0
- package/dist/types/workspace.js.map +1 -0
- package/dist/types/workspace.test.d.ts +2 -0
- package/dist/types/workspace.test.d.ts.map +1 -0
- package/dist/types/workspace.test.js +100 -0
- package/dist/types/workspace.test.js.map +1 -0
- package/package.json +1 -1
package/dist/index.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
export type { Account, ActionBudget, ActionBudgetEntry, ActionConfig, ActionErrorSummary, ActionPeopleCounts, ActionStatistics, CampaignActionConfig, CampaignActionResult, CampaignActionUpdateConfig, ActionSettings, ActionTargetPerson, Campaign, CampaignAction, CampaignConfig, CampaignPersonEntry, CampaignPersonState, CampaignRunResult, CampaignState, EphemeralActionResult, EphemeralExecuteOptions, ResultProfileData, CampaignStatistics, CampaignStatus, CampaignSummary, CampaignUpdateConfig, CriticalErrorIssueData, DialogIssueData, ExcludeListEntry, Chat, ChatParticipant, ConversationMessages, ConversationThread, CurrentPosition, Education, ExternalId, ExternalIdTypeGroup, FeedPost, GetResultsOptions, GetStatisticsOptions, ImportPeopleResult, LimitType, RemovePeopleResult, InstanceInfo, InstanceIssue, InstancePopup, InstanceStatus, ListCampaignPeopleOptions, ListCampaignsOptions, Message, MessageStats, MessageSummary, MiniProfile, PopupState, PostComment, PostDetail, PostEngager, PostStats, Position, Profile, ProfileFindOptions, ProfileSearchOptions, ProfileSearchResult, ProfileSummary, ReactionCount, RunnerState, Skill, BasicSearchParams, BooleanExpressionInput, BooleanExpressionRaw, BooleanExpressionStructured, CompanySizeEntry, ConnectionDegreeEntry, EntityMatch, EntityType, FunctionEntry, IndustryEntry, ProfileLanguageEntry, ReferenceDataType, SNFilter, SNFilterValue, SNSearchParams, SeniorityEntry, SourceTier, SourceType, StartInstanceParams, StartInstanceResult, ThrottleStatus, UIHealthStatus, UrlBuilderResult, } from "./types/index.js";
|
|
1
|
+
export type { Account, ActionBudget, ActionBudgetEntry, ActionConfig, ActionErrorSummary, ActionPeopleCounts, ActionStatistics, CampaignActionConfig, CampaignActionResult, CampaignActionUpdateConfig, ActionSettings, ActionTargetPerson, Campaign, CampaignAction, CampaignConfig, CampaignPersonEntry, CampaignPersonState, CampaignRunResult, CampaignState, EphemeralActionResult, EphemeralExecuteOptions, ResultProfileData, CampaignStatistics, CampaignStatus, CampaignSummary, CampaignUpdateConfig, CriticalErrorIssueData, DialogIssueData, ExcludeListEntry, Chat, ChatParticipant, ConversationMessages, ConversationThread, CurrentPosition, Education, ExternalId, ExternalIdTypeGroup, FeedPost, GetResultsOptions, GetStatisticsOptions, ImportPeopleResult, LimitType, RemovePeopleResult, InstanceInfo, InstanceIssue, InstancePopup, InstanceStatus, ListCampaignPeopleOptions, ListCampaignsOptions, Message, MessageStats, MessageSummary, MiniProfile, PopupState, PostComment, PostDetail, PostEngager, PostStats, Position, Profile, ProfileFindOptions, ProfileSearchOptions, ProfileSearchResult, ProfileSummary, ReactionCount, RunnerState, Skill, BasicSearchParams, BooleanExpressionInput, BooleanExpressionRaw, BooleanExpressionStructured, CompanySizeEntry, ConnectionDegreeEntry, EntityMatch, EntityType, FunctionEntry, IndustryEntry, ProfileLanguageEntry, ReferenceDataType, SNFilter, SNFilterValue, SNSearchParams, SeniorityEntry, SourceTier, SourceType, StartInstanceParams, StartInstanceResult, ThrottleStatus, UIHealthStatus, UrlBuilderResult, Workspace, WorkspaceAccess, WorkspaceAccessLevel, WorkspaceInvitationStatus, WorkspaceUser, WorkspaceUserRole, } from "./types/index.js";
|
|
2
|
+
export { canStartInstance, isOwnerOrExtended, isRestrictedOrHigher, isViewOnlyOrHigher, WORKSPACE_ACCESS_LEVEL_ORDER, } from "./types/index.js";
|
|
2
3
|
export { AccountResolutionError, ActionExecutionError, type ActionResult, AppLaunchError, AppNotFoundError, AppService, type AppServiceOptions, BudgetExceededError, CampaignExecutionError, CampaignService, CampaignTimeoutError, EphemeralCampaignService, CollectionBusyError, CollectionError, type DatabaseContext, buildBasicSearchUrl, buildBooleanExpression, buildParameterisedUrl, buildSNSearchUrl, detectSourceType, getFixedUrl, getParameterType, isFixedUrlType, isParameterisedType, isSNSearchBuilderType, isSearchBuilderType, ExtractionTimeoutError, type InstanceDatabaseContext, InstanceNotRunningError, InstanceService, InvalidProfileUrlError, LauncherService, LinkedHelperNotRunningError, LinkedHelperUnreachableError, resolveAccount, ServiceError, StartInstanceError, startInstanceWithRecovery, UIBlockedError, validateSourceType, type StartInstanceOutcome, checkStatus, type AccountInstanceStatus, type DatabaseStatus, type LauncherStatus, type StatusReport, waitForInstancePort, waitForInstanceShutdown, waitForInstanceTargets, withDatabase, withInstanceDatabase, NodeIntegrationUnavailableError, WrongPortError, } from "./services/index.js";
|
|
3
4
|
export { ActionBudgetRepository, CampaignExcludeListRepository, CampaignRepository, CampaignStatisticsRepository, CollectionListRepository, type CollectionSummary, DatabaseClient, type DatabaseClientOptions, discoverAllDatabases, discoverDatabase, MessageRepository, ProfileRepository, } from "./db/index.js";
|
|
4
5
|
export { CampaignFormatError, FormatError, parseCampaignJson, parseCampaignYaml, serializeCampaignJson, serializeCampaignYaml, } from "./formats/index.js";
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAIA,YAAY,EACV,OAAO,EACP,YAAY,EACZ,iBAAiB,EACjB,YAAY,EACZ,kBAAkB,EAClB,kBAAkB,EAClB,gBAAgB,EAChB,oBAAoB,EACpB,oBAAoB,EACpB,0BAA0B,EAC1B,cAAc,EACd,kBAAkB,EAClB,QAAQ,EACR,cAAc,EACd,cAAc,EACd,mBAAmB,EACnB,mBAAmB,EACnB,iBAAiB,EACjB,aAAa,EACb,qBAAqB,EACrB,uBAAuB,EACvB,iBAAiB,EACjB,kBAAkB,EAClB,cAAc,EACd,eAAe,EACf,oBAAoB,EACpB,sBAAsB,EACtB,eAAe,EACf,gBAAgB,EAChB,IAAI,EACJ,eAAe,EACf,oBAAoB,EACpB,kBAAkB,EAClB,eAAe,EACf,SAAS,EACT,UAAU,EACV,mBAAmB,EACnB,QAAQ,EACR,iBAAiB,EACjB,oBAAoB,EACpB,kBAAkB,EAClB,SAAS,EACT,kBAAkB,EAClB,YAAY,EACZ,aAAa,EACb,aAAa,EACb,cAAc,EACd,yBAAyB,EACzB,oBAAoB,EACpB,OAAO,EACP,YAAY,EACZ,cAAc,EACd,WAAW,EACX,UAAU,EACV,WAAW,EACX,UAAU,EACV,WAAW,EACX,SAAS,EACT,QAAQ,EACR,OAAO,EACP,kBAAkB,EAClB,oBAAoB,EACpB,mBAAmB,EACnB,cAAc,EACd,aAAa,EACb,WAAW,EACX,KAAK,EACL,iBAAiB,EACjB,sBAAsB,EACtB,oBAAoB,EACpB,2BAA2B,EAC3B,gBAAgB,EAChB,qBAAqB,EACrB,WAAW,EACX,UAAU,EACV,aAAa,EACb,aAAa,EACb,oBAAoB,EACpB,iBAAiB,EACjB,QAAQ,EACR,aAAa,EACb,cAAc,EACd,cAAc,EACd,UAAU,EACV,UAAU,EACV,mBAAmB,EACnB,mBAAmB,EACnB,cAAc,EACd,cAAc,EACd,gBAAgB,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
// SPDX-License-Identifier: AGPL-3.0-only
|
|
2
2
|
// Copyright (C) 2026 Oleksii PELYKH
|
|
3
|
+
export { canStartInstance, isOwnerOrExtended, isRestrictedOrHigher, isViewOnlyOrHigher, WORKSPACE_ACCESS_LEVEL_ORDER, } from "./types/index.js";
|
|
3
4
|
// Services
|
|
4
5
|
export { AccountResolutionError, ActionExecutionError, AppLaunchError, AppNotFoundError, AppService, BudgetExceededError, CampaignExecutionError, CampaignService, CampaignTimeoutError, EphemeralCampaignService, CollectionBusyError, CollectionError, buildBasicSearchUrl, buildBooleanExpression, buildParameterisedUrl, buildSNSearchUrl, detectSourceType, getFixedUrl, getParameterType, isFixedUrlType, isParameterisedType, isSNSearchBuilderType, isSearchBuilderType, ExtractionTimeoutError, InstanceNotRunningError, InstanceService, InvalidProfileUrlError, LauncherService, LinkedHelperNotRunningError, LinkedHelperUnreachableError, resolveAccount, ServiceError, StartInstanceError, startInstanceWithRecovery, UIBlockedError, validateSourceType, checkStatus, waitForInstancePort, waitForInstanceShutdown, waitForInstanceTargets, withDatabase, withInstanceDatabase, NodeIntegrationUnavailableError, WrongPortError, } from "./services/index.js";
|
|
5
6
|
// Data access
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,yCAAyC;AACzC,oCAAoC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -52,7 +52,7 @@ export interface RawDomPost {
|
|
|
52
52
|
* separate phase by opening each post's three-dot menu, clicking
|
|
53
53
|
* "Copy link to post", and deriving the URN from the captured URL.
|
|
54
54
|
*/
|
|
55
|
-
declare const SCRAPE_FEED_POSTS_SCRIPT = "(() => {\n const posts = [];\n\n // --- Step 1: Find the feed list via data-testid ---\n const feedList = document.querySelector('[data-testid=\"mainFeed\"]');\n if (!feedList) return posts;\n\n // --- Step 2: Iterate listitem children ---\n const items = feedList.querySelectorAll('div[role=\"listitem\"]');\n for (const wrapper of items) {\n // The listitem wraps the actual post content in nested divs.\n // Some listitems may be zero-height (virtualized/hidden) or\n // non-post items (composer, suggestions).\n const item = wrapper;\n if (item.offsetHeight < 100) continue;\n\n // Detect real posts: must have a three-dot menu button\n const menuBtn = item.querySelector('button[aria-label^=\"Open control menu for post\"]');\n if (!menuBtn) continue;\n\n // --- Author info ---\n let authorName = null;\n let authorHeadline = null;\n let authorProfileUrl = null;\n\n const authorLink = item.querySelector('a[href*=\"/in/\"], a[href*=\"/company/\"]');\n if (authorLink) {\n authorProfileUrl = authorLink.href.split('?')[0] || null;\n const nameEl = authorLink.querySelector('span[dir=\"ltr\"], span[aria-hidden=\"true\"]')\n || authorLink;\n const rawName = (nameEl.textContent || '').trim();\n authorName = rawName || null;\n }\n\n // Author headline: look for a short descriptive text near the author.\n const allSpans = item.querySelectorAll('span');\n for (const span of allSpans) {\n const txt = (span.textContent || '').trim();\n if (\n txt &&\n txt.length > 5 &&\n txt.length < 200 &&\n txt !== authorName &&\n !txt.match(/^\\d+[smhdw]$/) &&\n !txt.match(/^\\d[\\d,]*\\s+(reactions?|comments?|reposts?|likes?)$/i) &&\n !txt.match(/^Follow$|^Promoted$/i)\n ) {\n authorHeadline = txt;\n break;\n }\n }\n\n // --- Post text ---\n let text = null;\n const ltrSpans = item.querySelectorAll('span[dir=\"ltr\"]');\n let longestText = '';\n for (const span of ltrSpans) {\n const txt = (span.textContent || '').trim();\n if (txt.length > longestText.length && txt !== authorName && txt !== authorHeadline) {\n longestText = txt;\n }\n }\n if (longestText.length > 20) {\n text = longestText;\n }\n\n // --- Media type ---\n let mediaType = null;\n if (item.querySelector('video')) {\n mediaType = 'video';\n } else if (item.querySelector('img[src*=\"media.licdn.com\"]')) {\n const imgs = item.querySelectorAll('img[src*=\"media.licdn.com\"]');\n for (const img of imgs) {\n if (img.offsetHeight > 100) { mediaType = 'image'; break; }\n }\n }\n\n // --- Engagement counts ---\n const itemText = item.textContent || '';\n\n function parseCount(pattern) {\n const m = itemText.match(pattern);\n if (!m) return 0;\n const raw = m[1].replace(/,/g, '');\n const num = parseInt(raw, 10);\n return isNaN(num) ? 0 : num;\n }\n\n const reactionCount = parseCount(/(\\d[\\d,]*)\\s+reactions?/i);\n const commentCount = parseCount(/(\\d[\\d,]*)\\s+comments?/i);\n const shareCount = parseCount(/(\\d[\\d,]*)\\s+reposts?/i);\n\n // --- Timestamp ---\n let timestamp = null;\n const timeEl = item.querySelector('time');\n if (timeEl) {\n const dt = timeEl.getAttribute('datetime');\n if (dt) timestamp = dt;\n }\n if (!timestamp) {\n const timeMatch = itemText.match(/(?:^|\\s)(\\d+[smhdw])(?:\\s|$|\\u00B7|\\xB7)/);\n if (timeMatch) timestamp = timeMatch[1];\n }\n\n posts.push({\n url: null,\n authorName: authorName,\n authorHeadline: authorHeadline,\n authorProfileUrl: authorProfileUrl,\n text: text,\n mediaType: mediaType,\n reactionCount: reactionCount,\n commentCount: commentCount,\n shareCount: shareCount,\n timestamp: timestamp,\n });\n }\n\n return posts;\n})()";
|
|
55
|
+
declare const SCRAPE_FEED_POSTS_SCRIPT = "(() => {\n const posts = [];\n if (window.__lhrNextIdx == null) window.__lhrNextIdx = 0;\n\n // --- Step 1: Find the feed list via data-testid ---\n const feedList = document.querySelector('[data-testid=\"mainFeed\"]');\n if (!feedList) return posts;\n\n // --- Step 2: Iterate listitem children ---\n const items = feedList.querySelectorAll('div[role=\"listitem\"]');\n for (const wrapper of items) {\n // The listitem wraps the actual post content in nested divs.\n // Some listitems may be zero-height (virtualized/hidden) or\n // non-post items (composer, suggestions).\n const item = wrapper;\n if (item.offsetHeight < 100) continue;\n\n // Detect real posts: must have a three-dot menu button\n const menuBtn = item.querySelector('button[aria-label^=\"Open control menu for post\"]');\n if (!menuBtn) continue;\n\n // --- Discovery tagging ---\n // Tag each listitem with a unique index on first discovery so that\n // posts can be accumulated across scroll iterations despite LinkedIn\n // virtualising off-screen items out of the DOM. The index value\n // itself isn't consumed by the Node-side logic \u2014 it's only used as\n // the DOM attribute payload so that already-seen items can be\n // recognised on subsequent scrapes.\n let _isNew = false;\n if (!item.hasAttribute('data-lhr-idx')) {\n item.setAttribute('data-lhr-idx', String(window.__lhrNextIdx++));\n _isNew = true;\n }\n\n // --- Author info ---\n let authorName = null;\n let authorHeadline = null;\n let authorProfileUrl = null;\n\n const authorLink = item.querySelector('a[href*=\"/in/\"], a[href*=\"/company/\"]');\n if (authorLink) {\n authorProfileUrl = authorLink.href.split('?')[0] || null;\n const nameEl = authorLink.querySelector('span[dir=\"ltr\"], span[aria-hidden=\"true\"]')\n || authorLink;\n const rawName = (nameEl.textContent || '').trim();\n authorName = rawName || null;\n }\n\n // Author headline: look for a short descriptive text near the author.\n const allSpans = item.querySelectorAll('span');\n for (const span of allSpans) {\n const txt = (span.textContent || '').trim();\n if (\n txt &&\n txt.length > 5 &&\n txt.length < 200 &&\n txt !== authorName &&\n !txt.match(/^\\d+[smhdw]$/) &&\n !txt.match(/^\\d[\\d,]*\\s+(reactions?|comments?|reposts?|likes?)$/i) &&\n !txt.match(/^Follow$|^Promoted$/i)\n ) {\n authorHeadline = txt;\n break;\n }\n }\n\n // --- Post text ---\n let text = null;\n const ltrSpans = item.querySelectorAll('span[dir=\"ltr\"]');\n let longestText = '';\n for (const span of ltrSpans) {\n const txt = (span.textContent || '').trim();\n if (txt.length > longestText.length && txt !== authorName && txt !== authorHeadline) {\n longestText = txt;\n }\n }\n if (longestText.length > 20) {\n text = longestText;\n }\n\n // --- Media type ---\n let mediaType = null;\n if (item.querySelector('video')) {\n mediaType = 'video';\n } else if (item.querySelector('img[src*=\"media.licdn.com\"]')) {\n const imgs = item.querySelectorAll('img[src*=\"media.licdn.com\"]');\n for (const img of imgs) {\n if (img.offsetHeight > 100) { mediaType = 'image'; break; }\n }\n }\n\n // --- Engagement counts ---\n const itemText = item.textContent || '';\n\n function parseCount(pattern) {\n const m = itemText.match(pattern);\n if (!m) return 0;\n const raw = m[1].replace(/,/g, '');\n const num = parseInt(raw, 10);\n return isNaN(num) ? 0 : num;\n }\n\n const reactionCount = parseCount(/(\\d[\\d,]*)\\s+reactions?/i);\n const commentCount = parseCount(/(\\d[\\d,]*)\\s+comments?/i);\n const shareCount = parseCount(/(\\d[\\d,]*)\\s+reposts?/i);\n\n // --- Timestamp ---\n let timestamp = null;\n const timeEl = item.querySelector('time');\n if (timeEl) {\n const dt = timeEl.getAttribute('datetime');\n if (dt) timestamp = dt;\n }\n if (!timestamp) {\n const timeMatch = itemText.match(/(?:^|\\s)(\\d+[smhdw])(?:\\s|$|\\u00B7|\\xB7)/);\n if (timeMatch) timestamp = timeMatch[1];\n }\n\n posts.push({\n _isNew: _isNew,\n url: null,\n authorName: authorName,\n authorHeadline: authorHeadline,\n authorProfileUrl: authorProfileUrl,\n text: text,\n mediaType: mediaType,\n reactionCount: reactionCount,\n commentCount: commentCount,\n shareCount: shareCount,\n timestamp: timestamp,\n });\n }\n\n return posts;\n})()";
|
|
56
56
|
/**
|
|
57
57
|
* Legacy scraping script using structural heuristics to find the feed
|
|
58
58
|
* container. Used by search-posts which navigates to search result
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"get-feed.d.ts","sourceRoot":"","sources":["../../src/operations/get-feed.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAG7C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AACrE,OAAO,EAAE,KAAK,IAAI,UAAU,EAAkF,MAAM,mBAAmB,CAAC;AACxI,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAGpD;;GAEG;AACH,MAAM,WAAW,YAAa,SAAQ,iBAAiB;IACrD,8CAA8C;IAC9C,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACpC,oEAAoE;IACpE,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACrC,0EAA0E;IAC1E,QAAQ,CAAC,KAAK,CAAC,EAAE,cAAc,GAAG,IAAI,GAAG,SAAS,CAAC;CACpD;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,uCAAuC;IACvC,QAAQ,CAAC,KAAK,EAAE,QAAQ,EAAE,CAAC;IAC3B,2EAA2E;IAC3E,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;CACpC;AAMD,oDAAoD;AACpD,MAAM,WAAW,UAAU;IACzB,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACnB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B;AAMD;;;;;;;;;;;;;;;GAeG;AACH,QAAA,MAAM,wBAAwB,
|
|
1
|
+
{"version":3,"file":"get-feed.d.ts","sourceRoot":"","sources":["../../src/operations/get-feed.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAG7C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AACrE,OAAO,EAAE,KAAK,IAAI,UAAU,EAAkF,MAAM,mBAAmB,CAAC;AACxI,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAGpD;;GAEG;AACH,MAAM,WAAW,YAAa,SAAQ,iBAAiB;IACrD,8CAA8C;IAC9C,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACpC,oEAAoE;IACpE,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACrC,0EAA0E;IAC1E,QAAQ,CAAC,KAAK,CAAC,EAAE,cAAc,GAAG,IAAI,GAAG,SAAS,CAAC;CACpD;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,uCAAuC;IACvC,QAAQ,CAAC,KAAK,EAAE,QAAQ,EAAE,CAAC;IAC3B,2EAA2E;IAC3E,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;CACpC;AAMD,oDAAoD;AACpD,MAAM,WAAW,UAAU;IACzB,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACnB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B;AAMD;;;;;;;;;;;;;;;GAeG;AACH,QAAA,MAAM,wBAAwB,6kJAsIzB,CAAC;AAEN;;;;;;GAMG;AACH,OAAO,EAAE,wBAAwB,IAAI,kBAAkB,EAAE,CAAC;AAmH1D;;GAEG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,EAAE,CAI7D;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,GAAG,IAAI,CAwBhE;AAED;;GAEG;AACH,oDAAoD;AACpD,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAEhD;AAED;;GAEG;AACH,oDAAoD;AACpD,wBAAgB,WAAW,CAAC,GAAG,EAAE,UAAU,EAAE,GAAG,QAAQ,EAAE,CAezD;AAMD,wDAAwD;AACxD,eAAO,MAAM,KAAK,mBAAa,CAAC;AAEhC;;;;;;;;;;;GAWG;AACH,wBAAsB,UAAU,CAC9B,MAAM,EAAE,SAAS,EACjB,KAAK,CAAC,EAAE,cAAc,GAAG,IAAI,GAC5B,OAAO,CAAC,IAAI,CAAC,CAKf;AAMD,oDAAoD;AACpD,wBAAsB,eAAe,CACnC,MAAM,EAAE,SAAS,EACjB,SAAS,SAAS,GACjB,OAAO,CAAC,IAAI,CAAC,CAqBf;AAMD;;;;;;;;;;GAUG;AACH,wBAAsB,OAAO,CAC3B,KAAK,EAAE,YAAY,GAClB,OAAO,CAAC,aAAa,CAAC,CA6LxB"}
|
|
@@ -27,6 +27,7 @@ import { navigateAwayIf } from "./navigate-away.js";
|
|
|
27
27
|
*/
|
|
28
28
|
const SCRAPE_FEED_POSTS_SCRIPT = `(() => {
|
|
29
29
|
const posts = [];
|
|
30
|
+
if (window.__lhrNextIdx == null) window.__lhrNextIdx = 0;
|
|
30
31
|
|
|
31
32
|
// --- Step 1: Find the feed list via data-testid ---
|
|
32
33
|
const feedList = document.querySelector('[data-testid="mainFeed"]');
|
|
@@ -45,6 +46,19 @@ const SCRAPE_FEED_POSTS_SCRIPT = `(() => {
|
|
|
45
46
|
const menuBtn = item.querySelector('button[aria-label^="Open control menu for post"]');
|
|
46
47
|
if (!menuBtn) continue;
|
|
47
48
|
|
|
49
|
+
// --- Discovery tagging ---
|
|
50
|
+
// Tag each listitem with a unique index on first discovery so that
|
|
51
|
+
// posts can be accumulated across scroll iterations despite LinkedIn
|
|
52
|
+
// virtualising off-screen items out of the DOM. The index value
|
|
53
|
+
// itself isn't consumed by the Node-side logic — it's only used as
|
|
54
|
+
// the DOM attribute payload so that already-seen items can be
|
|
55
|
+
// recognised on subsequent scrapes.
|
|
56
|
+
let _isNew = false;
|
|
57
|
+
if (!item.hasAttribute('data-lhr-idx')) {
|
|
58
|
+
item.setAttribute('data-lhr-idx', String(window.__lhrNextIdx++));
|
|
59
|
+
_isNew = true;
|
|
60
|
+
}
|
|
61
|
+
|
|
48
62
|
// --- Author info ---
|
|
49
63
|
let authorName = null;
|
|
50
64
|
let authorHeadline = null;
|
|
@@ -130,6 +144,7 @@ const SCRAPE_FEED_POSTS_SCRIPT = `(() => {
|
|
|
130
144
|
}
|
|
131
145
|
|
|
132
146
|
posts.push({
|
|
147
|
+
_isNew: _isNew,
|
|
133
148
|
url: null,
|
|
134
149
|
authorName: authorName,
|
|
135
150
|
authorHeadline: authorHeadline,
|
|
@@ -391,31 +406,90 @@ export async function getFeed(input) {
|
|
|
391
406
|
await client.navigate("https://www.linkedin.com/feed/");
|
|
392
407
|
// Wait for the initial feed content to render
|
|
393
408
|
await waitForFeedLoad(client);
|
|
394
|
-
// Collect posts — scroll to load more if needed
|
|
409
|
+
// Collect posts — scroll to load more if needed.
|
|
410
|
+
//
|
|
411
|
+
// LinkedIn's main feed virtualises off-screen posts out of the DOM,
|
|
412
|
+
// so each point-in-time scrape only sees ~8-13 items. To accumulate
|
|
413
|
+
// beyond that cap we tag discovered listitems with `data-lhr-idx`
|
|
414
|
+
// and interleave URL extraction with scrolling so that each post's
|
|
415
|
+
// URL is captured while the element is still visible.
|
|
416
|
+
//
|
|
417
|
+
// The target is counted in URL-bearing posts only (`seenUrls.size`).
|
|
418
|
+
// Posts whose URL extraction failed are still accumulated for
|
|
419
|
+
// completeness but don't count toward the target — otherwise a run
|
|
420
|
+
// of transient failures could make the loop exit with a window of
|
|
421
|
+
// null-URL posts and no usable cursor.
|
|
422
|
+
//
|
|
423
|
+
// We need `count` posts plus one extra so the hasMore check has a
|
|
424
|
+
// post beyond the result window. Cursor calls use `count * 2 + 1`:
|
|
425
|
+
// up to `count` posts may be consumed locating the cursor, then
|
|
426
|
+
// `count` more for the next page, plus one for hasMore.
|
|
395
427
|
const maxScrollAttempts = 10;
|
|
396
|
-
|
|
397
|
-
|
|
428
|
+
const allPosts = [];
|
|
429
|
+
const seenUrls = new Set();
|
|
430
|
+
const accumulationTarget = cursor ? count * 2 + 1 : count + 1;
|
|
431
|
+
let previousUrlCount = 0;
|
|
398
432
|
// If resuming with a cursor, we need to scroll past already-seen posts
|
|
399
433
|
const cursorUrl = cursor;
|
|
434
|
+
// Install the clipboard interceptor before the scroll loop so that
|
|
435
|
+
// URL extraction can happen inside each iteration.
|
|
436
|
+
await installClipboardInterceptor(client);
|
|
400
437
|
for (let scroll = 0; scroll <= maxScrollAttempts; scroll++) {
|
|
401
|
-
const
|
|
438
|
+
const countBefore = allPosts.length;
|
|
439
|
+
// Scrape visible posts — the script tags each listitem with a
|
|
440
|
+
// discovery index and reports which items are newly discovered.
|
|
402
441
|
const scraped = await client.evaluate(SCRAPE_FEED_POSTS_SCRIPT);
|
|
403
|
-
|
|
404
|
-
//
|
|
405
|
-
|
|
406
|
-
|
|
442
|
+
const batch = scraped ?? [];
|
|
443
|
+
// Extract URLs for newly discovered posts while they are visible.
|
|
444
|
+
// `domIdx` is the position within the current batch which matches
|
|
445
|
+
// the DOM order of visible menu buttons.
|
|
446
|
+
//
|
|
447
|
+
// To avoid extracting URLs for far more posts than needed (each
|
|
448
|
+
// extraction opens the three-dot menu — ~1-2 s per post), we stop
|
|
449
|
+
// once we have enough URL-bearing posts.
|
|
450
|
+
let extractedInBatch = 0;
|
|
451
|
+
for (let domIdx = 0; domIdx < batch.length; domIdx++) {
|
|
452
|
+
const post = batch[domIdx];
|
|
453
|
+
if (!post?._isNew)
|
|
454
|
+
continue;
|
|
455
|
+
// Stop extracting once we have enough URL-bearing posts
|
|
456
|
+
if (seenUrls.size >= accumulationTarget)
|
|
457
|
+
break;
|
|
458
|
+
if (extractedInBatch > 0)
|
|
459
|
+
await gaussianDelay(550, 125, 300, 800);
|
|
460
|
+
await maybeBreak();
|
|
461
|
+
const url = await retryInteraction(() => capturePostUrl(client, domIdx, mouse));
|
|
462
|
+
if (url) {
|
|
463
|
+
post.url = url;
|
|
464
|
+
}
|
|
465
|
+
extractedInBatch++;
|
|
466
|
+
// Accumulate the post (dedup by URL when available)
|
|
467
|
+
if (post.url) {
|
|
468
|
+
if (!seenUrls.has(post.url)) {
|
|
469
|
+
seenUrls.add(post.url);
|
|
470
|
+
allPosts.push(post);
|
|
471
|
+
}
|
|
472
|
+
}
|
|
473
|
+
else {
|
|
474
|
+
// URL extraction failed — include for completeness but don't
|
|
475
|
+
// count toward accumulationTarget (see comment above).
|
|
476
|
+
allPosts.push(post);
|
|
477
|
+
}
|
|
478
|
+
}
|
|
479
|
+
// Enough URL-bearing posts accumulated?
|
|
480
|
+
if (seenUrls.size >= accumulationTarget)
|
|
407
481
|
break;
|
|
408
|
-
// No new posts
|
|
409
|
-
if (
|
|
482
|
+
// No new URL-bearing posts after scroll — stop
|
|
483
|
+
if (seenUrls.size === previousUrlCount && scroll > 0)
|
|
410
484
|
break;
|
|
411
|
-
|
|
485
|
+
const newPostCount = allPosts.length - countBefore;
|
|
486
|
+
previousUrlCount = seenUrls.size;
|
|
412
487
|
// Scroll to load more
|
|
413
488
|
if (scroll < maxScrollAttempts) {
|
|
414
489
|
await scrollFeed(client, mouse);
|
|
415
490
|
// Progressive session fatigue: delays increase with each scroll
|
|
416
491
|
const fatigueMultiplier = 1 + scroll * 0.1;
|
|
417
492
|
// Scale delay by newly visible content volume
|
|
418
|
-
const newPostCount = allPosts.length - countBeforeScroll;
|
|
419
493
|
const contentBonus = Math.min(newPostCount * gaussianBetween(350, 75, 200, 500), 3_000);
|
|
420
494
|
await gaussianDelay(1_500 * fatigueMultiplier + contentBonus, 150 * fatigueMultiplier, 1_200 * fatigueMultiplier + contentBonus, 1_800 * fatigueMultiplier + contentBonus);
|
|
421
495
|
// Reading simulation: pause proportional to visible content volume.
|
|
@@ -426,23 +500,6 @@ export async function getFeed(input) {
|
|
|
426
500
|
await maybeBreak();
|
|
427
501
|
}
|
|
428
502
|
}
|
|
429
|
-
// --- URL extraction phase ---
|
|
430
|
-
// Open each post's three-dot menu, click "Copy link to post", and
|
|
431
|
-
// derive the URN from the captured URL. This populates the urn/url
|
|
432
|
-
// fields that the scrape script left null.
|
|
433
|
-
await installClipboardInterceptor(client);
|
|
434
|
-
for (let i = 0; i < allPosts.length; i++) {
|
|
435
|
-
const post = allPosts[i];
|
|
436
|
-
if (!post)
|
|
437
|
-
continue;
|
|
438
|
-
if (i > 0)
|
|
439
|
-
await gaussianDelay(550, 125, 300, 800); // Inter-post delay
|
|
440
|
-
await maybeBreak();
|
|
441
|
-
const url = await retryInteraction(() => capturePostUrl(client, i, mouse));
|
|
442
|
-
if (url) {
|
|
443
|
-
post.url = url;
|
|
444
|
-
}
|
|
445
|
-
}
|
|
446
503
|
// Slice the result window
|
|
447
504
|
let startIdx = 0;
|
|
448
505
|
if (cursorUrl) {
|
|
@@ -453,10 +510,20 @@ export async function getFeed(input) {
|
|
|
453
510
|
}
|
|
454
511
|
const window = allPosts.slice(startIdx, startIdx + count);
|
|
455
512
|
const posts = mapRawPosts(window);
|
|
456
|
-
// Determine next cursor
|
|
513
|
+
// Determine next cursor — scan backwards for the nearest post with a
|
|
514
|
+
// non-null URL so that a single failed URL extraction doesn't block
|
|
515
|
+
// pagination when more posts are available.
|
|
457
516
|
const hasMore = startIdx + count < allPosts.length;
|
|
458
|
-
|
|
459
|
-
|
|
517
|
+
let nextCursor = null;
|
|
518
|
+
if (hasMore) {
|
|
519
|
+
for (let i = window.length - 1; i >= 0; i--) {
|
|
520
|
+
const postUrl = window[i]?.url;
|
|
521
|
+
if (postUrl) {
|
|
522
|
+
nextCursor = postUrl;
|
|
523
|
+
break;
|
|
524
|
+
}
|
|
525
|
+
}
|
|
526
|
+
}
|
|
460
527
|
await gaussianDelay(800, 300, 300, 1_800); // Post-action dwell
|
|
461
528
|
return { posts, nextCursor };
|
|
462
529
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"get-feed.js","sourceRoot":"","sources":["../../src/operations/get-feed.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"get-feed.js","sourceRoot":"","sources":["../../src/operations/get-feed.ts"],"names":[],"mappings":"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"}
|
|
@@ -43,19 +43,31 @@ function rawPost(overrides = {}) {
|
|
|
43
43
|
/**
|
|
44
44
|
* Create a script-aware evaluate mock that handles the getFeed call sequence:
|
|
45
45
|
* 1. waitForFeedLoad → truthy when posts exist
|
|
46
|
-
* 2.
|
|
47
|
-
* 3.
|
|
48
|
-
* 4. Per-post URL capture: reset → void, scroll → void,
|
|
49
|
-
* copy-link click → void, clipboard read → url string
|
|
46
|
+
* 2. Clipboard interceptor install → void
|
|
47
|
+
* 3. SCRAPE_FEED_POSTS_SCRIPT → indexed posts array (may repeat on scroll)
|
|
48
|
+
* 4. Per-post URL capture (interleaved): reset → void, scroll → void,
|
|
49
|
+
* menu click → true, copy-link click → void, clipboard read → url string
|
|
50
|
+
*
|
|
51
|
+
* The scrape mock adds an `_isNew` field to match the DOM-tagging
|
|
52
|
+
* accumulation strategy. On the first call all posts are "new"; subsequent
|
|
53
|
+
* calls return the same posts as "already seen" so that the scroll loop
|
|
54
|
+
* exits after one iteration.
|
|
50
55
|
*/
|
|
51
56
|
function createEvaluateMock(scrapedPosts) {
|
|
52
57
|
let urlIdx = 0;
|
|
58
|
+
let scrapeCallCount = 0;
|
|
53
59
|
return vi.fn().mockImplementation((script) => {
|
|
54
60
|
const s = String(script);
|
|
55
61
|
// Order matters: check most specific patterns first
|
|
56
|
-
// Scrape script: long script with parseCount function
|
|
62
|
+
// Scrape script: long script with parseCount function.
|
|
63
|
+
// Returns posts with discovery-tagging field (_isNew).
|
|
57
64
|
if (s.includes("parseCount")) {
|
|
58
|
-
|
|
65
|
+
const isFirstScrape = scrapeCallCount === 0;
|
|
66
|
+
scrapeCallCount++;
|
|
67
|
+
return Promise.resolve(scrapedPosts.map((p) => ({
|
|
68
|
+
...p,
|
|
69
|
+
_isNew: isFirstScrape,
|
|
70
|
+
})));
|
|
59
71
|
}
|
|
60
72
|
// Clipboard interceptor install
|
|
61
73
|
if (s.includes("navigator.clipboard.writeText")) {
|
|
@@ -172,10 +184,14 @@ describe("getFeed", () => {
|
|
|
172
184
|
},
|
|
173
185
|
]);
|
|
174
186
|
let clipboardReadCount = 0;
|
|
187
|
+
let retryScrapeCount = 0;
|
|
175
188
|
const evaluate = vi.fn().mockImplementation((script) => {
|
|
176
189
|
const s = String(script);
|
|
177
|
-
if (s.includes("parseCount"))
|
|
178
|
-
|
|
190
|
+
if (s.includes("parseCount")) {
|
|
191
|
+
const isFirst = retryScrapeCount === 0;
|
|
192
|
+
retryScrapeCount++;
|
|
193
|
+
return Promise.resolve([{ ...post, _isNew: isFirst }]);
|
|
194
|
+
}
|
|
179
195
|
if (s.includes("navigator.clipboard.writeText"))
|
|
180
196
|
return Promise.resolve(undefined);
|
|
181
197
|
if (s.includes("__capturedClipboard = null"))
|
|
@@ -237,6 +253,116 @@ describe("getFeed", () => {
|
|
|
237
253
|
const result = await getFeed({ cdpPort: CDP_PORT, count: 2 });
|
|
238
254
|
expect(result.nextCursor).toBe("https://www.linkedin.com/feed/update/urn:li:activity:2/");
|
|
239
255
|
});
|
|
256
|
+
it("returns nextCursor from nearest post with URL when last post URL is null", async () => {
|
|
257
|
+
// Custom mock: 3 posts where only the first has a successful URL extraction.
|
|
258
|
+
// The clipboard mock returns a URL for the first post only; all subsequent
|
|
259
|
+
// reads return null, causing capturePostUrl to genuinely fail for posts 2–3.
|
|
260
|
+
vi.mocked(discoverTargets).mockResolvedValue([{
|
|
261
|
+
id: "target-1", type: "page", title: "LinkedIn",
|
|
262
|
+
url: "https://www.linkedin.com/feed/",
|
|
263
|
+
description: "", devtoolsFrontendUrl: "",
|
|
264
|
+
}]);
|
|
265
|
+
const posts = [
|
|
266
|
+
{ ...rawPost({ url: null }), _isNew: true },
|
|
267
|
+
{ ...rawPost({ url: null }), _isNew: true },
|
|
268
|
+
{ ...rawPost({ url: null }), _isNew: true },
|
|
269
|
+
];
|
|
270
|
+
let clipIdx = 0;
|
|
271
|
+
const clipUrls = ["https://www.linkedin.com/feed/update/urn:li:activity:1/"];
|
|
272
|
+
const evaluate = vi.fn().mockImplementation((script) => {
|
|
273
|
+
const s = String(script);
|
|
274
|
+
if (s.includes("parseCount"))
|
|
275
|
+
return Promise.resolve(posts);
|
|
276
|
+
if (s.includes("navigator.clipboard.writeText"))
|
|
277
|
+
return Promise.resolve(undefined);
|
|
278
|
+
if (s.includes("__capturedClipboard = null"))
|
|
279
|
+
return Promise.resolve(undefined);
|
|
280
|
+
if (s.includes("Copy link to post"))
|
|
281
|
+
return Promise.resolve(undefined);
|
|
282
|
+
if (s === "window.__capturedClipboard") {
|
|
283
|
+
const url = clipUrls[clipIdx] ?? null;
|
|
284
|
+
clipIdx++;
|
|
285
|
+
return Promise.resolve(url);
|
|
286
|
+
}
|
|
287
|
+
if (s.includes("btn.click()"))
|
|
288
|
+
return Promise.resolve(true);
|
|
289
|
+
if (s.includes("scrollIntoView"))
|
|
290
|
+
return Promise.resolve(undefined);
|
|
291
|
+
if (s.includes("mainFeed"))
|
|
292
|
+
return Promise.resolve(true);
|
|
293
|
+
return Promise.resolve(null);
|
|
294
|
+
});
|
|
295
|
+
vi.mocked(CDPClient).mockImplementation(function () {
|
|
296
|
+
return {
|
|
297
|
+
connect: vi.fn().mockResolvedValue(undefined),
|
|
298
|
+
disconnect: vi.fn(),
|
|
299
|
+
navigate: vi.fn().mockResolvedValue({ frameId: "F1" }),
|
|
300
|
+
evaluate,
|
|
301
|
+
send: vi.fn().mockResolvedValue(undefined),
|
|
302
|
+
};
|
|
303
|
+
});
|
|
304
|
+
const result = await getFeed({ cdpPort: CDP_PORT, count: 2 });
|
|
305
|
+
// Window = [post0 (url:activity:1), post1 (url:null)], hasMore = true
|
|
306
|
+
// post1.url = null → scan backwards → post0.url
|
|
307
|
+
expect(result.posts).toHaveLength(2);
|
|
308
|
+
expect(result.nextCursor).toBe("https://www.linkedin.com/feed/update/urn:li:activity:1/");
|
|
309
|
+
});
|
|
310
|
+
it("stops extracting URLs once accumulationTarget is reached", async () => {
|
|
311
|
+
// 20 posts available, but count=3 → accumulationTarget = 4.
|
|
312
|
+
// Only 4 URL extractions should occur (not 20).
|
|
313
|
+
const posts = Array.from({ length: 20 }, (_, i) => ({
|
|
314
|
+
...rawPost({
|
|
315
|
+
url: `https://www.linkedin.com/feed/update/urn:li:activity:${String(i + 1)}/`,
|
|
316
|
+
}),
|
|
317
|
+
_isNew: true,
|
|
318
|
+
}));
|
|
319
|
+
let copyLinkClicks = 0;
|
|
320
|
+
let clipIdx = 0;
|
|
321
|
+
vi.mocked(discoverTargets).mockResolvedValue([{
|
|
322
|
+
id: "target-1", type: "page", title: "LinkedIn",
|
|
323
|
+
url: "https://www.linkedin.com/feed/",
|
|
324
|
+
description: "", devtoolsFrontendUrl: "",
|
|
325
|
+
}]);
|
|
326
|
+
const evaluate = vi.fn().mockImplementation((script) => {
|
|
327
|
+
const s = String(script);
|
|
328
|
+
if (s.includes("parseCount"))
|
|
329
|
+
return Promise.resolve(posts);
|
|
330
|
+
if (s.includes("navigator.clipboard.writeText"))
|
|
331
|
+
return Promise.resolve(undefined);
|
|
332
|
+
if (s.includes("__capturedClipboard = null"))
|
|
333
|
+
return Promise.resolve(undefined);
|
|
334
|
+
if (s.includes("Copy link to post")) {
|
|
335
|
+
copyLinkClicks++;
|
|
336
|
+
return Promise.resolve(undefined);
|
|
337
|
+
}
|
|
338
|
+
if (s === "window.__capturedClipboard") {
|
|
339
|
+
const url = posts[clipIdx]?.url ?? null;
|
|
340
|
+
clipIdx++;
|
|
341
|
+
return Promise.resolve(url);
|
|
342
|
+
}
|
|
343
|
+
if (s.includes("btn.click()"))
|
|
344
|
+
return Promise.resolve(true);
|
|
345
|
+
if (s.includes("scrollIntoView"))
|
|
346
|
+
return Promise.resolve(undefined);
|
|
347
|
+
if (s.includes("mainFeed"))
|
|
348
|
+
return Promise.resolve(true);
|
|
349
|
+
return Promise.resolve(null);
|
|
350
|
+
});
|
|
351
|
+
vi.mocked(CDPClient).mockImplementation(function () {
|
|
352
|
+
return {
|
|
353
|
+
connect: vi.fn().mockResolvedValue(undefined),
|
|
354
|
+
disconnect: vi.fn(),
|
|
355
|
+
navigate: vi.fn().mockResolvedValue({ frameId: "F1" }),
|
|
356
|
+
evaluate,
|
|
357
|
+
send: vi.fn().mockResolvedValue(undefined),
|
|
358
|
+
};
|
|
359
|
+
});
|
|
360
|
+
const result = await getFeed({ cdpPort: CDP_PORT, count: 3 });
|
|
361
|
+
expect(result.posts).toHaveLength(3);
|
|
362
|
+
// Target = count + 1 = 4. Extraction stops as soon as seenUrls.size
|
|
363
|
+
// reaches 4, so "Copy link to post" is clicked exactly 4 times.
|
|
364
|
+
expect(copyLinkClicks).toBe(4);
|
|
365
|
+
});
|
|
240
366
|
it("returns null nextCursor when all posts are returned", async () => {
|
|
241
367
|
setupMocks([
|
|
242
368
|
rawPost({ url: "https://www.linkedin.com/feed/update/urn:li:activity:1/" }),
|
|
@@ -314,27 +440,40 @@ describe("getFeed", () => {
|
|
|
314
440
|
rawPost({ url: "https://www.linkedin.com/feed/update/urn:li:activity:3/" }),
|
|
315
441
|
rawPost({ url: "https://www.linkedin.com/feed/update/urn:li:activity:4/" }),
|
|
316
442
|
];
|
|
317
|
-
let
|
|
443
|
+
let clipIdx = 0;
|
|
318
444
|
evaluate.mockReset();
|
|
319
445
|
evaluate.mockImplementation((script) => {
|
|
320
446
|
const s = String(script);
|
|
321
447
|
if (s.includes("parseCount")) {
|
|
322
448
|
scrapeCall++;
|
|
323
|
-
|
|
449
|
+
// First scrape: 2 posts, all new.
|
|
450
|
+
// Second scrape: 4 posts — first 2 already tagged, last 2 new.
|
|
451
|
+
if (scrapeCall === 1) {
|
|
452
|
+
return Promise.resolve(firstScrape.map((p) => ({ ...p, _isNew: true })));
|
|
453
|
+
}
|
|
454
|
+
return Promise.resolve(secondScrape.map((p, i) => ({
|
|
455
|
+
...p, _isNew: i >= firstScrape.length,
|
|
456
|
+
})));
|
|
324
457
|
}
|
|
325
|
-
if (s.includes("
|
|
326
|
-
|
|
327
|
-
|
|
458
|
+
if (s.includes("navigator.clipboard.writeText"))
|
|
459
|
+
return Promise.resolve(undefined);
|
|
460
|
+
if (s.includes("__capturedClipboard = null"))
|
|
461
|
+
return Promise.resolve(undefined);
|
|
462
|
+
if (s.includes("Copy link to post"))
|
|
463
|
+
return Promise.resolve(undefined);
|
|
464
|
+
if (s === "window.__capturedClipboard") {
|
|
465
|
+
// Return URLs from the combined post list in discovery order
|
|
466
|
+
const allUrls = [...firstScrape, ...secondScrape.slice(firstScrape.length)];
|
|
467
|
+
const url = allUrls[clipIdx]?.url ?? null;
|
|
468
|
+
clipIdx++;
|
|
469
|
+
return Promise.resolve(url);
|
|
328
470
|
}
|
|
329
|
-
if (s.includes("btn.click()"))
|
|
471
|
+
if (s.includes("btn.click()"))
|
|
330
472
|
return Promise.resolve(true);
|
|
331
|
-
|
|
332
|
-
if (s.includes("scrollIntoView")) {
|
|
473
|
+
if (s.includes("scrollIntoView"))
|
|
333
474
|
return Promise.resolve(undefined);
|
|
334
|
-
|
|
335
|
-
if (s.includes("mainFeed")) {
|
|
475
|
+
if (s.includes("mainFeed"))
|
|
336
476
|
return Promise.resolve(true);
|
|
337
|
-
}
|
|
338
477
|
return Promise.resolve(null);
|
|
339
478
|
});
|
|
340
479
|
const result = await getFeed({ cdpPort: CDP_PORT, count: 4 });
|
|
@@ -354,26 +493,34 @@ describe("getFeed", () => {
|
|
|
354
493
|
rawPost({ url: "https://www.linkedin.com/feed/update/urn:li:activity:1/" }),
|
|
355
494
|
rawPost({ url: "https://www.linkedin.com/feed/update/urn:li:activity:2/" }),
|
|
356
495
|
];
|
|
357
|
-
let
|
|
496
|
+
let staleScrapeCount = 0;
|
|
497
|
+
let staleClipIdx = 0;
|
|
358
498
|
evaluate.mockReset();
|
|
359
499
|
evaluate.mockImplementation((script) => {
|
|
360
500
|
const s = String(script);
|
|
361
501
|
if (s.includes("parseCount")) {
|
|
362
|
-
|
|
502
|
+
// First call: posts are new. Subsequent: same posts, not new.
|
|
503
|
+
const isFirst = staleScrapeCount === 0;
|
|
504
|
+
staleScrapeCount++;
|
|
505
|
+
return Promise.resolve(fixedPosts.map((p) => ({ ...p, _isNew: isFirst })));
|
|
363
506
|
}
|
|
364
|
-
if (s.includes("
|
|
365
|
-
|
|
366
|
-
|
|
507
|
+
if (s.includes("navigator.clipboard.writeText"))
|
|
508
|
+
return Promise.resolve(undefined);
|
|
509
|
+
if (s.includes("__capturedClipboard = null"))
|
|
510
|
+
return Promise.resolve(undefined);
|
|
511
|
+
if (s.includes("Copy link to post"))
|
|
512
|
+
return Promise.resolve(undefined);
|
|
513
|
+
if (s === "window.__capturedClipboard") {
|
|
514
|
+
const url = fixedPosts[staleClipIdx]?.url ?? null;
|
|
515
|
+
staleClipIdx++;
|
|
516
|
+
return Promise.resolve(url);
|
|
367
517
|
}
|
|
368
|
-
if (s.includes("btn.click()"))
|
|
518
|
+
if (s.includes("btn.click()"))
|
|
369
519
|
return Promise.resolve(true);
|
|
370
|
-
|
|
371
|
-
if (s.includes("scrollIntoView")) {
|
|
520
|
+
if (s.includes("scrollIntoView"))
|
|
372
521
|
return Promise.resolve(undefined);
|
|
373
|
-
|
|
374
|
-
if (s.includes("mainFeed")) {
|
|
522
|
+
if (s.includes("mainFeed"))
|
|
375
523
|
return Promise.resolve(true);
|
|
376
|
-
}
|
|
377
524
|
return Promise.resolve(null);
|
|
378
525
|
});
|
|
379
526
|
const result = await getFeed({ cdpPort: CDP_PORT, count: 10 });
|