我把 16 个银行和支付门户的登录流程全自动化了
最近在帮公司处理财务对账流程,发现运营团队每天都要手动登录 16 个不同的银行和支付聚合商后台,下载流水、核对报表,然后发邮件。这活儿不仅枯燥,而且一旦遇到验证码或者短信验证码(OTP),人工介入的成本就极高,完全没法规模化。
目前这套架构用 Playwright 驱动 headless Chromium,配合 FastAPI 做调度,新接入一个银行门户的时间已经从原来的几周缩短到了几天。
下一篇
Jio 要搞印度史上最大的 IPO 了,这事儿对开发者到底意味着什么 →
我决定干脆写一套无人值守的自动化 Bot 矩阵,把「登录 -> 下载 -> 校验 -> 发送」这套流程彻底跑通。从最初的 6 个集成扩展到现在的 16 个,我发现核心不在于写多少个爬虫,而在于如何解决那几个「非技术性」的硬骨头。
解决 OTP 短信验证码的骚操作
搞无人值守自动化,最大的拦路虎就是短信验证码。我没用那些收费且不稳定的第三方接码平台,而是自己搞了一套 OTP Relay(验证码中继)方案:
1. 硬件层: 准备一台安卓手机,插上实名注册的 SIM 卡,装个简单的 App 监听短信。
2. 传输层: App 识别到特定发件人的短信后,通过安全隧道转发给我的 FastAPI 后端。
3. 处理层: 后端用正则提取验证码,存入一个本地的 Spool(暂存区)。
4. 消费层: Playwright 脚本在登录到验证码环节时,去后端轮询最新的验证码,填入后立即标记为已消费。
为了安全,我设计了一个严格的逻辑:验证码只在内存里流转,后端只绑定在 loopback 接口,绝不落地存储原始短信内容,防止敏感信息泄露。
# 简化版的验证码轮询逻辑
def get_fresh_otp(login_started_at: float, timeout_s: int = 60) -> str | None:
deadline = time.monotonic() + timeout_s
while time.monotonic() < deadline:
# 检查暂存区是否有匹配当前登录时间戳的验证码
otp = spool.get_latest_otp(after_timestamp=login_started_at)
if otp:
spool.mark_consumed(otp.id)
return otp
time.sleep(1)
return None别迷信单一的验证码破解工具
很多同学觉得验证码不就是搞个 OCR 吗?在处理银行这类高风险网站时,验证码搞错了不仅是失败,还可能导致账号被封禁。所以我做了一个 CAPTCHA Toolkit,根据不同门户的防御等级切换策略:
- DOM 文本读取: 很多所谓的验证码其实是直接渲染在 DOM 里的文本,这种直接读标签最稳,属于确定性逻辑。
- 图像 OCR: 对于纯图片验证码,截图后跑 OCR,但必须设置严格的重试上限。
- 音频转文字: 这是个“降维打击”的方案。如果图片验证码太变态,我会直接触发无障碍模式,调用 Whisper 模型去识别音频验证码,这比纯图像识别的成功率高得多。
目前这套架构用 Playwright 驱动 headless Chromium,配合 FastAPI 做调度,新接入一个银行门户的时间已经从原来的几周缩短到了几天。
免费 AI 工具箱 · 全部完全免费
各类AI落地变现的详细拆解见AI赚钱方法实操指南,有不少直接可参考的案例。