项目需求#
一位创作者经济领域的创始人用法语给我们写信。他发现 OnlyFans 提供给创作者的工具处处都有缺口。他想要一个 Chrome 扩展程序,直接在该网站自己的页面里补上这些缺口,看起来就像网站原生的一部分:实际上就是一个 CRM,为每位客户留下记录。每段对话旁边会有一个面板,显示这位粉丝的消费金额,并附带备注和标签。旁边还会有保存好的话术、提醒和一个表情栏。计划从一位创作者起步,之后再面向经纪公司。
他只说法语。通话时,大家在共享屏幕上开着 Google Translate:一边打英文,另一边出现法文;他的回复则通过 WhatsApp 发过来,再反向粘贴回去。最短的一次通话也持续了一个小时。这件事能成,原因在他。他始终保持乐观,随时愿意换一种思路,也肯给研究留出时间。他不是开发者,但他会动手做东西,他发来的链接都切中眼前的具体问题。
难点:一个没有 API 的网站#
有两件事让这款产品很难做。每个功能都建立在另一家公司的界面之上,所以对方每发布一次改动,我们就得跟着改一次。而且这个网站没有 API,官方的和第三方的都没有。Saif Pasha 搜遍了 GitHub、GitLab 等各处,只找到一条线索:一个已有 4 年历史的 Python 仓库,曾经逆向过该网站的 API。它早已失效。
突破口#
正是那个失效仓库的源码指明了方向。Saif 在自己的浏览器里研究该网站的网络请求,发现已登录会话的 token 能访问网站从未展示过的端点。他选择不去弄清网站是如何为请求签名的。签名由网站自己完成。 扩展程序截获页面为已登录用户自行发出的请求,复制其请求头,再把请求重新发一次。较重的工作交给服务器:在服务器上,一个无头浏览器打开创作者本人的会话,在网站加载数据的同时把数据抓取下来。以此为基础,Saif 摸清了整个后端。
我们围绕它构建了什么#
在这个突破口之上,我们的团队构建了扩展程序、一个带登录功能并通过 Stripe 提供付费套餐的 Web 应用,以及为两者供数的同步服务。
第一版同步会为屏幕上的每一位粉丝同时启动一个无头浏览器,大型创作者要等上好几分钟才能看到数据。我们把同步迁到 EC2 上的独立服务器,并让扩展程序直接读取已存储的数据,于是数据立刻就能加载。下一次故障出现在一批新创作者同时注册时:每人一个浏览器,就足以让服务器崩溃。修复办法是一个先进先出队列,按顺序处理创作者,每次 3 位,并每 6 小时刷新一次每位创作者的数据。
成果#
扩展程序在 Chrome Web Store 上架,Web 应用的支付由 Stripe 处理,创始人发来了这样一句话:
Everything seems to be working perfectly
这位创始人拥有了一款能正常运转的产品:它建立在一个没有任何入口的平台上,开发过程中双方甚至没有共同语言。后来,他以可观的利润出售了这款产品。此后,他和 Saif 又一起承接了许多项目。