首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >搞定滑块和验证码

搞定滑块和验证码

原创
作者头像
无情剑客
发布于 2022-03-28 07:21:53
发布于 2022-03-28 07:21:53
3.1K10
代码可运行
举报
文章被收录于专栏:Android逆向Android逆向
运行总次数:0
代码可运行

Frida可视化工具Dwarf2[1]已经开源,大家有什么问题,可以一起交流。

本文内容仅用于学习,严禁用作非法目的。

验证码

作用

验证码作为一种人机识别手段,其终极目的,就是区分正常人和机器的操作。 区分人机行为的作用不言而喻。互联行为的注册、登录、发帖、领优惠券、投票等等应用场景,都有被机器刷造成各类损失的风险,如果不对各类机器垃圾的行为加以防范,灌水内容、垃圾注册、恶意登录、刷票、撞库、活动作弊、垃圾广告、爬虫、羊毛党等用户行为一旦发生,将对产品自身发展、用户体验造成极大的影响。

搞定验证码

很多网站都使用了验证码进行人机识别,给爬虫带来了一定的困扰。常见的验证码如下:

trwebocr

一个开源的ocr工具,非常强大。官方介绍是: 开源易用的中文离线OCR,识别率媲美大厂,并且提供了易用的web页面及web的接口,方便人类日常工作使用或者其他程序来调用~ 。笔者在github[2]上有关于它的使用。

通过一个例子来感受一下这个工具。以下是我2022虎年快乐这个公众号里面部分内容的截图:

trwebocr的识别结果:

所有的文字都被识别出来了!还是非常nice的。

过验证码

有这么强大的工具,过验证码岂不是轻而易举。验证码的图片如下:

直接上代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import requests;

def main():
    url = 'http://127.0.0.1:8089/api/tr-run/'
    img1_file = {
        'file': open("./imgs/yzm.jpg", 'rb')
    }
    res = requests.post(url=url, data={'compress': 0}, files=img1_file)
    jsonObj = res.json()
    if jsonObj['code'] != 200:
        return
    raw_out = jsonObj['data']['raw_out']
    target_len = len(raw_out)
    for i in range(target_len):
        print(raw_out[i][1])

if __name__ == "__main__":
    main()

JWYN被成功识别出来。大功告成!!!!!!!

python安装模块的时候建议使用豆瓣源,真的好快。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
pip install requests  -i https://pypi.douban.com/simple/

缺陷

trwebocr的准确率达不到100%,不过依然不能掩盖它强大的OCR功能。当然也可以自己实现类似的功能,使用opencv+CNN效果也不错。

滑块

滑块验证码是在网站、APP等应用中常见的一种验证方式,通过按照一定规则滑动滑块到指定位置完成验证,才可以进行下一步操作。滑块验证码有两种设计,一种是在滑动框内“一滑到底”即完成验证的,还有一种是滑动滑块拼合拼图完成验证的,如下图所示。由于拼图式的滑块验证码安全性更高,趣味性更强,“一滑到底”式的滑块验证码已经基本被淘汰。

搞定滑块

使用滑块机制的网站也有好多,增大了爬虫的难度,常见的滑块验证:

获取图片

滑块验证第一步需要获取大图片,后面统称为target,以及小图片,后面称为template。具体可参见自动登陆QQ空间(3)。 (1) 如果target和template都可以正常下载的话,直接进行下载。 (2 ) 如果不能下载的话,可以使用两种方式进行获取:

第一种方式是使用chromeDriver的截图功能

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def get_imgs():
    driver.save_screenshot('imgs/screenshot.png')
    bigImage = driver.find_element_by_id('bigImage')
    left = (int)(bigImage.location['x'])
    top = (int)(bigImage.location['y'])
    elementWidth = (int)(bigImage.location['x'] + bigImage.size['width'])
    elementHeight = (int)(bigImage.location['y'] + bigImage.size['height'])
    picture = Image.open('imgs/screenshot.png')
    picture = picture.crop((left, top, elementWidth, elementHeight))
    picture.save('imgs/big_full.png')
    smallImage = driver.find_element_by_id('smallImage')
    left = (int)(smallImage.location['x'])
    top = (int)(smallImage.location['y'])
    elementWidth = (int)(smallImage.location['x'] + smallImage.size['width'])
    elementHeight = (int)(smallImage.location['y'] + smallImage.size['height'])
    picture = Image.open('imgs/screenshot.png')
    picture = picture.crop((left, top, elementWidth, elementHeight))
    picture.save('imgs/small.png')
    jigimgS = driver.find_element_by_class_name('jigimgS')
    upper = (int)(jigimgS.value_of_css_property("top").split('px')[0])
    letf = 58
    right = 279
    lower = upper + 57
    picture = Image.open('imgs/big_full.png')
    picture = picture.crop((letf, upper, right, lower))
    picture.save('imgs/big.png')
    time.sleep(0.5)

第二种方式是使用代理截获相应下载图片: 笔者使用的代理框架是Titanium[3](C#)框架。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
proxyServer.BeforeResponse += OnResponse;
. . .
private async Task OnResponse(object sender, SessionEventArgs e)
{
    // read response headers
    var responseHeaders = e.HttpClient.Response.Headers;

    //if (!e.ProxySession.Request.Host.Equals("medeczane.sgk.gov.tr")) return;
    if (e.HttpClient.Request.Method == "GET" || e.HttpClient.Request.Method == "POST")
    {

        if (e.HttpClient.Response.StatusCode == 200)
        {
            string stringResponse = await e.GetResponseBodyAsString();
            Console.WriteLine(e.HttpClient.Request.RequestUri.AbsoluteUri);
            if ("http://***/jigsaw".Equals(e.HttpClient.Request.Url))
            {
                //exit的时候会走第二次。 在exit之前调用StopProxyServer,防止出现第二次走这个方法的情况。
                if (!exit)
                {
                        //截获响应下载图片,此时图片尚未删除
                    SaveImage(stringResponse);
                }
        }
    }

    if (e.UserData != null)
    {
        // access request from UserData property where we stored it in RequestHandler
        var request = (Request)e.UserData;
    }
}

private void SaveImage(String stringResponse)
{
    var jo = JsonConvert.DeserializeObject(stringResponse) as JObject;
    template = jo?["smallImage"]?.ToString();
    target = jo?["bigImage"]?.ToString();
    template = "http://***/upload/jigsawImg/" + template + ".png";
    target = "http://***/upload/jigsawImg/" + target + ".png";

    WebClient client = new();
    //不加锁的话只能下载第一个图片,然后就去匹配去了,由于第二个图片还没有下载下来,导致匹配的时候报错。
    Monitor.Enter(this);
    client.DownloadFile(target, AppDomain.CurrentDomain.BaseDirectory + "\\target.png");
    client.DownloadFile(template, AppDomain.CurrentDomain.BaseDirectory + "\\template.png");
    Console.WriteLine("Finish download image ");
    Monitor.Exit(this);
}

图片不能下载却可以显示出来使用到技术是img的onload属性,onload 事件在图片加载完成后立即执行。下面的代码就是当图片加载完成后立即删除

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<div class="jigimgB">
    <img src="" id="bigImage" onload="clearB()">                          
</div>
<div class="jigimgS">
    <img src="" id="smallImage" onload="clearS()">                   
</div>

图片匹配

文中代码具体可参见自动登陆QQ空间(3)和代码中相应的注释。 python版本:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def main():
    otemp = 'template.png'
    oblk = 'target.png'
    identify_gap(oblk, otemp, "D:\\books\\plantuml_picture\\target.png");

def identify_gap(bg, tp, out):
    '''
    bg: 背景图片
    tp: 缺口图片
    out:输出图片
    '''
    # 读取背景图片和缺口图片
    bg_img = cv2.imread(bg)  # 背景图片
    tp_img = cv2.imread(tp)  # 缺口图片

    # 转换图片格式
    bg_pic = cv2.cvtColor(bg_img, cv2.COLOR_GRAY2RGB)
    tp_pic = cv2.cvtColor(tp_img, cv2.COLOR_GRAY2RGB)

    # 缺口匹配
    res = cv2.matchTemplate(bg_pic, tp_pic, cv2.TM_CCOEFF_NORMED)
    min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(res)  # 寻找最优匹配

    # 绘制方框
    th, tw = tp_pic.shape[:2]
    tl = max_loc  # 左上角点的坐标
    br = (tl[0] + tw, tl[1] + th)  # 右下角点的坐标
    cv2.rectangle(bg_img, tl, br, (0, 0, 255), 2)  # 绘制矩形
    cv2.imwrite(out, bg_img)  # 保存在本地

    # 返回缺口的X坐标
    return tl[0]

写在最后

大部分验证码和滑块的问题可以通过文章中的方式搞定,如果是短信验证码,可能需要接码平台来搞定了。最后上一段代码,模拟人类滑动滑块行为的:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 public static void MoveSlideByOffSet(Actions action, int distance)
 {
     Thread.Sleep(500);
     int has_gone_dist = 0;
     int remaining_dist = distance;
     Random random = new();
     int span;
     while (remaining_dist > 0)
     {
         var ratio = remaining_dist / distance;
         if (ratio < 0.1)
             span = random.Next(3, 5);
         else if (ratio > 0.9)
             span = random.Next(5, 8);
         else
             span = random.Next(15, 20);
         action.MoveByOffset(span, random.Next(-5, 5));
         remaining_dist -= span;
         has_gone_dist += span;
         Thread.Sleep(random.Next(5, 20) / 100);
     }

     action.MoveByOffset(remaining_dist, random.Next(-5, 5));
 }

References

[1] Dwarf2: https://github.com/BurningTeng/Dwarf2 [2] github: https://github.com/BurningTeng/OCR_frame [3] Titanium: https://github.com/justcoding121/titanium-web-proxy

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
1 条评论
热度
最新
trweboc 可以通过压缩参数可以提高识别率
trweboc 可以通过压缩参数可以提高识别率
回复回复点赞举报
推荐阅读
编辑精选文章
换一批
python3 使用OpenCV计算滑块拼图验证码缺口位置
滑块拼图验证码的失败难度在于每次图片上缺口位置不一样,需识别图片上拼图的缺口位置,使用python的OpenCV库来识别到
上海-悠悠
2021/05/17
5.3K0
python3 使用OpenCV计算滑块拼图验证码缺口位置
干掉验证码!使用Python图像识别移动滑块验证码
验证码往往是爬虫路上的一只拦路虎,而其花样也是层出不穷:图片验证、滑块验证、交互式验证、行为验证等。随着OCR技术的成熟,图片验证已经渐渐淡出主流,而「滑块验证」越来越多地出现在大众视野。“这么厉害,这小子长啥样呢?”没错,它就长这损sai:
用户2966292
2021/02/23
6.1K0
干掉验证码!使用Python图像识别移动滑块验证码
Python自动化解决滑块验证码的最佳实践
滑块验证码(Slider CAPTCHA)是当前互联网广泛使用的反爬机制之一,它要求用户手动拖动滑块到指定位置以完成验证。这种验证方式可以有效阻止简单的自动化脚本,但对爬虫开发者来说却构成了巨大挑战。
小白学大数据
2025/04/26
5850
【分享】Python 多缺口滑块验证demo
分享一下项目中碰到的一个多缺口滑块验证,先触发一下滑块抓包分析一下是用的哪一家滑块
拉灯的小手
2022/12/08
1.3K0
新版滑动验证码
今天的主角是滑动验证码,现在有很多网站使用了极验验证码来智能反爬虫,其中有一种是滑动验证码,具体来说就是拖动滑块来拼合图像,若图像完全拼合,则验证成功。下图是B站的登录验证码,便是采用了极验的滑动验证码,一起来看看如何破解吧!
老肥码码码
2020/01/17
4.9K0
新版滑动验证码
爬虫进阶教程:极验(GEETEST)验证码破解教程
原文链接及原作者:爬虫进阶教程:极验(GEETEST)验证码破解教程 | Jack Cui
圆方圆PYTHON学院
2018/12/24
7.4K0
爬虫进阶教程:极验(GEETEST)验证码破解教程
Python自动化解决滑块验证码的最佳实践
滑块验证码(Slider CAPTCHA)是当前互联网广泛使用的反爬机制之一,它要求用户手动拖动滑块到指定位置以完成验证。这种验证方式可以有效阻止简单的自动化脚本,但对爬虫开发者来说却构成了巨大挑战。
小白学大数据
2025/04/25
3000
自动滑块验证码识别_滑块验证码原理
有爬虫,自然就有反爬虫,就像病毒和杀毒软件一样,有攻就有防,两者彼此推进发展。而目前最流行的反爬技术验证码,为了防止爬虫自动注册,批量生成垃圾账号,几乎所有网站的注册页面都会用到验证码技术。其实验证码的英文为 CAPTCHA(Completely Automated Public Turing test to tell Computers and Humans Apart),翻译成中文就是全自动区分计算机和人类的公开图灵测试,它是一种可以区分用户是计算机还是人的测试,只要能通过 CAPTCHA 测试,该用户就可以被认为是人类。由此也可知道激活成功教程滑块验证码的关键即是让计算机更好的模拟人的行为,这也是激活成功教程的难点所在。(注:本文18年所作,仅作参考)
全栈程序员站长
2022/11/18
4K0
自动滑块验证码识别_滑块验证码原理
【验证码逆向专栏】最新某验三代滑块逆向分析,干掉所有的 w 参数!
本文章中所有内容仅供学习交流使用,不用于其他任何目的,不提供完整代码,抓包内容、敏感网址、数据接口等均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关!
K哥爬虫
2024/01/26
5070
【验证码逆向专栏】最新某验三代滑块逆向分析,干掉所有的 w 参数!
[428]极验验证码识别
很多网站的登陆都有验证码一项,而极验的方案就是应用的非常普遍。更多的场景是在反爬虫的对抗中,极客验证码更是首选。本次目标则是用程序来识别并通过极验验证码的验证。本次使用的是Python库是selenium库,Chrome浏览器,并配置好ChromeDriver。极验验证码官网为:https://auth.geetest.com/login/。它是一个专注于提供验证安全的系统,主要验证方式是拖动滑块拼合图像。若图像完全拼合,则验证成功,即表单成功提交,否则需要重新验证,如图所示:
周小董
2022/04/13
2K0
[428]极验验证码识别
2025最新滑块验证码、图形验证码、解决滑块验证码识别的技术方法大全
滑块验证码(Slider Captcha)自上线以来,以其交互性强、用户体验较好而被广泛应用于各类网站和 APP 的登录、注册、支付等关键环节。相比传统文字验证码或图形混淆验证码,滑块验证码能够更有效地区分真人与机器人,降低恶意脚本的通过率。然而,随着技术的发展,滑块验证码也不断被识别与破解。本文将从「生成与验证组件」和「识别与破解工具」两个大类入手,结合多款 GitHub 开源项目,逐一介绍各自的技术栈、实现原理、优缺点,以及实际使用场景与配置要点,并在最后给出综合对比与推荐,帮助技术选型和快速上手。
猫头虎
2025/06/08
1.1K0
selenium 模拟滑块验证码
slider-captcha/slider_captcha.py at master · maxnoodles/slider-captcha (github.com)
卓越笔记
2023/02/22
1.3K0
基于DdddOcr通用验证码离线本地识别SDK搭建个人云打码接口Api
最近介绍了一款免费的验证码识别网站,识别效率太低,考虑到ddddocr是开源的,决定搭建搭建一个,发现原作者sml2h3已经推出好久了,但是网上没有宝塔安装的教程,于是本次通过宝塔搭建属于自己的带带弟弟OCR通用验证码离线本地识别
德宏大魔王
2024/09/09
6240
python滑动验证码_python编程是啥
程序功能:程序模仿登入京东主页,自动输入帐号和密码,完成滑块验证,最后领取每日签京豆
全栈程序员站长
2022/09/27
4770
【验证码逆向专栏】xx邮政滑块逆向分析
本文章中所有内容仅供学习交流使用,不用于其他任何目的,不提供完整代码,抓包内容、敏感网址、数据接口等均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关!
K哥爬虫
2024/09/02
2430
【验证码逆向专栏】xx邮政滑块逆向分析
【验证码逆向专栏】某盾 v2 滑动验证码逆向分析
本文章中所有内容仅供学习交流使用,不用于其他任何目的,不提供完整代码,抓包内容、敏感网址、数据接口等均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关!
K哥爬虫
2025/03/03
3751
【验证码逆向专栏】某盾 v2 滑动验证码逆向分析
Python之极验滑动验证码的识别(教程+案例)
1 滑动验证码的识别介绍 本节目标:用程序识别极验滑动验证码的验证,包括分析识别思路、识别缺口位置、生成滑块拖动路径、模拟实现滑块拼合通过验证等步骤。 准备工作:本次案例我们使用Python库是Selenium,浏览器为Chrome。请确保已安装Selenium库和ChromeDriver浏览器驱动。 了解极验滑动验证码: 极验滑动验证码官网为:http://www.geetest.com/ 验证方式为拖动滑块拼合图像,若图像完全拼合,则验证成功,否则需要重新验证,如图所示: image.png 接下来
Python知识大全
2020/02/13
3.4K3
Python之极验滑动验证码的识别(教程+案例)
极验验证码破解分析
任何一个网站,如果在登录时网站接入的极验的接口,那么该网站就可以使用极验验证码进行登录,此时极验验证码API就会返回两个极验参数,gt和challenge,这两个参数只跟极验验证码API相关,跟这个网站没有任何关系。
周小董
2019/08/18
4.8K0
【原创】Python 极验滑块验证
可以很明显的看出来是极验3代验证,借助之前写阿里云盾的经验使用selenium+pyautoui先测试一下,详细可参考:阿里云盾滑块验证
拉灯的小手
2022/05/09
1.8K0
【原创】Python 极验滑块验证
数美滑块验证码分析
数美验证码官网:https://www.ishumei.com/trial/captcha.html
李玺
2021/11/22
1.6K0
数美滑块验证码分析
推荐阅读
相关推荐
python3 使用OpenCV计算滑块拼图验证码缺口位置
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验