影刀RPA 验证码打码平台对接:自动化流程的最后一道坎
作者:林焱
自动化流程遇到验证码是最让人崩溃的。但是验证码不是无解的——有很多打码平台(人工+AI识别)可以帮你过。这篇文章讲怎么在影刀中接入打码平台。
验证码类型分级
| 类型 | 识别难度 | 解决方案 |
|---|---|---|
| 简单数字/字母 | 低 | OCR/tesseract可直接识别 |
| 滑块验证 | 中 | 距离计算+轨迹模拟 |
| 点选验证码 | 高 | 打码平台 |
| 行为验证(极验、网易易盾) | 极高 | 打码平台+轨迹模拟 |
| reCAPTCHA | 最高 | 几乎无解,建议绕道 |
方案一:OCR识别简单验证码
拼多多店群自动化上架方案
importrequestsfromPILimportImageimportpytesseract# 1. 影刀截图验证码元素# 2. Python处理图片img=Image.open("captcha.png")# 灰度化img=img.convert('L')# 二值化img=img.point(lambdax:0ifx<128else255)# OCR识别text=pytesseract.image_to_string(img,config='--psm 7')print(f"识别结果:{text.strip()}")OCR只适用于最原始的验证码(背景干净、字体规整)。现在的网站基本没有这种验证码了。
方案二:对接打码平台(推荐)
以"超级鹰"为例(按次收费,几块钱能识别几百次):
importrequestsimportbase64importhashlibclassChaojiying:def__init__(self,username,password,soft_id):self.username=username self.password=password self.soft_id=soft_id self.base_url="https://upload.chaojiying.net/Upload/Processing.php"defrecognize(self,image_path,code_type=1902):"""识别验证码 code_type: 1902=通用验证码, 9004=坐标题 """withopen(image_path,'rb')asf:image_base64=base64.b64encode(f.read()).decode()data={'user':self.username,'pass2':hashlib.md5(self.password.encode()).hexdigest(),'softid':self.soft_id,'codetype':code_type,'file_base64':image_base64}resp=requests.post(self.base_url,data=data)result=resp.json()ifresult['err_no']==0:returnresult['pic_str']# 识别结果else:returnNone# 使用cj=Chaojiying("你的用户名","你的密码","软件ID")code=cj.recognize("captcha.png")print(f"打码结果:{code}")费用参考:超级鹰1000次约10元。对于自动化的成本来说几乎可以忽略。
滑块验证码处理
fromseleniumimportwebdriverfromselenium.webdriver.common.action_chainsimportActionChainsimporttimedefsolve_slider(driver,slider_selector,track_selector):"""处理滑块验证码(需要先计算缺口距离)"""slider=driver.find_element_by_css_selector(slider_selector)# 1. 计算缺口距离(可以用opencv比对背景图和缺口图)# 这里简化:假设通过打码平台返回了距离distanceresponse=cj.recognize("slider_captcha.png",code_type=9101)distance=float(response.split(',')[0])# 2. 模拟拖动轨迹action=ActionChains(driver)action.click_and_hold(slider).perform()# 模拟人的拖动:先快后慢 + 中途微调track=generate_track(distance)forxintrack:action.move_by_offset(x,random.randint(-2,2))# Y轴加随机抖动action.perform()time.sleep(random.uniform(0.001,0.003))# 超过一点再回来(模拟人拖过头了)action.move_by_offset(random.randint(-5,-2),0).perform()time.sleep(0.1)action.release().perform()defgenerate_track(distance):"""生成拖动轨迹(非匀速,先快后慢)"""track=[]current=0mid=distance*0.7# 减速阈值whilecurrent<distance:ifcurrent<mid:a=random.randint(3,5)# 加速阶段else:a=random.randint(-3,-1)# 减速阶段move=max(a,1)# 最少移动1pxcurrent+=move track.append(move)returntrack踩坑实录
坑1:打码平台响应慢
打码平台是人机结合(大部分靠机器,疑难验证码靠人工),响应时间2-15秒不等。你的影刀流程需要等待(不要设太短超时),并做好超时处理。
TEMU店群如何管理运营?
坑2:滑块轨迹太机械
如果轨迹是匀速直线,反爬系统一眼识破。必须模拟人的拖动特征:加速→匀速→减速→超出→回退→释放。每个阶段的参数都要随机化。
坑3:打码平台的code_type要匹配
每个打码平台有不同的验证码类型编码。数字验证码和坐标点选是不同的code_type。传错了类型,平台返回的结果和你期望的格式不一致。
坑4:极验/腾讯验证码不是滑块那么简单
这类新一代验证码不仅拖滑块,还会采集你拖动过程中的几百个行为特征(鼠标移动轨迹、加速度变化、在页面上的停留时间等)。即使你拖对了位置,如果行为特征不像人,还是过不了。对于极验级别的验证码,最稳妥的方案是绕过(找到不需要验证码的API接口)。
避坑最佳实践
- 优先绕道:找目标网站的移动端API、小程序API,常比PC端验证弱
- 复用Session:同一个Session下的验证会越来越少
- 合理频率:不要触发验证码
- 人工辅助:弹验证码时,影刀暂停并通过通知提醒人工处理
写在最后
验证码是RPA的最大"拦路虎"。我的建议是:能用API就别走浏览器、能保持登录态就别反复登录、能降低频率就别疯狂请求。打码平台是最后的手段,不是首选方案。大多数情况下,你的问题不是"怎么过验证码",而是"为什么触发了验证码"。