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数据统计的一些小技巧
Jul 21 Python
python+pygame简单画板实现代码实例
Dec 13 Python
NetworkX之Prim算法(实例讲解)
Dec 22 Python
Python 实现12306登录功能实例代码
Feb 09 Python
python 删除列表里所有空格项的方法总结
Apr 18 Python
python实现n个数中选出m个数的方法
Nov 13 Python
python实现简单五子棋游戏
Jun 18 Python
Python3使用PySynth制作音乐的方法
Sep 09 Python
Python 模拟动态产生字母验证码图片功能
Dec 24 Python
Python阶乘求和的代码详解
Feb 14 Python
Selenium向iframe富文本框输入内容过程图解
Apr 10 Python
图文详解matlab原始处理图像几何变换
Jul 09 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
一个颜色轮换的简单例子
2006/10/09 PHP
PHP对象转换为数组函数(递归方法)
2012/02/04 PHP
php实现中文转数字
2016/02/18 PHP
PHP+Redis开发的书签案例实战详解
2019/07/09 PHP
gearman中worker常驻后台,导致MySQL server has gone away的解决方法
2020/02/27 PHP
php swoft框架实例用法
2020/12/22 PHP
浅谈javascript中的作用域
2012/04/07 Javascript
jquery与js函数冲突的两种解决方法
2013/09/09 Javascript
jQuery实现移动端滑块拖动选择数字效果
2015/12/24 Javascript
写jQuery插件时的注意点
2017/02/20 Javascript
nodejs入门教程六:express模块用法示例
2017/04/24 NodeJs
jquery仿微信聊天界面
2017/05/06 jQuery
vue2中filter()的实现代码
2017/07/09 Javascript
js读取本地文件的实例
2017/12/22 Javascript
AngularJS实时获取并显示密码的方法
2018/02/06 Javascript
JS正则表达式常见用法实例详解
2018/06/19 Javascript
Vue+elementUI实现多图片上传与回显功能(含回显后继续上传或删除)
2020/03/23 Javascript
SpringBoot在yml配置文件中配置druid的操作
2020/11/16 Javascript
python中input()与raw_input()的区别分析
2016/02/27 Python
遍历python字典几种方法总结(推荐)
2016/09/11 Python
python读取视频流提取视频帧的两种方法
2020/10/22 Python
Python实现模拟登录网易邮箱的方法示例
2018/07/05 Python
Python实现的简单线性回归算法实例分析
2018/12/26 Python
通过实例简单了解Python中yield的作用
2019/12/11 Python
python2 对excel表格操作完整示例
2020/02/23 Python
Python转换字典成为对象,可以用&quot;.&quot;方式访问对象属性实例
2020/05/11 Python
Python Http请求json解析库用法解析
2020/11/28 Python
使用python操作lmdb对数据读取的实例
2020/12/11 Python
matplotlib常见函数之plt.rcParams、matshow的使用(坐标轴设置)
2021/01/05 Python
详解html5 shiv.js和respond.min.js
2018/01/24 HTML / CSS
墨西哥皇宫度假村预订:Palace Resorts
2018/06/16 全球购物
大三学生入党思想汇报
2014/01/02 职场文书
美化环境标语
2014/06/20 职场文书
中学生秋季运动会广播稿
2014/09/21 职场文书
国庆阅兵观后感
2015/06/15 职场文书
vue项目配置sass及引入外部scss文件
2022/04/14 Vue.js