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实现拉钩网上的FizzBuzzWhizz问题示例
May 05 Python
python使用calendar输出指定年份全年日历的方法
Apr 04 Python
用Python编写简单的微博爬虫
Mar 04 Python
Python线程指南详细介绍
Jan 05 Python
Python+Socket实现基于UDP协议的局域网广播功能示例
Aug 31 Python
python tensorflow基于cnn实现手写数字识别
Jan 01 Python
使用Python机器学习降低静态日志噪声
Sep 29 Python
python实现智能语音天气预报
Dec 02 Python
Python Socket TCP双端聊天功能实现过程详解
Jun 15 Python
python 爬取免费简历模板网站的示例
Sep 27 Python
Pandas之缺失数据的实现
Jan 06 Python
Python turtle编写简单的球类小游戏
Mar 31 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
别人整理的服务器变量:$_SERVER
2006/10/20 PHP
PHP采集类snoopy详细介绍(snoopy使用教程)
2014/06/19 PHP
PHP中设置一个严格30分钟过期Session面试题的4种答案
2014/07/30 PHP
PHP引用返回用法示例
2016/05/28 PHP
PHP token验证生成原理实例分析
2019/06/05 PHP
深入理解JavaScript系列(38):设计模式之职责链模式详解
2015/03/04 Javascript
php结合imgareaselect实现图片裁剪
2015/07/05 Javascript
JS使用eval解析JSON的注意事项分析
2015/11/14 Javascript
浅析angularJS中的ui-router和ng-grid模块
2016/05/20 Javascript
json定义及jquery操作json的方法
2016/09/29 Javascript
jQuery+CSS3实现点赞功能
2017/03/13 Javascript
详解Angular 4.x NgIf 的用法
2017/05/22 Javascript
AngularJs导出数据到Excel的示例代码
2017/08/11 Javascript
vue源码学习之Object.defineProperty 对数组监听
2018/05/30 Javascript
解决Angular4项目部署到服务器上刷新404的问题
2018/08/31 Javascript
详解vue项目打包步骤
2019/03/29 Javascript
浅谈对于react-thunk中间件的简单理解
2019/05/01 Javascript
在vue中使用防抖函数组件操作
2020/07/26 Javascript
ant design pro中可控的筛选和排序实例
2020/11/17 Javascript
pygame游戏之旅 添加碰撞效果的方法
2018/11/20 Python
Python3实现对列表按元组指定列进行排序的方法分析
2018/12/22 Python
Python实现的ftp服务器功能详解【附源码下载】
2019/06/26 Python
python监控进程状态,记录重启时间及进程号的实例
2019/07/15 Python
python实现几种归一化方法(Normalization Method)
2019/07/31 Python
pyautogui自动化控制鼠标和键盘操作的步骤
2020/04/01 Python
Python使用多进程运行含有任意个参数的函数
2020/05/02 Python
RetroStage德国:复古服装
2019/02/03 全球购物
精彩广告词大全
2014/03/19 职场文书
财务担保书范文
2014/04/02 职场文书
语文教研活动总结
2014/07/02 职场文书
红领巾广播站广播稿
2014/10/19 职场文书
邀请函样本
2015/02/02 职场文书
2015年小学美术工作总结
2015/05/25 职场文书
工作经历证明范本
2015/06/15 职场文书
公务员处分决定书
2015/06/25 职场文书
python操作xlsx格式文件并读取
2021/06/02 Python