影刀RPA问题解决:反爬验证码完全指南——滑块验证与人机验证实战
影刀RPA问题解决反爬验证码完全指南——滑块验证与人机验证实战作者林焱反爬验证码是影刀RPA开发中最大的挑战之一。当你好不容易写好流程运行时却遇到滑块验证、图文验证码、短信验证码甚至人机验证流程就会卡住。本文将深入剖析各类反爬验证码的原理提供完整的应对方案和实战代码。真实报错信息解析报错一流程卡在验证码页面这不是一个标准的报错而是流程卡住不动。表现如下流程执行状态: 运行中 当前指令: 点击元素「登录按钮」 执行时间: 已超过5分钟 页面状态: 显示验证码  错误信息: 无流程卡住这种情况说明流程遇到了验证码但没有处理代码导致卡住。报错二元素被验证码遮罩UIAError: 元素不可交互 元素选择器: //button[idsubmit-btn] 错误信息: Element is obscured by another element 遮罩元素: //div[classcaptcha-overlay]这个报错说明页面上出现了验证码遮罩层导致无法点击目标元素。报错三IP被封禁HTTPError: 403 Forbidden 请求URL: https://www.taobao.com/api/getProducts 错误信息: Your IP has been blocked due to suspicious activity 状态码: 403 响应内容: {error:CAPTCHA_REQUIRED}这个报错说明网站的的反爬系统检测到异常封禁了你的IP。深入剖析常见的反爬验证码类型类型一滑块验证这是目前最常用的验证码类型。用户需要拖动滑块完成拼图。原理网站生成一张拼图 randomly将缺失部分放在原图上用户需要拖动滑块将拼图块移到正确位置网站通过JavaScript监听鼠标轨迹判断是否是人工操作如果轨迹太规律如直线、等速就会判定为机器人识别方法页面上出现滑块组件通常有拖动滑块完成拼图的提示需要人工干预或复杂的模拟人工操作类型二图文验证码拼多多店群自动化上架方案传统的验证码类型显示一张包含扭曲文字或数字的图片用户需要输入图片中的内容。原理网站生成一张包含随机字符的图片对图片进行扭曲、添加噪声、重叠等处理用户需要识别图片中的字符并输入网站比对用户输入和正确答案识别方法页面上出现验证码图片通常有一个输入框让用户输入有看不清换一张的按钮类型三短信验证码很多网站在敏感操作如登录、支付时会要求输入短信验证码。原理网站向用户手机发送一条包含验证码的短信用户需要在页面上输入收到的验证码网站比对用户输入和发送的验证码识别方法页面上出现手机号输入框和验证码输入框有获取验证码的按钮需要查收短信并输入类型四人机验证如reCAPTCHAGoogle的reCAPTCHA是最常见的人机验证系统。原理用户点击我不是机器人的复选框Google会分析用户的行为鼠标移动、点击位置、浏览历史等如果怀疑是机器人会弹出图片识别挑战用户需要选择所有包含特定内容的图片识别方法页面上出现我不是机器人的复选框通常是Google提供的组件可能需要图片识别滑块验证应对方案滑块验证是最难自动化的验证码类型。以下是一些应对方案。方案一使用影刀的「模拟人工操作」功能影刀提供了模拟人工操作的功能可以模拟更自然的鼠标移动轨迹fromxbotimportweb,print,timedefsimulate_human_slider(browser,slider_selector): 模拟人工拖动滑块 注意这需要影刀的高级功能支持 或者使用复杂的JavaScript模拟 # 找到滑块元素sliderbrowser.find(slider_selector)# 获取滑块的位置和大小slider_locationslider.location slider_sizeslider.sizeprint(f滑块位置{slider_location})print(f滑块大小{slider_size})# 计算拖动轨迹模拟人工操作# 人工拖动通常不是直线也不是等速# 这里提供思路具体实现需要复杂算法# 方法1使用影刀的「拖拽」指令并设置「模拟人工」# 在影刀编辑器中# 指令拖拽元素# 目标元素滑块# 拖拽距离X轴 300像素# 选项勾选「模拟人工操作」# 方法2使用JavaScript模拟更复杂js_code function(context, args) { var slider document.querySelector(slider_selector); // 模拟鼠标按下 var mousedownEvent new MouseEvent(mousedown, { view: window, bubbles: true, cancelable: true, clientX: slider.getBoundingClientRect().left 10, clientY: slider.getBoundingClientRect().top 10 }); slider.dispatchEvent(mousedownEvent); // 模拟鼠标移动分阶段模拟加速和减速 // 这里简化处理实际需要更复杂的轨迹算法 for (var i 0; i 100; i) { (function(i) { setTimeout(function() { var mousemoveEvent new MouseEvent(mousemove, { view: window, bubbles: true, cancelable: true, clientX: slider.getBoundingClientRect().left 10 i * 3, clientY: slider.getBoundingClientRect().top 10 Math.random() * 5 }); document.dispatchEvent(mousemoveEvent); }, i * 10); })(i); } // 模拟鼠标松开 setTimeout(function() { var mouseupEvent new MouseEvent(mouseup, { view: window, bubbles: true, cancelable: true, clientX: slider.getBoundingClientRect().left 310, clientY: slider.getBoundingClientRect().top 10 }); document.dispatchEvent(mouseupEvent); }, 1100); return 已模拟拖动滑块; } resultbrowser.execute_javascript(js_code)print(result)# 等待验证完成time.sleep(3)# 检查是否验证成功try:success_indicatorbrowser.find(验证成功提示,timeout5)ifsuccess_indicator:print(滑块验证成功)returnTrueexcept:print(滑块验证可能失败)returnFalsedefmain(args):browserweb.get_active()# 等待滑块出现browser.wait_appear(滑块元素,timeout20)# 尝试模拟人工拖动ifsimulate_human_slider(browser,//div[classslider]):print(可以继续操作了)else:print(滑块验证失败需要人工干预)方案二使用第三方验证码识别服务对于复杂的滑块验证可以使用第三方服务如超级鹰、云打码等importrequestsimportjsondefsolve_slider_captcha(image_path,api_username,api_password): 使用第三方服务识别滑块验证码 注意这需要付费服务且可能违反网站的使用条款 # 这里以超级鹰为例仅为示例实际使用需要申请账号api_urlhttp://upload.chaojiying.com/Upload/Processing.php# 准备请求数据data{user:api_username,pass:api_password,softid:YOUR_SOFT_ID,codetype:9101,# 滑块验证码的类型码}# 上传验证码图片files{userfile:(captcha.jpg,open(image_path,rb))}try:responserequests.post(api_url,datadata,filesfiles)resultjson.loads(response.text)ifresult[err_no]0:# 识别成功返回滑块需要拖动的距离distanceresult[pic_str]print(f识别成功滑块需要拖动{distance}像素)returnint(distance)else:print(f识别失败{result[err_str]})returnNoneexceptExceptionase:print(f请求失败{e})returnNonedefmain(args):# 截图保存验证码图片browserweb.get_active()browser.screenshot(C:/captcha/slider.png)# 使用第三方服务识别distancesolve_slider_captcha(C:/captcha/slider.png,your_username,your_password)ifdistance:# 根据识别结果拖动滑块print(f拖动滑块{distance}像素)# 这里需要结合影刀的拖拽指令注意使用第三方验证码识别服务可能违反网站的使用条款甚至涉及法律风险。请谨慎使用。方案三人工干预最可靠对于无法自动化的验证码最可靠的方法是暂停流程等待人工处理fromxbotimportweb,print,timedefwait_for_human_captcha_solving(browser,check_interval5,max_wait300): 等待人工处理验证码 print(检测到验证码请人工处理...)print(流程已暂停处理完成后将自动继续)start_timetime.time()whiletime.time()-start_timemax_wait:# 检查验证码是否还存在try:captchabrowser.find(验证码容器,timeout1)ifcaptchaandcaptcha.is_displayed():# 验证码还存在继续等待print(f等待人工处理验证码...已等待{int(time.time()-start_time)}秒)time.sleep(check_interval)else:# 验证码已消失说明人工已处理print(验证码已处理继续流程)returnTrueexcept:# 找不到验证码容器可能已经处理完成print(验证码已处理容器消失继续流程)returnTrueprint(等待超时人工未处理验证码)returnFalsedefmain(args):browserweb.get_active()# 检测是否有验证码try:captchabrowser.find(验证码容器,timeout3)ifcaptchaandcaptcha.is_displayed():# 有验证码等待人工处理ifwait_for_human_captcha_solving(browser,max_wait300):# 人工已处理继续操作browser.find(目标元素).click()else:print(超时人工未处理验证码)else:# 没有验证码直接操作browser.find(目标元素).click()except:# 没有验证码直接操作browser.find(目标元素).click()图文验证码应对方案图文验证码相对容易处理可以使用OCR光学字符识别技术。方案一一使用影刀的OCR指令影刀提供了OCR指令可以直接识别图片中的文字指令OCR识别 图片来源截图元素 目标元素验证码图片 识别结果保存到captcha_text然后在代码中读取识别结果fromxbotimportweb,printdefsolve_text_captcha(browser): 使用OCR识别图文验证码 # 截图验证码图片captcha_elementbrowser.find(验证码图片)captcha_element.screenshot(C:/captcha/text_captcha.png)# 使用影刀的OCR指令识别在影刀编辑器中配置# 这里假设你已经在编辑器中使用了「OCR识别」指令# 并将结果保存到了变量 captcha_text# 读取识别结果假设保存到参数中captcha_textargs.get(captcha_text,)print(fOCR识别结果{captcha_text})# 输入验证码browser.find(验证码输入框).send_keys(captcha_text)# 提交browser.find(提交按钮).click()# 检查是否验证成功time.sleep(2)try:error_msgbrowser.find(验证码错误提示,timeout3)iferror_msg:print(验证码错误需要重试)returnFalseexcept:print(验证码正确)returnTruedefmain(args):browserweb.get_active()# 尝试识别验证码最多3次foriinrange(3):print(f第{i1}次尝试识别验证码)ifsolve_text_captcha(browser):print(验证码识别成功)breakelse:# 刷新验证码browser.find(刷新验证码按钮).click()time.sleep(1)方案二使用Python的OCR库如果需要更强大的OCR功能可以在影刀中使用Python的OCR库如pytesseractfromxbotimportweb,printimportpytesseractfromPILimportImagedefsolve_captcha_with_tesseract(image_path): 使用Tesseract OCR识别验证码 try:# 读取图片imageImage.open(image_path)# 预处理图片提高识别率# 转为灰度图imageimage.convert(L)# 二值化黑白化threshold127table[]foriinrange(256):ifithreshold:table.append(0)else:table.append(1)imageimage.point(table,1)# 识别captcha_textpytesseract.image_to_string(image,config--psm 7 -c tessedit_char_whitelist0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ)# 清理识别结果去除空格和换行captcha_textcaptcha_text.strip().replace( ,)print(fTesseract识别结果{captcha_text})returncaptcha_textexceptExceptionase:print(fOCR识别失败{e})returndefmain(args):browserweb.get_active()# 截图验证码captcha_elementbrowser.find(验证码图片)captcha_element.screenshot(C:/captcha/text_captcha.png)# 使用Tesseract识别captcha_textsolve_captcha_with_tesseract(C:/captcha/text_captcha.png)ifcaptcha_text:# 输入验证码browser.find(验证码输入框).send_keys(captcha_text)# 提交browser.find(提交按钮).click()注意Tesseract对扭曲严重的验证码识别率不高。可以考虑使用更专业的OCR服务如百度OCR、腾讯OCR等。短信验证码应对方案短信验证码需要接收短信并输入这通常需要人工干预或接入短信接收服务。方案一一人工接收并输入fromxbotimportweb,print,timedefwait_for_sms_code(browser,phone_number,max_wait120): 等待人工接收短信验证码并输入 print(f已向{phone_number}发送短信验证码)print(请查收短信并输入验证码...)# 等待用户手动输入验证码# 这里可以提供一个输入框让用户输入# 或者通过读取特定文件、数据库来获取验证码# 方法1暂停流程等待用户输入在影刀中使用「暂停」指令# 在影刀编辑器中# 指令暂停# 提示信息请输入短信验证码# 用户输入后保存到sms_code# 方法2轮询检查用户输入假设用户会输入到某个文件或数据库start_timetime.time()whiletime.time()-start_timemax_wait:# 检查用户是否已经输入验证码假设保存到了文件try:withopen(C:/temp/sms_code.txt,r)asf:sms_codef.read().strip()ifsms_code:print(f已获取短信验证码{sms_code})# 输入验证码browser.find(验证码输入框).send_keys(sms_code)# 提交browser.find(提交按钮).click()# 清理临时文件os.remove(C:/temp/sms_code.txt)returnTrueexcept:passtime.sleep(2)print(等待超时未获取到短信验证码)returnFalsedefmain(args):browserweb.get_active()# 输入手机号phone_number13800138000browser.find(手机号输入框).send_keys(phone_number)# 点击获取验证码browser.find(获取验证码按钮).click()# 等待并输入短信验证码ifwait_for_sms_code(browser,phone_number,max_wait120):print(短信验证码已输入继续操作)else:print(获取短信验证码失败)方案二使用短信接收服务TEMU店群如何管理运营有一些在线服务可以接收短信验证码如短信猫、云短信等但需要注意这些服务通常是付费的可能涉及隐私和安全问题很多网站会检测并使用这些服务导致验证失败这里不提供具体实现因为涉及第三方服务且可能存在合规问题。人机验证reCAPTCHA应对方案Google的reCAPTCHA是最常见的人机验证系统很难完全自动化。方案一一使用reCAPTCHA破解服务有一些服务专门提供reCAPTCHA破解如2Captcha、Anti-Captcha等但同样需要注意合规问题。方案二避免触发reCAPTCHA最好的方法是避免触发reCAPTCHA。以下是一些建议降低访问频率不要短时间内发送大量请求使用代理IP轮换IP地址模拟人工操作随机等待时间、模拟鼠标移动使用Cookie保持登录状态访问公开的API如果网站提供API优先使用APIfromxbotimportweb,print,timeimportrandomdefsimulate_human_behavior(browser): 模拟人工操作避免触发reCAPTCHA # 随机等待wait_timerandom.uniform(1,3)print(f随机等待{wait_time:.2f}秒)time.sleep(wait_time)# 模拟鼠标移动使用JavaScriptjs_code function(context, args) { // 模拟鼠标移动到随机位置 var x Math.random() * window.innerWidth; var y Math.random() * window.innerHeight; var mousemoveEvent new MouseEvent(mousemove, { view: window, bubbles: true, cancelable: true, clientX: x, clientY: y }); document.dispatchEvent(mousemoveEvent); return 已模拟鼠标移动; } browser.execute_javascript(js_code)# 滚动页面模拟阅读scroll_amountrandom.randint(100,500)print(f滚动页面{scroll_amount}像素)browser.scroll_to(locationpoint,topscroll_amount,behaviorsmooth)time.sleep(random.uniform(0.5,1.5))defmain(args):browserweb.get_active()# 在每次操作前模拟人工行为simulate_human_behavior(browser)# 点击元素browser.find(目标元素).click()# 再次模拟人工行为simulate_human_behavior(browser)# 继续操作browser.find(下一个元素).click()IP被封禁的应对方案如果IP被封禁需要采取措施解除或规避。方案一一使用代理IPfromxbotimportweb,printdefopen_page_with_proxy(url,proxy_address): 使用代理IP打开网页 注意这需要影刀支持代理设置 或者通过使用浏览器插件实现 # 方法1在影刀中配置代理在「打开浏览器」指令中设置# 在影刀编辑器中# 指令打开浏览器# 浏览器类型Chrome# 代理设置SOCKS5 127.0.0.1:1080# 方法2使用浏览器命令行参数# Chrome支持通过命令行参数设置代理# 这需要在影刀中配置浏览器启动参数print(f使用代理{proxy_address}打开网页{url})browserweb.open(url)returnbrowserdefmain(args):# 使用代理IPproxySOCKS5 127.0.0.1:1080browseropen_page_with_proxy(https://www.taobao.com,proxy)# 继续操作browser.find(目标元素).click()方案二等待IP解封有些网站会在一定时间后自动解封IPfromxbotimportweb,print,timedefwait_for_ip_unblock(url,check_interval300,max_wait3600): 等待IP解封 print(fIP可能被封禁等待解封...)start_timetime.time()whiletime.time()-start_timemax_wait:try:# 尝试访问网站browserweb.open(url,load_timeout10)# 检查是否被封禁page_contentbrowser.get_html()ifblockedinpage_content.lower()or403inpage_content:print(fIP仍被封禁{check_interval}秒后重试...)browser.close()time.sleep(check_interval)else:print(IP已解封)returnbrowserexceptExceptionase:print(f访问失败{e})print(f{check_interval}秒后重试...)time.sleep(check_interval)print(等待超时IP未解封)returnNonedefmain(args):urlhttps://www.taobao.com# 等待IP解封browserwait_for_ip_unblock(url,check_interval300,max_wait3600)ifbrowser:# 继续操作browser.find(目标元素).click()else:print(无法访问网站)总结反爬验证码是影刀RPA开发中的最大挑战。虽然有一些技术方案可以尝试但最重要的是尊重网站的规则不要恶意爬取数据使用官方API如果网站提供API优先使用降低访问频率避免给服务器造成压力准备人工干预对于无法自动化的验证码准备人工处理流程使用代理和Cookie提高访问成功率记住完全自动化的验证码破解可能违反网站的使用条款甚至涉及法律风险。在实际应用中请务必谨慎并遵守相关规定。内容标签影刀RPA 反爬验证码 滑块验证 图文验证码 短信验证码 人机验证 IP封禁 OCR识别作者林焱