当前位置:首页 > CN2资讯 > 正文内容

python 新浪微博验证码 微博验证码8513

1天前CN2资讯



有次帮某人发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的那种,就完全没法可想了。


    你可能想看:

    扫描二维码推送至手机访问。

    版权声明:本文由皇冠云发布,如需转载请注明出处。

    本文链接:https://www.idchg.com/info/19928.html

    分享给朋友:

    “python 新浪微博验证码 微博验证码8513” 的相关文章

    甲骨文云免费套餐与ARM CPU优势解析

    甲骨文云(Oracle Cloud)是一个强大的云服务平台,近年来受到了越来越多用户的关注。我自己也曾经探索过这个平台,在这里我想和大家聊聊甲骨文云的免费套餐,这对中小企业以及开发者来说真的是一个不错的选择。免费的套餐不仅简化了入门程序,也为新用户提供了足够的资源来尝试不同的云服务。 甲骨文云的免费...

    搬瓦工VPS与IPv6: 优化你的网络体验

    搬瓦工(BandwagonHost)作为一家由加拿大IT7 Networks公司推出的品牌,专注于提供性价比较高的VPS主机服务。我一直对VPS的体验充满好奇,尤其是搬瓦工的背景与发展历程。最初,搬瓦工主要销售超低价的OpenVZ方案,吸引了不少预算有限的用户。随着技术的发展和市场需求的变化,搬瓦工...

    低价VPS: 如何选择最合适的虚拟私人服务器

    低价VPS概述 我们常常听到VPS这个词,它代表“虚拟私人服务器”。对于那些不太了解的人,VPS实际上是一种将一台物理服务器划分为多个虚拟服务器的技术。每个VPS都有独立的操作系统和存储空间,就像你在家里拥有一个独立的小房间一样。这样一来,你就能在不需要太多资金投入的情况下,拥有一台属于自己的服务器...

    NameSilo Coupons - 如何以低成本注册域名并享受优质服务

    NameSilo自2010年成立以来,展现出稳定且迅猛的发展态势,成为了一家备受关注的域名注册商。总部位于美国亚利桑那州,NameSilo已经成功管理超过400万个活跃域名,且在行业内占据着显著的地位。在这条领域内,NameSilo被视为全球仅有的12家顶级域名注册商之一,这无疑为其信誉奠定了坚实基...

    菲律宾用户如何通过VPS提升TikTok访问速度

    在菲律宾使用VPS访问TikTok,这个话题对很多喜欢在TikTok上进行电商活动或内容创作的人来说非常重要。首先,我想谈谈VPS的概念以及它的优势。VPS,全称是虚拟专用服务器,它提供了一种比共享主机更为灵活和高效的解决方案。对于菲律宾的用户来说,通过使用VPS,可以在一定程度上绕过地区限制,更流...

    2024年RackNerd在纽约的主机服务优势与促销活动分析

    RackNerd简介 RackNerd 是一家在美国知名的主机商,以其稳定的虚拟主机、KVM VPS、Hybrid Dedicated Servers和独立服务器租用方案而备受青睐。公司成立以来,致力于为全球用户提供高性能、可靠性强的服务器解决方案。对于我来说,RackNerd的服务不仅包括针对个人...