图形解锁验证码破解(附Python代码)

27 篇文章 139 订阅
23 篇文章 8 订阅

前言:

爬虫开源死得快,新浪微博又改策略了。在去年的这个时候,微博还是没什么限制的。2016年12月我将新浪微博爬虫的代码作了一次更新,并将文章转到了知乎,爬微博的人似乎从那个时候开始多了许多。也许是这个缘故,微博开始对IP设了限制,接着禁了原来免验证码的登录方式,现在将weibo.cn的登录途径也关了,weibo.cn采用m.weibo.cn的登录,登录过程中可能出现图形解锁验证码。这种验证码比较少见,因为多用在手机平台。

我怀疑QQ交流群(537549079)里应该是有新浪微博反爬虫的人,不过这也没什么关系,我们做爬虫的,本来就是带头“制造麻烦”的人,没有被请去喝茶,就已经要感恩了。另外需要声明一点,其实我个人并不需要微博数据,平时自己也没有爬,只是出于责任,既然把项目开源了,就有义务持续维护更新下去。另外是出于兴趣爱好,作为一名爬虫工作者,出现了新的反爬机制,我自己也是很兴奋 很想去研究突破的。

废话少说,上代码:WeiboSliderCode
运行效果:
微博登录



正文:

看到这种验证码时的第一感觉就是,效果还挺酷!第二感觉是,要破应该不难。
背景很干净,基本上不需要除噪;如果要写程序破解,只需要判断哪些点之间有连线,以及箭头的指向即可。背景和线条的像素很规范,使得我们只需要判断像素变化就可以很清晰地识别线条和箭头方向。

图片是由一个个像素组成的,Image打开图片后一个像素包含三个数值,分别代表RGB数值。将图片转为灰度图像后,每个像素只有一个数值,从0到255(从黑到白)。将图形解锁验证码的图片灰度化,可以发现图片背景值为253,线条的灰度值都为小于253的数。
这里写图片描述

缩小一下,来看看整张图:
这里写图片描述
是不是感觉这识别难度似乎也并不大?


后来我仔细想了一想,好像哪里不对劲,这验证码,,才四宫格!!这意味着什么?
四个点的连线,最多有多少种可能?手指掐一下也能算出:4*3*2*1=24。总共才24种可能,我只要手动收集这24张图,人工标识轨迹。以后每次遇到验证码,只要比对一下这24张图的像素值就能知道轨迹方向了呀!
哭笑不得,这验证码还真是简单得不行!

我们给四宫格的四个点定编号:1、2、3、4。如下图。则轨迹可以标记为:”2314”。
图形解锁验证码

接下来收集24张图:
图形解锁验证码2

然后将各个图片转为像素矩阵,见Github代码中的 ims.py 文件。
当遇到一张新图片后,对比ims.py存的24张图的像素,得出轨迹方向。然后程序模拟操作鼠标滑动解锁。运行的效果图上面已经有了。感兴趣的可以拿代码运行一下。

程序运行步骤:

  1. 安装Python2.7,安装谷歌浏览器(Chrome)。
  2. 根据Chrome的版本下载chromedriver.exe(参考http://blog.csdn.net/huilan_same/article/details/51896672),解压放在Chrome的安装目录,并将该路径加入到环境变量。
  3. 需要安装的Python模块:PIL、StringIO、selenium。
  4. 运行 login.py



结语:

群里爬微博的,多是需要数据写论文的学生,其中很多都是非计算机专业的同学,可能抓取微博的过程中会遇到各种问题。还是那句话,需要数据的,爬之前尽量先找群里有数据的同学要,有偿也可以,因为数据抓取本来就是需要投入大量时间和人力的。尽量不要给微博官方造成不必要的麻烦。

我喜欢追求技术,但不希望自己会给他人造成很大困扰,谢谢!如果有什么问题请留言。



转载请注明出处,谢谢!(原文链接:http://blog.csdn.net/bone_ace/article/details/71056741

  • 10
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 13
    评论
以下是一个基本的无人机 Python 代码框架,可以帮助你开始编写你自己的无人机程序: ```python import time from dronekit import connect, VehicleMode, LocationGlobalRelative # 连接到飞行器 connection_string = '127.0.0.1:14550' # 或者是你的无人机的 IP 地址 vehicle = connect(connection_string, wait_ready=True) # 定义一些辅助函数 def arm_and_takeoff(aTargetAltitude): print("起飞中...") while not vehicle.is_armable: time.sleep(1) vehicle.mode = VehicleMode("GUIDED") vehicle.armed = True while not vehicle.armed: print("等待解锁...") time.sleep(1) print("起飞!") vehicle.simple_takeoff(aTargetAltitude) while True: print("当前高度:", vehicle.location.global_relative_frame.alt) if vehicle.location.global_relative_frame.alt >= aTargetAltitude * 0.95: print("达到目标高度") break time.sleep(1) def fly_to_location(lat, lon): print("前往目标位置") target_location = LocationGlobalRelative(lat, lon, 10) vehicle.simple_goto(target_location) while True: dist = vehicle.location.global_frame.distance_to(target_location) if dist <= 1: print("到达目标位置") break time.sleep(1) # 起飞! arm_and_takeoff(10) # 前往目标位置 fly_to_location(-35.363261, 149.165230) # 关闭连接 vehicle.close() ``` 请注意,这是一个简单的示例代码,你需要根据你的具体需求进行修改和扩展。此外,你需要在你的计算机上安装相应的依赖库和无人机控制软件才能运行此代码

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值