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实现在windows服务中新建进程的方法
Jun 30 Python
用生成器来改写直接返回列表的函数方法
May 25 Python
python中 chr unichr ord函数的实例详解
Aug 06 Python
浅谈Python peewee 使用经验
Oct 20 Python
Python实现的双色球生成功能示例
Dec 18 Python
Python中max函数用于二维列表的实例
Apr 03 Python
pandas apply 函数 实现多进程的示例讲解
Apr 20 Python
python 平衡二叉树实现代码示例
Jul 07 Python
Python/ArcPy遍历指定目录中的MDB文件方法
Oct 27 Python
Python实现线性判别分析(LDA)的MATLAB方式
Dec 09 Python
keras实现多种分类网络的方式
Jun 11 Python
python将下载到本地m3u8视频合成MP4的代码详解
Nov 24 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
暴雪前总裁遗憾:没尽早追赶Dota 取消星际争霸幽灵
2020/03/08 星际争霸
PHP伪静态写法附代码
2008/06/20 PHP
PHP has encountered an Access Violation 错误的解决方法
2010/01/17 PHP
实用的PHP带公钥加密类分享(每次加密结果都不一样哦)
2014/08/20 PHP
新浪SAE搭建PHP项目教程
2015/01/28 PHP
PHP 表单提交及处理表单数据详解及实例
2016/12/27 PHP
JS 屏蔽按键效果与改变按键效果的示例代码
2013/12/24 Javascript
js判断字符长度以及中英文数字等
2013/12/31 Javascript
JavaScript合并两个数组并去除重复项的方法
2015/06/13 Javascript
AngularJS实现全选反选功能
2015/12/08 Javascript
javascript数组克隆简单实现方法
2015/12/16 Javascript
JavaScript的React框架中的JSX语法学习入门教程
2016/03/05 Javascript
深入理解bootstrap框架之第二章整体架构
2016/10/09 Javascript
jQuery中用on绑定事件时需注意的事项
2017/03/19 Javascript
javaScript实现滚动条事件详解
2020/03/24 Javascript
微信小程序学习笔记之文件上传、下载操作图文详解
2019/03/29 Javascript
Vue中的组件及路由使用实例代码详解
2019/05/22 Javascript
layui.tree组件的使用以及搜索节点功能的实现
2019/09/26 Javascript
[41:21]夜魇凡尔赛茶话会 第三期02:看图识人
2021/03/11 DOTA
[07:09]DOTA2-DPC中国联赛 正赛 Ehome vs Elephant 选手采访
2021/03/11 DOTA
python中闭包Closure函数作为返回值的方法示例
2017/12/17 Python
Python多线程Threading、子线程与守护线程实例详解
2020/03/24 Python
Python常用数字处理基本操作汇总
2020/09/10 Python
scrapy-redis分布式爬虫的搭建过程(理论篇)
2020/09/29 Python
iphoneX 适配客户端H5页面的方法教程
2017/12/08 HTML / CSS
HTML5 manifest离线缓存的示例代码
2018/08/08 HTML / CSS
护士的岗位职责
2013/12/04 职场文书
绩效考核实施方案
2014/03/18 职场文书
演讲稿的写法
2014/05/19 职场文书
道德演讲稿
2014/05/21 职场文书
安全保卫工作竞聘材料
2014/08/25 职场文书
师德师风建设整改措施思想汇报
2014/10/11 职场文书
学生会部长竞选稿
2015/11/19 职场文书
Memcached介绍及php-memcache扩展安装
2021/04/01 PHP
Java内存模型之happens-before概念详解
2021/06/13 Java/Android
深入理解pytorch库的dockerfile
2022/06/10 Python