匹配范围
*://*.reddit.com/*reddit-search-results用途 在 Reddit 页面内搜索帖子,并返回标题、作者、分区、分数、评论数、链接和媒体预览信息。 执行前提 先打开 https://www.reddit.com/ 或任意 reddit.com 页面。 如果 Reddit 返回风控、登录墙或 403,请先在浏览器里完成验证后再执行。 参数 通过 lh exec evaluate --command-slu…
*://*.reddit.com/*dom.readnetwork.fetch1function decodeHtml(value) {2 if (typeof value !== 'string' || !value) return '';3 return value4 .replace(/&/g, '&')5 .replace(/</g, '<')6 .replace(/>/g, '>')7 .replace(/"/g, '"')8 .replace(/'/gi, "'")9 .replace(/'/g, "'");10}11 12function extractMedia(data) {13 const galleryUrls = [];14 const items = data?.gallery_data?.items;15 const meta = data?.media_metadata;16 if (Array.isArray(items) && meta) {17 for (const item of items) {18 const media = item && meta[item.media_id];19 const url = media?.s?.u;20 if (url) galleryUrls.push(decodeHtml(url));21 }22 }23 return {24 postHint: data?.post_hint || '',25 outboundUrl: data?.url_overridden_by_dest || '',26 previewImageUrl: decodeHtml(data?.preview?.images?.[0]?.source?.url || ''),27 galleryUrls,28 };29}30 31if (!/(^|\.)reddit\.com$/i.test(location.hostname)) {32 throw new Error('请先在 reddit.com 页面执行该脚本');33}34 35const query = String(params?.query || '').trim();36if (!query) throw new Error('缺少 params.query');37 38const subreddit = String(params?.subreddit || '').replace(/^r\//i, '').trim();39const sort = String(params?.sort || 'relevance').trim();40const time = String(params?.time || 'all').trim();41const limit = Math.max(1, Math.min(Number(params?.limit || 15), 50));42const basePath = subreddit ? `/r/${encodeURIComponent(subreddit)}/search.json` : '/search.json';43const searchParams = new URLSearchParams({44 q: query,45 sort,46 t: time,47 limit: String(limit),48 restrict_sr: subreddit ? 'on' : 'off',49 raw_json: '1',50});51 52const response = await fetch(`${basePath}?${searchParams}`, { credentials: 'include' });53if (!response.ok) {54 throw new Error(`Reddit search failed: HTTP ${response.status}`);55}56 57const payload = await response.json();58return (payload?.data?.children || []).slice(0, limit).map((child, index) => {59 const data = child.data || {};60 return {61 rank: index + 1,62 id: data.id,63 title: data.title,64 subreddit: data.subreddit_name_prefixed,65 author: data.author,66 score: data.score,67 comments: data.num_comments,68 url: data.permalink ? `https://www.reddit.com${data.permalink}` : '',69 createdUtc: data.created_utc,70 selftext: data.selftext || '',71 ...extractMedia(data),72 };73});