有次帮某人发spam,找人来填调查。写了个自动评论的脚本,但是发出一定数量的评论之后就会遭遇验证码,于是决定破解之。
思路也是一般的转化切割比对,成功率不是很高,不过重试几次也是可以用的。
虽然已经控制好了频率,不过最后还是被管理员发现了,直接封了帐号(好在是临时注册的),再注册再封,后来干脆封IP,
于是不得不给我的vps换了个ip(也好在是免费的),杯具。
闲话休说,言归正题。
首先是需要取得验证码的样本,以作训练特征之用。而要取得验证码,首先要模拟登录的请求:
usr = 'xx' psw = 'oo'
resp = urllib2.urlopen('https://login.sina.com.cn/sso/login.php?username=%s&password=%s&returntype=TEXT' %
( usr, psw)) cookie = Cookie.SimpleCookie(resp.headers['set-cookie']) headers = { 'Referer': 'http://t.sina.com.cn', 'Cookie': cookie_header(cookie),
'User-Agent': 'Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.2.3pre) Gecko/20100405 Firefox/3.6.3plugin1', } def cookie_header(cookie):
ret = '' for v in cookie.values(): ret += "%s=%s; " % (v.key, v.value) return ret
headers就是后续的请求中,需要传递的参数了。取回一些验证码样本:for i in xrange(100):
req_img = urllib2.Request('http://t.sina.com.cn/pincode/pin.php?lang=zh&r=%d&rule' % int(time() * 1000),
headers = headers) res_img = urllib2.urlopen(req_img) f = open('xinlang_pincode/%d.png' % i, 'wb') f.write(res_img.read()) f.close()
有一些验证码的回答是中文,中国首都什么的,这些不处理,直接返回失败。因为可以重复获取重新识别,不成问题的。下面是处理算术问题验证码的方法:先进行变换处理:from PIL import Image, ImageFilter, ImageEnhance file = 'xinlang_pincode/0.png' im = Image.open(file) im = im.convert()
enhancer = ImageEnhance.Brightness(im) im = enhancer.enhance(2.0) #加亮,效果见图1 enhancer = ImageEnhance.Contrast(im) im = enhancer.enhance(4)
#提高对比度,效果见图2 im = im.convert('1') #二值化,效果见图3 im = im.filter(ImageFilter.MedianFilter) #中值去噪,效果见图4 im.show()
#调用xv命令来显示图片,方便debug
图1:
图2:
图3:
图4:
这样处理过之后,图片背景中的色块被过滤掉,杂点也被过滤掉,而数字的形状也没有太大的损失。下面是分解字符,也就是将每一个数字或者+-*等符号分解出来:imim = im.load() WIDTH = 250 HEIGHT = 50 i = 0 has_start = False chars = [] while i < WIDTH: all_none = True for j in xrange(HEIGHT): if imim[i, j] != 255:
all_none = False if all_none: if has_start: end_x = i has_start = False char = im.crop((start_x, 0, end_x, HEIGHT))
char.show() #到这一步的效果见图5 charchar = char.load() width = end_x - start_x y1 = 0 y2 = HEIGHT - 1 all_none = True
while all_none: for ii in xrange(width): if charchar[ii, y1] != 255: all_none = False y1 += 1 all_none = True while all_none:
for ii in xrange(width): if charchar[ii, y2] != 255: all_none = False y2 -= 1 char = char.crop((0, y1 - 1, width, y2 + 2))
char = char.resize((20, 20)) #将图片缩放到统一的大小 char.show() #到这一步的效果见图6 chars.append(char) else: if not has_start:
start_x = i has_start = True i += 1
图5:字符被独立分割开
图6:字符上下两边的空白被去掉,且缩放到同一大小
这一步得到的chars是下面要用到的。然后是训练,也就是形成特征库。特征库规模越大,识别率也越高。不过训练起来也挺累的,有几十上百条也就好了。至少0到9和+-*=等几个字符的特征都要有:
file = open('xinlang.img', 'a') for c in chars: nstr = '' im_loaded = c.load() for x in range(20): for y in range(20): if im_loaded[x, y] == 255:
nstr += '0' else: nstr += '1' c.show() n = raw_input('? ') file.write(nstr+':'+n+'\n') file.close()
这里的特征,就是直接把每一个像素的信息,用0和1组成的字符串表示。训练的结果是一个文本文件,记录了对应的特征和字符,用于下面的比对。比对函数:pattern = [] for l in open('xinlang.img', 'r').read().split('\n'): pattern.append(l.split(':')) del pattern[-1] def what(img): im = img.load() nstr = ''
for x in xrange(20): #生成目标图像的特征字符串 for y in xrange(20): if im[x, y] == 255: nstr += '0' else: nstr += '1' minmin = 400
res = None for p in pattern: cur = 0 for i in xrange(400):
if nstr[i] != p[0][i]: #比对每一个像素,如果不相同,则增加差异值 cur += 1 if cur < = minmin: #记录下差异值最小时所对应的字符
minmin = cur res = p[1] return res
最后测试一下:
for c in chars: print what(c),
结果:
可以看到18+18这些字符可以成功识别。那为什么=和?识别不了呢?因为我没有训练这两个字符,而=和?都和数字2的特征最接近 -_-| ,这个验证码还是挺好破解的,因为字符之间间距很大,而且没有旋转,没有扭曲,不需要多少变换就能得到可用的结果。像google的那种,就完全没法可想了。
分享到:
相关推荐
今天小编就为大家分享一篇关于使用Selenium破解新浪微博的四宫格验证码的文章,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
【标题】:“新浪微博爬虫,用python爬取新浪微博数据” 【描述】:“此项目是关于如何使用Python编程语言构建一个爬虫,以抓取并分析新浪微博上的数据。爬虫技术在大数据时代对于获取社交媒体信息、进行网络数据...
在本资源中,我们主要探讨的是如何利用Python编程语言实现一个针对新浪微博的网络爬虫,目的是抓取微博数据,包括微博的文字内容、图片以及视频。爬虫是数据挖掘的重要工具,它能自动化地从互联网上收集信息,对于...
在本文中,我们将深入探讨如何实现新浪微博的代码登录,并理解其背后的原理和技术细节。通过登录微博,我们可以获取必要的Cookie信息,以便在后续的HTTP请求中模拟已登录状态,访问受保护的用户页面。 首先,我们...
在这个特定的案例中,我们关注的是“新浪微博及会员中心自动登录”的实现。这个程序旨在通过用户提供的一个账号,来获取登录所需的Cookie信息,从而实现无须手动输入用户名和密码的快速登录。 首先,我们来看看涉及...
在IT行业中,微博平台是社交媒体营销和信息传播的重要渠道,特别是在中国,新浪微博具有广泛的用户基础。今天我们将聚焦于“新浪微博2模拟登陆”这一主题,学习如何通过编程方式模拟登录并获取AccessToken,以便进行...
这里我们主要探讨的是如何使用易语言进行新浪微博的注册操作,以及可能涉及的相关技术。 首先,"新浪微博注册(绝对能用)"这个标题暗示了这是一个关于通过编程方式实现新浪微博账户注册的解决方案。易语言,全称...
【Python新浪微博数据分布式挖掘】 在数据挖掘领域,Python因其易用性和丰富的库支持而成为首选语言之一,尤其是在处理社交媒体数据时。本项目专注于利用Python对新浪微博数据进行分布式挖掘,涉及的关键知识点包括...
在这个场景中,我们关注的是如何使用HTTPClient 4库来模拟登录新浪微博。首先,我们需要理解HTTPClient库的基本概念。 HTTPClient是一个强大的Java库,用于处理HTTP请求和响应。它提供了丰富的功能,包括支持HTTPS...
本教程将探讨如何使用Python实现爬取新浪微博的信息。由于微博的移动端数据接口相对开放,且相较于PC端更容易进行爬取,因此我们将主要关注移动端的爬虫策略。 首先,我们需要了解微博的网页结构和数据获取方式。...
在本文中,我们将深入探讨如何使用Java来模拟登录新浪微博,特别是在其改版后增加了复杂性的背景下。我们将不依赖新浪提供的官方API,而是通过模拟浏览器的行为,实现自动化登录和交互。 首先,我们需要理解模拟...
在本文中,我们将深入探讨如何使用Java来模拟登录新浪微博这一话题。模拟登录是网络爬虫或自动化测试中常见的技术,它允许程序以用户的身份与网站交互。对于Java开发者来说,理解这一过程对于构建自动化工具或者数据...
《网络爬虫技术在新浪微博数据抓取中的应用》 网络爬虫,又称网页蜘蛛或自动索引程序,是互联网上一种自动浏览并提取信息的程序。在社交媒体领域,特别是像新浪微博这样的大型平台,网络爬虫的应用显得尤为重要。...
本主题聚焦于使用Java实现对新浪微博的模拟登录,这对于数据分析、信息抓取或自动化测试等应用场景具有重要意义。 【描述】:“新浪微博模拟登陆源代码,java实现,微博数据抓取” 这段描述揭示了几个关键点: 1....
"源码"意味着这篇文章可能会提供用于备份新浪微博的程序源代码,这可能是用Python、Java或其它编程语言编写的。源码分享对于开发者来说非常有价值,因为他们可以直接学习和修改代码以适应自己的需求。“工具”则暗示...
新浪微博的SSO实现展示了这种技术如何在多域名环境下提供无缝的用户体验。 在新浪微博的场景中,用户可以在`t.sina.com.cn`登录后,无须再次登录就能在`weibo.com`上继续浏览和操作。这是通过SSO系统实现的,这个...
【标题】:“新浪微博Android示例”是一份专为Android开发者设计的示例代码,它旨在帮助开发者更好地理解和实现微博应用在Android平台上的集成。通过这个示例,开发者可以学习到如何在Android应用中嵌入微博的功能,...
本文主要探讨了基于Python的新浪微博爬虫程序的设计与实现,旨在为专科和本科毕业生提供一篇原创的、已降重的毕业论文参考资料。论文涵盖了数据挖掘和网络爬虫的基础知识,特别是利用Python语言和Django框架进行开发...
本教程将详细讲解如何利用 Selenium 模拟登录新浪微博,包括必要的环境配置、关键代码实现以及可能遇到的问题。 首先,我们需要准备的工具有:Python 编程语言、Selenium 库、WebDriver(火狐驱动或 PhantomJS 驱动...
【标题】"最新新浪微博爬虫程序Java版 2015"揭示了这是一个基于Java编程语言的网络爬虫,主要用于抓取2015年时新浪微博上的数据。爬虫是自动化提取网页信息的工具,而Java是实现这一功能的常见语言之一,因为它具有...