Python实战:巧用Webhook与SmsForwarder自动化获取短信验证码

张开发
2026/4/12 16:51:14 15 分钟阅读

分享文章

Python实战:巧用Webhook与SmsForwarder自动化获取短信验证码
1. 为什么需要自动化获取短信验证码相信很多朋友都遇到过这样的场景开发一个自动化脚本时卡在了短信验证码登录这一步。手动输入验证码不仅效率低还容易出错。我在做电商爬虫项目时就深有体会——每次登录都要盯着手机等短信复制粘贴验证码一天下来手指都酸了。传统解决方案大致有三种手动输入效率太低使用接码平台成本高且不稳定调用短信API需要企业资质直到我发现SmsForwarderWebhook这个组合才算真正解决了这个问题。这个方案最大的优势是零成本完全使用自己的手机和设备高可靠不依赖第三方服务易扩展可以集成到任何Python项目中实测下来从收到短信到获取验证码整个过程能在0.5秒内完成比人工操作快10倍不止。下面我就把这个经过实战检验的方案完整分享给大家。2. 手机端配置全攻略2.1 准备工作首先需要在安卓手机上安装SmsForwarder短信转发器。这个APP在各大应用商店都能找到如果遇到下载困难也可以去GitHub搜索开源版本。安装完成后需要授权两个关键权限读取短信权限读取电话卡信息权限这里有个小坑要注意部分国产手机系统会限制后台读取短信需要在「设置-应用管理」中手动开启「允许自启动」和「允许后台运行」否则收不到短信时APP可能无法及时响应。2.2 配置Webhook发送通道打开APP后点击右上角的「」号选择「Webhook」类型通道。关键配置项包括参数示例值说明名称MyPythonServer自定义标识请求方式POST必须选择POST请求地址http://192.168.1.100:8888/sms你的Python服务地址Content-Typeapplication/json数据格式重试次数3网络不稳定时建议设置建议开启「包含短信全文」和「包含发送方号码」选项这样后续处理会更灵活。配置完成后可以先点击「测试」按钮确保能连上你的Python服务。2.3 设置转发规则现在我们来创建转发规则点击「规则」页面的「」号规则名称比如验证码转发匹配模式建议选择「正则匹配」正则表达式\d{6}匹配6位数字验证码发送通道选择刚才创建的Webhook通道这里有个实用技巧如果你经常接收某个平台的验证码可以在正则表达式中加入平台关键字比如【美团】.*\d{6}这样能避免转发无关短信。3. Python服务端开发3.1 基础Flask接口我们先搭建一个最简单的接收服务from flask import Flask, request app Flask(__name__) app.route(/sms, methods[POST]) def handle_sms(): data request.json print(f收到短信: {data[msg]}) return {status: success} if __name__ __main__: app.run(host0.0.0.0, port8888)启动服务后用Postman发送测试数据{ msg: 您的验证码是123456, sender: 10690000 }应该能在控制台看到打印的消息。3.2 验证码提取与自动化实际项目中我们需要自动提取验证码。改进后的代码import re from flask import Flask, request app Flask(__name__) def extract_code(text): # 匹配6位数字验证码 match re.search(r\d{6}, text) return match.group() if match else None app.route(/sms, methods[POST]) def handle_sms(): data request.json code extract_code(data[msg]) if code: print(f提取到验证码: {code}) # 这里可以加入自动化操作 # 比如自动填充到网页或返回给主程序 else: print(未检测到验证码) return {status: success, code: code} if __name__ __main__: app.run(host0.0.0.0, port8888)3.3 生产环境优化实际部署时需要考虑几个问题安全性建议添加基础认证from flask_httpauth import HTTPBasicAuth auth HTTPBasicAuth() users {admin: secret} auth.verify_password def verify_password(username, password): return users.get(username) password app.route(/sms, methods[POST]) auth.login_required def handle_sms(): #...多线程处理使用gevent提升并发能力from gevent.pywsgi import WSGIServer if __name__ __main__: server WSGIServer((0.0.0.0, 8888), app) server.serve_forever()日志记录使用logging模块保存历史记录4. 常见问题解决方案4.1 网络连接问题如果手机和Python服务不在同一网络有三种解决方案内网穿透使用花生壳等工具需注册账号云服务器部署最稳定的方案局域网共享电脑开热点给手机我个人的选择是在腾讯云轻量服务器上部署月费不到30元稳定性非常好。4.2 短信延迟问题遇到短信接收延迟时可以检查手机是否开启了省电模式APP是否被系统清理是否开启了短信拦截功能实测在关闭省电模式后短信转发延迟能从10秒降到1秒内。4.3 验证码识别优化对于非标准格式的验证码可以改进提取逻辑def extract_code(text): # 处理验证码123456格式 if 验证码 in text: return text.split(验证码)[1][:6] # 处理【XX】您的验证码是654321格式 match re.search(r】.*?(\d{6}), text) if match: return match.group(1) # 最后尝试纯数字匹配 return re.search(r\d{6}, text).group()5. 进阶应用场景5.1 电商自动化案例我曾经用这个方案实现某电商平台的自动签到触发登录请求通过Webhook接收验证码自动填充并提交表单完成签到领取积分关键代码片段def auto_login(): # 触发登录请求 requests.post(login_url, data{phone: 13800138000}) # 等待验证码 while not latest_code: time.sleep(0.5) # 提交验证码 requests.post(verify_url, data{code: latest_code})5.2 多账号管理通过识别发送方号码可以实现多账号切换sender_mapping { 10690001: account1, 10690002: account2 } app.route(/sms, methods[POST]) def handle_sms(): data request.json account sender_mapping.get(data[sender]) code extract_code(data[msg]) if account and code: save_to_db(account, code)5.3 与企业微信集成将验证码转发到企业微信机器人def send_to_wechat(code): url https://qyapi.weixin.qq.com/cgi-bin/webhook/send?keyyour_key data { msgtype: text, text: { content: f最新验证码{code} } } requests.post(url, jsondata)这个方案我已经稳定使用两年多处理过数十万条验证码短信。最大的体会是技术方案不在复杂而在于可靠和易维护。刚开始可能会遇到各种小问题但按照本文的配置一步步来最终都能稳定运行。

更多文章