Blog/开发者工具/

Reddit 公开数据 API:社区、帖子、用户与搜索 | SandBase

用一个 REST API 读取 Reddit 公开的社区、帖子、评论、用户资料和搜索。无需 Reddit OAuth 应用,无需 PRAW,一把 SandBase key,为 agent 而建。

深色电影质感画面:Reddit 社区、帖子和评论数据经由单一 API 通道汇入 agent 核心

Reddit 是互联网上最丰富的公开讨论数据集之一——上百万个社区、层层嵌套的评论,还有直接对应到情感分析、社区调研和趋势发现的 karma 信号。但想用程序拿到这些数据,通常得先注册一个 Reddit OAuth 应用、学 PRAW、处理 token 刷新和每个应用的速率限制,才能读到第一条帖子。

SandBase 的 Reddit 公开数据 API 把这套搭建成本收敛成一个 REST 约定。它通过普通端点读取公开的社区、帖子、评论、用户资料和搜索结果——一把 SandBase API key、同步返回 JSON,不用 Reddit OAuth 应用,也不用客户端库。下面的示例用的是 subreddit-info 端点请求 r/programming;请把其中的字段名和数值当作示例结构,以一份真实响应为准核对具体 schema。

这不是 Reddit 官方的 Data API。 如果你需要已认证的成员操作、发帖、版务管理,或一份授权的高量级数据协议,请用 Reddit 官方 API;当你的流程需要的是公开、只读的社区数据(调研、监测或补全)时,用 SandBase。想直接试?领取 SandBase API key,再浏览 Reddit 端点。

先说结论

  • 一个 API 读取 Reddit 公开的社区、帖子、评论、用户资料和搜索。
  • 本文的 Model API 端点用 POST /v1/api/reddit/<path> 调用——只传该端点的参数,不用客户端库,一把 SANDBASE_API_KEY。
  • 端点以自然标识为入参(subreddit_name、username、post_id),或用搜索关键词 keyword(query)。
  • 它只返回公开、只读数据。不能发帖、不能投票、没有 Reddit OAuth 应用、也没有版务操作;鉴权用 SandBase API key。

你到底需要哪个 Reddit API?

你的需求选择原因
发帖、投票、管理版务,或以已认证成员身份操作Reddit 官方 API带 OAuth 权限的成员和版务操作。
读取公开的社区、帖子、评论、用户或搜索SandBase Reddit 公开数据 API普通 REST、一把 SandBase key、面向只读流程的结构化 JSON。
授权的批量数据或商业数据协议Reddit 的数据授权大规模商业访问由 Reddit 直接处理。

从 Reddit API 能拿到什么

整个目录建立在一个 app 面上,提供单资源读取和信息流。按用途归类:

  • 社区 —— 社区信息(订阅数、描述、类型)和社区信息流。
  • 帖子 —— 帖子详情、批量帖子查询,以及带层级的帖子评论。
  • 评论 —— 评论回复和单帖评论树。
  • 用户 —— 公开用户资料、他们的帖子、评论、奖杯和活跃社区。
  • 搜索与发现 —— 动态搜索、输入联想、热门搜索,以及话题/新闻信息流。

并非列出的每一项能力都已开放直接调用——我测试时有几个信息流端点返回了上游错误——所以动手前请以每个端点的在线 API 参考为准。

SandBase Reddit API 页面:描述、能力标签和 Reddit 端点列表 SandBase 上的 Reddit API 页面——带标签的概览,加上端点列表,每个端点标有路径。

Reddit 提供的 vs. SandBase 补上的

公开数据来自 Reddit。SandBase 并不拥有或运营 Reddit,它只是为符合条件的公开数据流程提供一个统一的 API 层。每一项能力变成一个稳定端点,鉴权收敛成一把 key,响应都是可预期的 JSON——于是 agent 可以沿着同一套约定串起”查一个社区 → 读它的热门帖 → 拉某个帖子的评论”,而不用再纠缠 OAuth 权限和客户端库。

快速上手:第一次调用

SandBase 有不止一个 API 面。目录里可能会展示 /apis/v1/... 下的 GET 路径;本文用的是每个端点 API 参考里带厂商前缀的 Model API 路径。不要替换 HTTP 方法或 URL——按你所选端点的参考文档来。

按名称读取一个公开社区:

import os
import requests

resp = requests.post(
    "https://api.sandbase.ai/v1/api/reddit/app/subreddit-info",
    headers={
        "Authorization": f"Bearer {os.environ['SANDBASE_API_KEY']}",
        "Content-Type": "application/json",
    },
    json={"subreddit_name": "programming"},
)
resp.raise_for_status()
body = resp.json()
if body.get("status") != "completed":
    error = body.get("error", {})
    raise RuntimeError(error.get("message", "Reddit request did not complete"))

# 下面的字段名是示例结构,不是保证的 schema——
# 用防御式 .get() 访问,并以一份真实响应为准核对真实路径。
info = body["outputs"][0]["data"].get("subredditInfoByName", {})
print(info.get("name"), info.get("subscribersCount"), info.get("type"))
curl -X POST https://api.sandbase.ai/v1/api/reddit/app/subreddit-info \
  -H "Authorization: Bearer $SANDBASE_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"subreddit_name": "programming"}'

数据端点跑在 sync 模式下,所以返回的 JSON 就是结果,不用轮询。每个响应都用同一个信封:一个 id、一个 status(成功时为 completed)、model 名称,以及一个 outputs 数组,其中唯一一项在 data 下携带载荷。下面是一个社区读取的示例响应结构——端点参考只保证信封,所以请把其中的字段名和数值当作示例结构、而非保证的 schema,并以一份真实响应为准核对具体字段(载荷会变化,数值也会随时间变):

{
  "id": "72ec0904-e8a3-433d-b776-9f8bf7f8217c",
  "status": "completed",
  "model": "reddit/app/subreddit-info",
  "outputs": [
    {
      "data": {
        "subredditInfoByName": {
          "name": "programming",
          "title": "programming",
          "id": "t5_2fwo",
          "type": "PUBLIC",
          "subscribersCount": 6922588,
          "publicDescriptionText": "Computer Programming"
        }
      }
    }
  ]
}

failed 或 timeout 的请求会带上 error 而没有 outputs,所以读 outputs[0].data 之前先判 status。不同端点的响应结构不一样——先看一份真实响应,再按端点逐一对准字段路径。注意 Reddit 的响应经常把载荷嵌在一个命名键下(这里是 subredditInfoByName)。

SandBase 上某个 Reddit 端点的 API 参考,展示带厂商前缀的 URL、参数和响应 schema 端点的 API 参考是每个参数名和响应路径的权威来源。

能力地图

能力簇代表端点典型用途
社区信息reddit/app/subreddit-info按名称查社区规模和元数据
用户资料reddit/app/user-profile公开用户 karma 和账号信号
帖子详情reddit/app/post-details按 id 读取单条帖子
帖子评论reddit/app/post-comments评论树与情感分析
搜索reddit/app/dynamic-search话题与关键词发现

分页方式因端点而异——很多 app 端点用 after 游标指向下一页。在 post-comments 上,after 是下一页游标,sort_type 是一个独立的可选排序控制(不属于分页)。具体看每个端点的 schema。

SandBase Reddit user-profile API 参考,展示 username 参数和响应 schema user-profile 的 API 参考——路由、username 参数和响应 schema。

在 agent 工作流里串联调用

因为每个端点共用同一套鉴权和同一个响应信封,agent 可以从一个社区走到一个帖子,而不用为每个页面单独写特例。一个常见的社区调研模式是这样:

  1. 解析社区。 用社区名调 reddit/app/subreddit-info,读出 subscribersCount、type、id——社区基线。
  2. 读取帖子。 用 post_id 调 reddit/app/post-details,再调 reddit/app/post-comments 拉评论树,用 after 游标翻页。
  3. 补全作者。 用 username 调 reddit/app/user-profile,附上 karma 和账号上下文。

每一步都返回同样的 { id, status, model, outputs } 结构,所以你的 agent 只需判一次 status,读 JSON 的那段代码在每一步都能复用。

常见用例

用 Reddit 社区 API 做社区规模评估

用 reddit/app/subreddit-info 解析一个社区,读 subscribersCount、type、publicDescriptionText,给社区做规模评估和分类。输入:社区名。输出:结构化的社区记录。端点:subreddit-info。

用 Reddit 用户 API 做作者调研

用 reddit/app/user-profile 读取公开用户,拿到 karma 明细和账号标记。输入:用户名。输出:结构化的用户记录。端点:user-profile。

用 Reddit 搜索 API 做话题发现

用 reddit/app/dynamic-search 加一个 query——它是搜索关键词,不是资源标识符——围绕某话题挖出相关帖子和社区,再翻页。输入:搜索关键词。输出:匹配的帖子和社区。端点:dynamic-search。完整工作流看如何监测一个 Reddit 社区。

边界与限制

  • 只读、公开数据。 不能发帖、投票、管理版务,也不能做需成员授权的操作。
  • 速率与量级。 把响应当作尽力而为的读取;遇到 HTTP 429 用退避重试。
  • 参数与结构随上游而定。 载荷经常嵌在一个命名键下(比如 subredditInfoByName、redditorInfoByName)。先看真实响应、读 schema。
  • 并非所有列出的端点都已可调用。 测试时有几个信息流端点返回了上游错误;在依赖某个具体端点之前,先对照在线 API 参考确认。
  • 这不是 Reddit 官方合作。 SandBase 只是提供对公开数据的统一访问;请遵守 Reddit 的条款以及你使用场景下适用的规则,包括任何商用限制。

常见问题

我需要 Reddit 开发者应用或 OAuth 吗? 不需要。你用 SANDBASE_API_KEY 向 SandBase 鉴权。这些读取端点不需要你注册 Reddit 应用、管理 OAuth token 或安装 PRAW。

用什么来标识社区、用户或帖子? 用自然标识:subreddit_name、username 和 post_id。搜索用 query。

分页怎么做? 多数 app 端点用响应里返回的 after 游标翻下一页。在 post-comments 上,after 是下一页游标,sort_type 是一个独立的可选排序控制(不负责分页)。具体看每个端点的 schema。

能读私密社区或仅成员可见的数据吗? 不能。这个 API 只返回公开数据。私密社区、私信和需成员授权的数据都不在范围内。

从一个社区请求开始

创建一把 SandBase API key,用 subreddit-info 请求一个公开社区,先看清返回的 schema,再扩展到帖子、评论、用户或搜索。准备好之后: