javascript:(function(){var MAX_URLS=10;var ALLOWED_HOSTS={"www.xiaohongshu.com":!0,"xiaohongshu.com":!0,"m.xiaohongshu.com":!0};var FORBIDDEN_PATH=["search_result","website-login","login","captcha","verify"];var SHORTLINK_HOSTS=["xhslink.com"];function parseURL(e){var t=document.createElement("a");return t.href=e,t}function isValidHost(e){return ALLOWED_HOSTS.hasOwnProperty((e||"").toLowerCase())}function hasForbiddenPath(e){e=(e||"").toLowerCase();for(var t=0;t<FORBIDDEN_PATH.length;t++)if(e.indexOf(FORBIDDEN_PATH[t])!==-1)return!0;return!1}function extractXsecToken(e){if(!e)return"";var t=e.match(/[?&]xsec_token=([^&]+)/);return t?decodeURIComponent(t[1]):""}function extractNoteId(e){var t=e.replace(/^\//,"").split("/");for(var n=0;n<t.length;n++)if(t[n]==="explore"||t[n]==="item"){if(n+1<t.length){var r=t[n+1].split("#")[0];return r||null}}return null}var anchors=document.querySelectorAll("a[href]");var seen={};var urls=[];var skipped=0;for(var i=0;i<anchors.length;i++){if(urls.length>=MAX_URLS)break;var rawHref=anchors[i].getAttribute("href");if(!rawHref)continue;var a=parseURL(rawHref);var host=a.hostname.toLowerCase();var path=a.pathname||"";if(SHORTLINK_HOSTS.indexOf(host)!==-1){skipped++;continue}if(!isValidHost(host))continue;if(path.indexOf("/explore/")===-1&&path.indexOf("/discovery/item/")===-1)continue;if(hasForbiddenPath(path))continue;var xsecToken=extractXsecToken(a.search);if(!xsecToken)continue;var noteId=extractNoteId(path);if(!noteId)continue;if(seen[noteId]){skipped++;continue}seen[noteId]=!0;urls.push(a.href)}var payload=JSON.stringify({urls:urls,raw:!1},null,2);if(urls.length===0){alert("XHS Collector: No note URLs found on this page.\n\nMake sure you are on a Xiaohongshu explore, search, or user page with visible note cards.");return}try{navigator.clipboard.writeText(payload).then(function(){alert("XHS Collector: "+urls.length+" URLs extracted"+(skipped>0?" ("+skipped+" skipped)":"")+"\n\nJSON copied to clipboard!\n\nPaste into POST /note/batch_detail_from_url body.")},function(){prompt("XHS Collector: "+urls.length+" URLs extracted.\nCopy the JSON below:",payload)})}catch(e){prompt("XHS Collector: "+urls.length+" URLs extracted.\nCopy the JSON below:",payload)}})()
