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中bisect的用法
Sep 23 Python
Python中元组,列表,字典的区别
May 21 Python
python实现多线程行情抓取工具的方法
Feb 28 Python
Python中的Django基本命令实例详解
Jul 15 Python
Python将主机名转换为IP地址的方法
Aug 14 Python
Python英文文章词频统计(14份剑桥真题词频统计)
Oct 13 Python
Python搭建HTTP服务过程图解
Dec 14 Python
python3获取文件中url内容并下载代码实例
Dec 27 Python
Django如何使用asyncio协程和ThreadPoolExecutor多线程
Oct 12 Python
解决使用Pandas 读取超过65536行的Excel文件问题
Nov 10 Python
numba提升python运行速度的实例方法
Jan 25 Python
python 多态 协议 鸭子类型详解
Nov 27 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+DBM的同学录程序(2)
2006/10/09 PHP
php实现最简单的MVC框架实例教程
2014/09/08 PHP
JQuery SELECT单选模拟jQuery.select.js
2009/11/12 Javascript
jQuery中的常用事件总结
2009/12/27 Javascript
浏览器常用高宽的jquery插件
2011/02/24 Javascript
自定义jQuery选项卡插件实例
2013/03/27 Javascript
jquery增加时编辑jqGrid(实例代码)
2013/11/08 Javascript
JavaScript中String对象的方法介绍
2017/01/04 Javascript
JavaScript严格模式下关于this的几种指向详解
2017/07/12 Javascript
vue.js 2.*项目环境搭建、运行、打包发布的详细步骤
2019/05/01 Javascript
vue动态注册组件实例代码详解
2019/05/30 Javascript
JavaScript 实现拖拽效果组件功能(兼容移动端)
2020/11/11 Javascript
Python 正则表达式(转义问题)
2014/12/15 Python
Python中使用第三方库xlutils来追加写入Excel文件示例
2015/04/05 Python
python网络编程调用recv函数完整接收数据的三种方法
2017/03/31 Python
python thrift搭建服务端和客户端测试程序
2018/01/17 Python
解决pip install的时候报错timed out的问题
2018/06/12 Python
Python通过TensorFlow卷积神经网络实现猫狗识别
2019/03/14 Python
使用selenium模拟登录解决滑块验证问题的实现
2019/05/10 Python
pytorch实现建立自己的数据集(以mnist为例)
2020/01/18 Python
解决Keras 自定义层时遇到版本的问题
2020/06/16 Python
Python3+Appium安装及Appium模拟微信登录方法详解
2021/02/16 Python
解决PDF 转图片时丢文字的一种可能方式
2021/03/04 Python
HTML5拖拽功能实现的拼图游戏
2018/07/31 HTML / CSS
Canvas中设置width与height的问题浅析
2018/11/01 HTML / CSS
极度干燥澳大利亚官方网站:Superdry澳大利亚
2019/03/28 全球购物
金智子午JAVA面试题
2015/09/04 面试题
运动会通讯稿50字
2014/01/30 职场文书
《童趣》教学反思
2014/02/19 职场文书
小学生竞选班干部演讲稿(5篇)
2014/09/12 职场文书
2014年度个人工作总结范文
2015/03/09 职场文书
杨善洲电影观后感
2015/06/04 职场文书
JS中一些高效的魔法运算符总结
2021/05/06 Javascript
正确使用MySQL update语句
2021/05/26 MySQL
Python自动化工具之实现Excel转Markdown表格
2022/04/08 Python
Python 图片添加美颜效果
2022/04/28 Python