const bannedDomains = [ “reddit.com”, “linkedin.com”, “youtube.com”, “pinterest.com”, “facebook.com”, “quora.com”, “tiktok.com”, “twitter.com”, “x.com”, “tumblr.com”, “threads.net”, “douyin.com”, “vimeo.com”, “dailymotion.com”, “spotify.com”, “zhihu.com”, “stackexchange.com”, “stackoverflow.com”, “discord.com”, “discord.gg”, “4chan.org”, “amazon.com”, “ebay.com”, “etsy.com”, “slideshare.net”, “issuu.com”, “scribd.com”, “tripadvisor.com”, “yelp.com”, “bestbuy.com”, “target.com” ];
const splitOutItems = $(‘Split Out3’).all(); const grouped = {};
for (const [index, item] of $input.all().entries()) { const data = item.json; const rowNumber = splitOutItems[index]?.json.row_number || 1; const q = data.searchParameters?.q || “”;
if (!grouped[rowNumber]) { grouped[rowNumber] = { urls: [], seen: new Set() }; }
if (!data.organic || !Array.isArray(data.organic)) continue;
const top3 = data.organic .filter(o => { if (!o.link) return false; try { // ✅ 只改这里:统一转小写 const host = new URL(o.link).hostname.replace(/^www./, “”).toLowerCase();
// ✅ 检查是否在黑名单(精确匹配或子域名) return !bannedDomains.some(domain => host === domain || host.endsWith('.' + domain) ); } catch { return false; }
})
.sort((a, b) => a.position - b.position)
.slice(0, 3);for (const o of top3) { if (!grouped[rowNumber].seen.has(o.link)) { grouped[rowNumber].urls.push({ url: o.link, q }); grouped[rowNumber].seen.add(o.link); } } }
return Object.entries(grouped).map(([id, obj]) => ({ json: { item: { id: Number(id), urls: obj.urls } } }));
TOOL HUNTER
