我如何在没有云基础设施的情况下构建本地优先的 Reddit 工具

发布: (2025年12月16日 GMT+8 10:15)
7 min read
原文: Dev.to

Source: Dev.to

好的,这听起来可能有点倒退。但请听我说。

我花了两周时间构建了一个基于云的 Reddit 抓取工具——包括身份验证、Postgres,整个系统——随后把它全部丢掉,重新开始做一个零云基础设施的桌面应用。这是我在这个项目中做出的最佳决定。原因如下。

云版本不断被阻止

我正在构建一个名为 Reddit Toolbox 的工具。它会抓取 subreddit 并根据评论数量过滤帖子,对 Reddit 营销或研究非常有用。

最初的版本是一个 Web 应用:Next.js 前端,Python 后端部署在 VPS 上,使用 Supabase 进行身份验证和数据存储。然而,Reddit 对服务器请求非常敏感。我的 VPS IP 在测试不到五分钟内就被标记。即使使用轮换代理、住宅 IP 和限流也无法可靠地解决问题。每次我以为已经解决,Reddit 就更新检测机制,我又回到原点。用户不断问“为什么会被阻止?”而我没有好的答案。

我一直忽视的显而易见的解决方案

一位朋友建议:“为什么不直接在用户的机器上运行呢?”我担心分发、手动更新、缺乏使用跟踪以及盈利模式。但事实依旧:如果应用从家庭 IP 运行,Reddit 看到的就是普通的浏览者。没有代理技巧,也没有与检测的猫捉老鼠游戏——就是这么好用。

我重建的内容

我抛弃了 Web 技术栈,重新使用 Python + PyQt6 开发。

# core of the scraper – embarrassingly simple
import requests
import sqlite3

def scrape_subreddit(name, limit=100):
    url = f"https://reddit.com/r/{name}.json?limit={limit}"

    # Just a GET request from the user's IP.
    response = requests.get(url, headers={
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)'
    })

    if response.status_code == 200:
        return response.json()['data']['children']
    else:
        # Fallback to RSS if JSON is blocked
        return scrape_via_rss(name)

RSS 备选方案很重要——有时 Reddit 会阻止某些模式的 JSON API,但仍然开放 RSS,所以工具几乎不会完全失效。

对于数据存储,我使用 SQLite——一个与应用程序同目录的单文件。用户只需复制该文件即可备份。没有数据库服务器,没有连接字符串,也不需要在凌晨 2 点调试 “我的数据库跑起来了吗?”。

让我害怕的部分:如何赚钱

使用 Web 应用时,将功能放在身份验证之后非常容易。使用桌面应用时,用户可以下载二进制文件、破解、打补丁或分享它。我花了太多时间思考 DRM,随后意识到那些会破解每月 15 美元工具的人本来就不会付费。于是我选择了一个简单的方案:

  • 应用在每个会话开始时向服务器“打电话”,通过一次快速的 Supabase API 调用检查订阅状态。
  • 如果用户离线或阻止了该请求,应用仍然可以运行——默认使用免费层限制(每天 15 次抓取)。

有人能绕过吗?可以。我要在意吗?并不真的在意。付费客户很满意,而其余的人本来也不可能成为付费客户。

Trade‑offs I accepted

  • 不跨设备同步。 数据保存在单台机器上;若要在另一台设备使用,需要导出/导入。稍有不便,但大多数用户只在单机上工作。
  • 手动更新。 我正在开发自动更新器,但目前用户需要自行下载新版本。有反馈表明,人们其实更喜欢明确知道软件何时更改。
  • 零遥测。 我对用户如何使用该应用没有任何洞察。以后可能会加入自愿的分析功能,但目前不被仪表盘淹没也挺好的。

几周后的结果

  • 零阻塞相关的支持工单。 网页版每天都会产生工单;本地版则没有。
  • 应用大小约为 50 MB。 Electron 版大约会超过 150 MB。PyQt6 感觉原生且轻量。
  • 用户反馈积极。 用户欣赏其简洁——无需注册。有人在邮件中说:“终于有一个在我尝试之前不要求提供邮箱的工具。”这让我这周很开心。

何时采用本地优先

本地优先并不适用于所有场景。你仍然需要服务器来处理:

  • 实时协作
  • 在设备之间同步的移动应用
  • 任何带有社交功能的应用

但对于只面向单用户、并调用外部 API 的生产力工具——尤其是那些积极防止爬虫的 API——本地优先可以消除不必要的云端复杂性。

如果想看看我构建的示例,它叫 Reddit Toolbox。搜索 “Reddit Toolbox wappkit” 或访问 wappkit.com。提供免费层。

欢迎就 PyQt、架构或我为何现在讨厌代理等问题进行提问。

Back to Blog

相关文章

阅读更多 »