Python实现破解12306图片验证码的方法分析


Posted in Python onDecember 29, 2017

本文实例讲述了Python实现破解12306图片验证码的方法。分享给大家供大家参考,具体如下:

不知从何时起,12306的登录验证码竟然变成了按字找图,可以说是又提高了一个等次,竟然把图像识别都用上了。不过有些图片,不得不说有些变态,图片的清晰图就更别说了,明显是从网络上的图库中搬过来的。

Python实现破解12306图片验证码的方法分析

谁知没多久,网络就惊现破解12306图片验证码的Python代码了,作为一个爱玩爱刺激的网虫,当然要分享一份过来。

代码大致流程:

1、将验证码图片下载下来,然后切图;
2、利用百度识图进行图片分析;
3、再利用正则表达式来取出百度识图的关键字,最后输出。

代码:

#!/usr/bin/python
# # FileName  : fuck12306.py
# # Author   : MaoMao Wang <andelf@gmail.com>
# # Created   : Mon Mar 16 22:08:41 2015 by ShuYu Wang
# # Copyright  : Feather (c) 2015
# # Description : fuck fuck 12306
# # Time-stamp: <2015-03-17 10:57:44 andelf>
from PIL import Image
from PIL import ImageFilter
import urllib
import urllib2
import re
import json
# hack CERTIFICATE_VERIFY_FAILED
# https://github.com/mtschirs/quizduellapi/issues/2
import ssl
if hasattr(ssl, '_create_unverified_context'):
  ssl._create_default_https_context = ssl._create_unverified_context
UA = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.89 Safari/537.36"
pic_url = "https://kyfw.12306.cn/otn/passcodeNew/getPassCodeNew?module=login&rand=sjrand&0.21191171556711197"
def get_img():
  resp = urllib.urlopen(pic_url)
  raw = resp.read()
  with open("./tmp.jpg", 'wb') as fp:
    fp.write(raw)
  return Image.open("./tmp.jpg")
def get_sub_img(im, x, y):
  assert 0 <= x <= 3
  assert 0 <= y <= 2
  WITH = HEIGHT = 68
  left = 5 + (67 + 5) * x
  top = 41 + (67 + 5) * y
  right = left + 67
  bottom = top + 67
  return im.crop((left, top, right, bottom))
def baidu_stu_lookup(im):
  url = "http://stu.baidu.com/n/image?fr=html5&needRawImageUrl=true&id=WU_FILE_0&name=233.png&type=image%2Fpng&lastModifiedDate=Mon+Mar+16+2015+20%3A49%3A11+GMT%2B0800+(CST)&size="
  im.save("./query_temp_img.png")
  raw = open("./query_temp_img.png", 'rb').read()
  url = url + str(len(raw))
  req = urllib2.Request(url, raw, {'Content-Type':'image/png', 'User-Agent':UA})
  resp = urllib2.urlopen(req)
  resp_url = resp.read()   # return a pure url
  url = "http://stu.baidu.com/n/searchpc?queryImageUrl=" + urllib.quote(resp_url)
  req = urllib2.Request(url, headers={'User-Agent':UA})
  resp = urllib2.urlopen(req)
  html = resp.read()
  return baidu_stu_html_extract(html)
def baidu_stu_html_extract(html):
  #pattern = re.compile(r'<script type="text/javascript">(.*?)</script>', re.DOTALL | re.MULTILINE)
  pattern = re.compile(r"keywords:'(.*?)'")
  matches = pattern.findall(html)
  if not matches:
    return '[UNKNOWN]'
  json_str = matches[0]
  json_str = json_str.replace('\\x22', '"').replace('\\\\', '\\')
  #print json_str
  result = [item['keyword'] for item in json.loads(json_str)]
  return '|'.join(result) if result else '[UNKNOWN]'
def ocr_question_extract(im):
  # git@github.com:madmaze/pytesseract.git
  global pytesseract
  try:
    import pytesseract
  except:
    print "[ERROR] pytesseract not installed"
    return
  im = im.crop((127, 3, 260, 22))
  im = pre_ocr_processing(im)
  # im.show()
  return pytesseract.image_to_string(im, lang='chi_sim').strip()
def pre_ocr_processing(im):
  im = im.convert("RGB")
  width, height = im.size
  white = im.filter(ImageFilter.BLUR).filter(ImageFilter.MaxFilter(23))
  grey = im.convert('L')
  impix = im.load()
  whitepix = white.load()
  greypix = grey.load()
  for y in range(height):
    for x in range(width):
      greypix[x,y] = min(255, max(255 + impix[x,y][0] - whitepix[x,y][0],
                    255 + impix[x,y][1] - whitepix[x,y][1],
                    255 + impix[x,y][2] - whitepix[x,y][2]))
  new_im = grey.copy()
  binarize(new_im, 150)
  return new_im
def binarize(im, thresh=120):
  assert 0 < thresh < 255
  assert im.mode == 'L'
  w, h = im.size
  for y in xrange(0, h):
    for x in xrange(0, w):
      if im.getpixel((x,y)) < thresh:
        im.putpixel((x,y), 0)
      else:
        im.putpixel((x,y), 255)
if __name__ == '__main__':
  im = get_img()
  #im = Image.open("./tmp.jpg")
  print 'OCR Question:', ocr_question_extract(im)
  for y in range(2):
    for x in range(4):
      im2 = get_sub_img(im, x, y)
      result = baidu_stu_lookup(im2)
      print (y,x), result
Python 相关文章推荐
Python语言技巧之三元运算符使用介绍
Mar 04 Python
跟老齐学Python之关于循环的小伎俩
Oct 02 Python
python中map、any、all函数用法分析
Apr 21 Python
python使用PIL模块实现给图片打水印的方法
May 22 Python
Python中使用Queue和Condition进行线程同步的方法
Jan 19 Python
python文件操作相关知识点总结整理
Feb 22 Python
Python3中的真除和Floor除法用法分析
Mar 16 Python
详解Python的Flask框架中生成SECRET_KEY密钥的方法
Jun 07 Python
django主动抛出403异常的方法详解
Jan 04 Python
django的聚合函数和aggregate、annotate方法使用详解
Jul 23 Python
pytorch 改变tensor尺寸的实现
Jan 03 Python
使用pymysql查询数据库,把结果保存为列表并获取指定元素下标实例
May 15 Python
解决python使用open打开文件中文乱码的问题
Dec 29 #Python
python爬虫获取京东手机图片的图文教程
Dec 29 #Python
python通过getopt模块如何获取执行的命令参数详解
Dec 29 #Python
基于并发服务器几种实现方法(总结)
Dec 29 #Python
Python matplotlib画图实例之绘制拥有彩条的图表
Dec 28 #Python
python操作列表的函数使用代码详解
Dec 28 #Python
Python读csv文件去掉一列后再写入新的文件实例
Dec 28 #Python
You might like
新版PHP极大的增强功能和性能
2006/10/09 PHP
PHP curl_setopt()函数实例代码与参数分析
2011/06/02 PHP
深入PHP magic quotes的详解
2013/06/17 PHP
php ci框架中加载css和js文件失败的原因及解决方法
2014/07/29 PHP
Yii中创建自己的Widget实例
2016/01/05 PHP
PHP如何读取由JavaScript设置的Cookie
2017/03/22 PHP
PHP查询分页的实现代码
2017/06/09 PHP
文本加密解密
2006/06/23 Javascript
javascript开发随笔二 动态加载js和文件
2011/11/25 Javascript
兼容IE和Firefox火狐的上下、左右循环无间断滚动JS代码
2013/04/19 Javascript
jquery实现弹出层遮罩效果的简单实例
2014/03/03 Javascript
nodejs 提示‘xxx’ 不是内部或外部命令解决方法
2014/11/20 NodeJs
jQuery实现的产品自动360度旋转展示特效源码分享
2015/08/21 Javascript
JavaScript类型系统之Object详解
2016/01/07 Javascript
Angular2 Service实现简单音乐播放器服务
2017/02/24 Javascript
vue2实现移动端上传、预览、压缩图片解决拍照旋转问题
2017/04/13 Javascript
vue项目优化之通过keep-alive数据缓存的方法
2017/12/11 Javascript
js与jQuery实现获取table中的数据并拼成json字符串操作示例
2018/07/12 jQuery
JS构造一个html文本内容成文件流形式发送到后台
2018/07/31 Javascript
jQuery实现的导航条点击后高亮显示功能示例
2019/03/04 jQuery
vue中使用vue-cli接入融云实现即时通信
2019/04/19 Javascript
vue倒计时刷新页面不会从头开始的解决方法
2020/03/03 Javascript
vue实现PC端分辨率适配操作
2020/08/03 Javascript
Python定时发送消息的脚本:每天跟你女朋友说晚安
2018/10/21 Python
Python判断telnet通不通的实例
2019/01/26 Python
对python使用telnet实现弱密码登录的方法详解
2019/01/26 Python
Pandas分组与排序的实现
2019/07/23 Python
浅谈Python3中print函数的换行
2020/08/05 Python
Python pysnmp使用方法及代码实例
2020/08/24 Python
美国亚马逊旗下时尚女装网店:SHOPBOP(支持中文)
2020/10/17 全球购物
经典大学生求职信范文
2014/01/06 职场文书
超市创意活动方案
2014/08/15 职场文书
村委会贫困证明范本
2014/09/17 职场文书
科长个人四风问题整改措施思想汇报
2014/10/13 职场文书
使用HttpSessionListener监听器实战
2022/03/17 Java/Android
MySQL库表太大怎么办? 数据库分库分表项目实践
2022/04/11 MySQL