灵猴市集Linghou Market

Reddit 搜索结果提取

Redditreddit-search-results

用途 在 Reddit 页面内搜索帖子,并返回标题、作者、分区、分数、评论数、链接和媒体预览信息。 执行前提 先打开 https://www.reddit.com/ 或任意 reddit.com 页面。 如果 Reddit 返回风控、登录墙或 403,请先在浏览器里完成验证后再执行。 参数 通过 lh exec evaluate --command-slu…

搜索帖子
版本1.0.0
扫描passed
更新2026-06-28
超时30000ms

匹配范围

*://*.reddit.com/*

排除范围

未声明

能力声明

dom.readnetwork.fetch

代码

源码已展开
1function decodeHtml(value) {2  if (typeof value !== 'string' || !value) return '';3  return value4    .replace(/&amp;/g, '&')5    .replace(/&lt;/g, '<')6    .replace(/&gt;/g, '>')7    .replace(/&quot;/g, '"')8    .replace(/&#x27;/gi, "'")9    .replace(/&#39;/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});