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输出指定月份日历的方法
Apr 23 Python
利用Python的装饰器解决Bottle框架中用户验证问题
Apr 24 Python
python实现批量修改文件名代码
Sep 10 Python
python自动12306抢票软件实现代码
Feb 24 Python
Python函数的参数常见分类与用法实例详解
Mar 30 Python
Python3 串口接收与发送16进制数据包的实例
Jun 12 Python
python使用Qt界面以及逻辑实现方法
Jul 10 Python
Python读写文件模式和文件对象方法实例详解
Sep 17 Python
python turtle工具绘制四叶草的实例分享
Feb 14 Python
Python如何使用内置库matplotlib绘制折线图
Feb 24 Python
Python使用Paramiko控制liunx第三方库
May 20 Python
详解Pycharm与anaconda安装配置指南
Aug 25 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
MySQL相关说明
2007/01/15 PHP
php array_slice函数的使用以及参数详解
2008/08/30 PHP
PHP中冒号、endif、endwhile、endfor使用介绍
2010/04/28 PHP
php中static静态变量的使用方法详解
2010/06/04 PHP
php利用腾讯ip分享计划获取地理位置示例分享
2014/01/20 PHP
php判断文件上传类型及过滤不安全数据的方法
2014/12/17 PHP
JavaScript中的作用域链和闭包
2012/06/30 Javascript
web前端设计师们常用的jQuery特效插件汇总
2014/12/07 Javascript
jQuery实现冻结表格行和列
2015/04/29 Javascript
asp.net中oracle 存储过程(图文)
2015/08/12 Javascript
IE9+已经不对document.createElement向下兼容的解决方法
2015/09/14 Javascript
jQuery实现大图轮播
2017/02/13 Javascript
javascript滚轮事件基础实例讲解(37)
2017/02/14 Javascript
js canvas实现写字动画效果
2018/11/30 Javascript
JQuery插件tablesorter表格排序实现过程解析
2020/05/28 jQuery
[52:10]LGD vs Optic Supermajor小组赛D组胜者组决赛 BO3 第二场 6.3
2018/06/04 DOTA
Pythont特殊语法filter,map,reduce,apply使用方法
2016/02/27 Python
利用python实现简单的循环购物车功能示例代码
2017/07/05 Python
Python2与python3中 for 循环语句基础与实例分析
2017/11/20 Python
基于python绘制科赫雪花
2018/06/22 Python
python利用pandas将excel文件转换为txt文件的方法
2018/10/23 Python
Pycharm无法显示动态图片的解决方法
2018/10/28 Python
对python中的乘法dot和对应分量相乘multiply详解
2018/11/14 Python
python getpass实现密文实例详解
2019/09/24 Python
python实现树的深度优先遍历与广度优先遍历详解
2019/10/26 Python
Python 实现自动导入缺失的库
2019/10/29 Python
python定时任务 sched模块用法实例
2019/11/04 Python
Python 使用双重循环打印图形菱形操作
2020/08/09 Python
实习老师个人总结的自我评价
2013/09/28 职场文书
护士自荐信范文
2013/12/15 职场文书
机关干部个人对照检查材料思想汇报
2014/09/28 职场文书
群众路线自我剖析材料
2014/10/08 职场文书
趣味运动会加油词
2015/07/18 职场文书
银行客户经理培训心得体会
2016/01/09 职场文书
《杜鹃的婚约》OP主题曲「凸凹」无字幕影像公开
2022/04/08 日漫
本地搭建minio文件服务器(使用bat脚本启动)的方法
2022/07/15 Servers