Axton Yao
Always Dream. Always Explore.
无垠
用Python处理非主流验证码 │ 脑洞如黑洞

隔了这么长时间之后这个栏目终于又回来了!

有没有觉得这次的标题特别长!本来还要长的但是担心溢出页面结构爆炸…

欸不对扯远了

https://img.flyhigher.top/wp-content/uploads/2017/03/wp-1489314418450.jpg

所以扯回来。这次的主题就是用Python写个非主流验证码助手。要处理的这个验证码有多非主流?这个验证码丧心病狂到这种地步:

https://img.flyhigher.top/wp-content/uploads/2017/03/wp-1489314712539.png

自行忽略图中提示中的日期,太暴力不可取啊。

这个验证码来自树洞外链,在线版本https://file.aoaoao.me/views/login.php,戳“我要注册”。顺便插一句,这是一个超棒的外链系统,由@Aaron学长开发。我可没收广告费╮ (. ❛ ᴗ ❛.) ╭

所以我们的目标就是搞定这个验证码。

注意(敲小黑板):这个验证码的原作者@Aaron其实已经提供了详细信息,甚至提供了包含所有数据的sql文件,详见https://aoaoao.me/1246.html。但是这篇文章还是基于不知道这些信息的情况,毕竟一般情况下你是搞不到这些信息的是嘛。

让我们开始吧!

分析

首先我们要确定的是怎么实现这一目标。非常简单,就是用常规套路,多了一步联网寻找答案而已。看图:

https://img.flyhigher.top/wp-content/uploads/2017/03/v-1.jpg

那么,首先要搞一点样本来分析一下怎么处理。上F12大法。

https://img.flyhigher.top/wp-content/uploads/2017/03/wp-1489318019884.jpg

好的抓到了。但….这个参数是什么鬼?还得回去看源码:

原来只是随机数啊,大概是为了刷新图像加的。

所以先爬个100张下来。虽然不用担心参数,但是为了尽可能不被发现,还是在脚本里面加上好了。

在原则上我应该爬自己的站的然而我的服务器没装GD库…对@Aaron说声抱歉。

一个简单到只剩下循环的爬取脚本如下,需要Python 3,用2.x的改一下urllib就好啦:

炫酷狂拽的运行图:

https://img.flyhigher.top/wp-content/uploads/2017/03/wp-1489320338809.jpg

然后…然后就好了。

https://img.flyhigher.top/wp-content/uploads/2017/03/wp-1489319235518.jpg

然后就是分析一下验证码的结构。

很显然验证码分为三种:大事件发生、人物出生以及人物逝世。那么这三种验证码我们需要用不同的方式处理。

获取图像

这是第二步了。现在我们要获取图像。因为验证码的展示是由js控制的,我们需要一个能够解析js的Python库,而且我的目标是开发一个自动填充验证码的“验证码助手”而非注册机,所以我最后使用了Selenium库。

安装很简单。

所以有了这样的代码:

但是在打开浏览器这一步就踩坑了,Google了好久也不知道发生了什么,后来才找到原来FF高版本需要额外的驱动才能被Selenium控制。所以最后终于搞定。

Win64驱动下载:http://yun.flyhigher.top/files/s.php?k=3f2c6,密码:d9dd

扔在Python根目录下即可。

然后便很顺利了,用js操作网页,直到出现文科版验证码。

插一句,大概是由于@Aaron学长的懒癌,化学式验证码图片直接引用自chemicalbook,这不仅导致他可爱的小绿锁掉了,更给了我们搞定此类验证码的机会。不过也由于我的懒癌,我…我懒得弄了。

所以现在代码长这样:

由于验证码不能额外下载,接下来用Selenium的截屏功能搞到验证码:

看图:

https://img.flyhigher.top/wp-content/uploads/2017/03/snipaste20170325_153852.png

分析图像

好啦现在我们已经搞到了验证码,下一步就是提取出里面的文本。

原本其实是想用Tesseract识别的,但是试了一下无奈发现它对中文的识别实在太差,虽然可以训练,但是实在太麻烦懒得弄了。

于是偷懒用了百度云(此百度云非彼百度云)的在线文字识别接口,每天500次免费,重点是提供了现成Python库(不是打广告)。微软也有类似的服务,但免费额度稍少,没仔细翻文档,不知道有没有库可以用(但估计没有)。

于是就没什么坑了,调用接口,提取返回的JSON格式字符串即可。

到这一步,脚本如下:

调试的时候学长的服务器爆了,暂时没有截图,你们就自行脑补一下感受这个脚本的炫酷牛逼就可以了。

寻找答案

所以现在搞到了文本,接下来就是最后一步寻找答案了。

大坑预警

本来想更完的,但是学长的服务器爆了(但愿是暂时的或者说我的网爆了),就只能先停一下了。另外我在试图优化寻找答案的方法以提高成功率,各位如果有兴趣欢迎联系我一起讨论下QAQ

所以…未完待续…

赞赏
本文采用 CC BY-NC-SA 3.0 Unported 协议进行许可。
本文链接: https://flyhigher.top/experiments/308.html

发表评论

textsms
account_circle
email

  • https://secure.gravatar.com/avatar/3800f67051ba9440ffecf2c3e8734933?s=80&d=mm&r=r

    催更 期待ing

    1年前回复
    • https://secure.gravatar.com/avatar/40576c4b7e844c7b7f5b3bc50c14b42e?s=80&d=mm&r=r
      Axton博主

      @Aaron: 更了一部分
      截图的时候发现网站居然打不开了2333

      1年前回复
      • https://secure.gravatar.com/avatar/40576c4b7e844c7b7f5b3bc50c14b42e?s=80&d=mm&r=r
        Axton博主

        @Axton: 是移动DNS的锅

        1年前

无垠

用Python处理非主流验证码 │ 脑洞如黑洞
隔了这么长时间之后这个栏目终于又回来了! 有没有觉得这次的标题特别长!本来还要长的但是担心溢出页面结构爆炸... 欸不对扯远了 所以扯回来。这次的主题就是用Python写个…
扫描二维码继续阅读
2017-03-12