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的爬虫包Beautiful Soup中用正则表达式来搜索
Jan 20 Python
Django接受前端数据的几种方法总结
Nov 04 Python
使用Python写一个小游戏
Apr 02 Python
python将回车作为输入内容的实例
Jun 23 Python
利用Python如何批量修改数据库执行Sql文件
Jul 29 Python
python3 下载网络图片代码实例
Aug 27 Python
Python获取、格式化当前时间日期的方法
Feb 10 Python
python模拟实现分发扑克牌
Apr 22 Python
新手学习Python2和Python3中print不同的用法
Jun 09 Python
python 检测图片是否有马赛克
Dec 01 Python
Python关于拓扑排序知识点讲解
Jan 04 Python
pytorch 6 batch_train 批训练操作
May 28 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&amp;mysql(四)
2006/10/09 PHP
php缩小png图片不损失透明色的解决方法
2013/12/25 PHP
PHP全局变量与超级全局变量区别分析
2016/04/01 PHP
通过源码解析Laravel的依赖注入
2018/01/22 PHP
PHP receiveMail实现收邮件功能
2018/04/25 PHP
js 绑定键盘鼠标事件示例代码
2014/02/12 Javascript
原生js和jquery分别实现横向导航菜单效果
2016/05/13 Javascript
AngularJS表达式讲解及示例代码
2016/08/16 Javascript
AngularJS过滤器filter用法分析
2016/12/11 Javascript
jQuery遍历节点方法汇总(推荐)
2017/05/13 jQuery
解决canvas画布使用fillRect()时高度出现双倍效果的问题
2017/08/03 Javascript
微信小程序授权获取用户详细信息openid的实例详解
2017/09/20 Javascript
Vue ElementUi同时校验多个表单(巧用new promise)
2018/06/06 Javascript
微信小程序利用Canvas绘制图片和竖排文字详解
2019/06/25 Javascript
小程序如何支持使用 async/await详解
2019/09/12 Javascript
js基础之事件捕获与冒泡原理
2019/10/09 Javascript
JavaScript实现移动端带transition动画的轮播效果
2020/03/24 Javascript
JavaScript实现捕获鼠标坐标
2020/04/12 Javascript
Vue实现跑马灯效果
2020/05/25 Javascript
如何利用nodejs实现命令行游戏
2020/11/24 NodeJs
Python lambda和Python def区别分析
2014/11/30 Python
python遍历数组的方法小结
2015/04/30 Python
Python中返回字典键的值的values()方法使用
2015/05/22 Python
Python入门学习之字符串与比较运算符
2015/10/12 Python
python自动重试第三方包retrying模块的方法
2018/04/24 Python
scrapy redis配置文件setting参数详解
2020/11/18 Python
手机端用rem+scss做适配的详解
2017/11/15 HTML / CSS
英国街头品牌:Bee Inspired Clothing
2018/02/12 全球购物
Pop In A Box英国:Funko POP搪胶公仔
2019/05/27 全球购物
美国工业用品采购网站:Zoro.com
2020/10/27 全球购物
小学生美德少年事迹
2014/02/02 职场文书
外贸专业求职信
2014/03/09 职场文书
英语教师个人工作总结
2015/02/09 职场文书
李清照的诗词赏析(20首)
2019/08/22 职场文书
Vue项目中如何封装axios(统一管理http请求)
2021/05/02 Vue.js
MySQL 原理优化之Group By的优化技巧
2022/08/14 MySQL