← back to Marketing Command Center
MCC LinkedIn Network Feed: mark EXPERIMENTAL — scrape non-functional vs LinkedIn's current feed (TK-10504)
1749ce4df723a92a521771ac08ef1d6be4829978 · 2026-08-12 14:51:02 -0700 · Steve Abrams
Per Steve's call: keep the harvester + routes scaffold, relabel the live button
'↻ Refresh (experimental)', add an honest in-panel banner explaining LinkedIn now
serves automation Chrome a stripped feed (hashed classes, no DOM URNs, blob video),
and document the empirical finding in the harvester header. Download-to-assets +
gated Reshare remain functional when a card is present.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Files touched
M public/panels/linkedin.htmlM scripts/linkedin-feed-harvest.mjs
Diff
commit 1749ce4df723a92a521771ac08ef1d6be4829978
Author: Steve Abrams <steve@designerwallcoverings.com>
Date: Wed Aug 12 14:51:02 2026 -0700
MCC LinkedIn Network Feed: mark EXPERIMENTAL — scrape non-functional vs LinkedIn's current feed (TK-10504)
Per Steve's call: keep the harvester + routes scaffold, relabel the live button
'↻ Refresh (experimental)', add an honest in-panel banner explaining LinkedIn now
serves automation Chrome a stripped feed (hashed classes, no DOM URNs, blob video),
and document the empirical finding in the harvester header. Download-to-assets +
gated Reshare remain functional when a card is present.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
---
public/panels/linkedin.html | 10 +++++-----
scripts/linkedin-feed-harvest.mjs | 11 +++++++++++
2 files changed, 16 insertions(+), 5 deletions(-)
diff --git a/public/panels/linkedin.html b/public/panels/linkedin.html
index f4d87c2..098a113 100644
--- a/public/panels/linkedin.html
+++ b/public/panels/linkedin.html
@@ -73,17 +73,17 @@
<div id="li-mode-feed" hidden>
<div class="card">
<div style="display:flex;align-items:center;gap:10px;flex-wrap:wrap;">
- <h2 style="margin:0;">Network feed</h2>
+ <h2 style="margin:0;">Network feed <span class="pill" style="background:#b8860b;color:#fff;font-size:9px;">EXPERIMENTAL</span></h2>
<span class="pill" id="li-feed-count">0</span>
<span style="flex:1;"></span>
<label style="display:flex;align-items:center;gap:6px;font-size:11.5px;" class="muted"><input type="checkbox" id="li-feed-all"> show non-video too</label>
- <button class="btn gold" id="li-feed-refresh">↻ Refresh from LinkedIn</button>
+ <button class="btn ghost" id="li-feed-refresh" title="Runs the local openclaw harvester. Currently returns nothing against LinkedIn's anti-automation feed — see note.">↻ Refresh (experimental)</button>
</div>
- <div class="muted" style="font-size:12.5px;margin:10px 0 0;">
- Pulls video posts from <b>your own LinkedIn home feed</b> through openclaw real Chrome — LinkedIn has no feed API, so this reads your logged-in session locally. For each post you can <b>⬇ Download to assets</b> (re-cut as original DW content) or <b>↻ Reshare from the DW Page</b> (gated). Requires Chrome signed into LinkedIn on the <code>openclaw</code> profile.
+ <div style="border:1px solid #b8860b;background:rgba(184,134,11,.08);border-radius:8px;padding:10px 12px;margin:12px 0 0;font-size:12px;">
+ <b>⚠ Not functional against LinkedIn's current feed.</b> LinkedIn has no feed API, so this harvests your own logged-in feed via openclaw real Chrome — but LinkedIn now serves automation-controlled Chrome a stripped feed with hashed class names, no post URNs in the DOM, and <code>blob:</code> video (nothing downloadable). Probed empirically 2026-08-12 (TK-10504): 0 posts. The scaffold is kept for a future approach. <b>Note:</b> the harvester only runs where openclaw lives (your Mac) — not on the live server. The <b>Download-to-assets</b> and <b>gated Reshare</b> actions below work whenever a card is present.
</div>
<div id="li-feed-status" class="muted" style="font-size:11.5px;margin-top:8px;"></div>
</div>
- <div id="li-feed-cards"><div class="card muted">No feed harvested yet — click <b>Refresh from LinkedIn</b>.</div></div>
+ <div id="li-feed-cards"><div class="card muted">No feed harvested — this is an experimental scaffold (see note above).</div></div>
</div><!-- /li-mode-feed -->
</div>
diff --git a/scripts/linkedin-feed-harvest.mjs b/scripts/linkedin-feed-harvest.mjs
index e5998fd..b3622e9 100644
--- a/scripts/linkedin-feed-harvest.mjs
+++ b/scripts/linkedin-feed-harvest.mjs
@@ -11,6 +11,17 @@
// (reshare / download) stays gated in the panel. Scraping bypasses bot-detection,
// not gates: dw-legal-compliance + the reshare/publish confirm gates still apply.
//
+// ⚠ STATUS (2026-08-12, TK-10504): EXPERIMENTAL SCAFFOLD — currently returns 0
+// posts against LinkedIn's live feed. Empirically probed: LinkedIn serves the
+// CDP/automation-controlled Chrome a stripped feed with (1) hashed/randomized
+// post class names (.feed-shared-update-v2 / [data-urn] match nothing), (2) no
+// urn:li:activity in any DOM attribute, (3) blob:/MSE video (data-sources gone,
+// nothing downloadable in the DOM), and (4) no fetch/XHR feed calls on scroll.
+// The next path (Voyager API via session cookie + CSRF) is forbidden token-
+// harvesting + TOS-violating and is intentionally NOT taken. Kept as a scaffold
+// in case a viable, compliant source appears. The selectors below are the
+// last-known-good shape and will need reworking if LinkedIn re-exposes the feed.
+//
// Usage:
// node scripts/linkedin-feed-harvest.mjs # video posts, 8 scrolls
// node scripts/linkedin-feed-harvest.mjs --scrolls=12 # scroll deeper
← 2a3f00f HyperFrames social promo for streamlined MCC (9:16 + 1:1, cl
·
back to Marketing Command Center
·
MCC LinkedIn Network Feed: paste-URL curation board (the wor 79e1798 →