[object Object]

← 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

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 →