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 七种邮件内容发送方法实例
Apr 22 Python
Sanic框架请求与响应实例分析
Jul 16 Python
python之验证码生成(gvcode与captcha)
Jan 02 Python
python自动化测试之如何解析excel文件
Jun 27 Python
Python列表的切片实例讲解
Aug 20 Python
Python的赋值、深拷贝与浅拷贝的区别详解
Feb 12 Python
Python找出列表中出现次数最多的元素三种方式
Feb 24 Python
Python装饰器实现方法及应用场景详解
Mar 26 Python
解决python脚本中error: unrecognized arguments: True错误
Apr 20 Python
基于python实现音乐播放器代码实例
Jul 01 Python
Python实现区域填充的示例代码
Feb 03 Python
使用python绘制分组对比柱状图
Apr 21 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中header跳转使用include包含解决参数丢失问题
2015/05/08 PHP
ThinkPHP实现登录退出功能
2017/06/29 PHP
php+js实现点赞功能的示例详解
2020/08/07 PHP
php的对象传值与引用传值代码实例讲解
2021/02/26 PHP
javascript的onchange事件与jQuery的change()方法比较
2009/09/28 Javascript
原生js实现给指定元素的后面追加内容
2013/04/10 Javascript
js实现简单div拖拽功能实例
2015/05/12 Javascript
JS弹性运动实现方法分析
2016/12/15 Javascript
详解Vue2.x-directive的学习笔记
2017/07/17 Javascript
使用cookie绕过验证码登录的实现代码
2017/10/12 Javascript
jquery实现联想词搜索框和搜索结果分页的示例
2018/10/10 jQuery
javascript面向对象三大特征之多态实例详解
2019/07/24 Javascript
vue elementui 实现搜索栏公共组件封装的实例代码
2020/01/20 Javascript
浅谈Vuex的this.$store.commit和在Vue项目中引用公共方法
2020/07/24 Javascript
在Python的Flask框架下使用sqlalchemy库的简单教程
2015/04/09 Python
使用Python脚本将Bing的每日图片作为桌面的教程
2015/05/04 Python
深入理解Python中装饰器的用法
2016/06/28 Python
Python使用try except处理程序异常的三种常用方法分析
2018/09/05 Python
使用Python OpenCV为CNN增加图像样本的实现
2019/06/10 Python
利用anaconda保证64位和32位的python共存
2021/03/09 Python
使用Python的datetime库处理时间(RPA流程)
2019/11/24 Python
Python常用编译器原理及特点解析
2020/03/23 Python
class类在python中获取金融数据的实例方法
2020/12/10 Python
CSS3改变浏览器滚动条样式
2019/01/04 HTML / CSS
美国最大的宠物用品零售商:PetSmart
2016/11/14 全球购物
英国游戏机和游戏购物网站:365games.co.uk
2018/06/18 全球购物
泰国网上购物:Shopee泰国
2018/09/14 全球购物
可以使用抽象函数重写基类中的虚函数吗
2013/06/02 面试题
清洁工岗位职责
2014/01/29 职场文书
个人作风建设剖析材料
2014/10/11 职场文书
社会实践活动报告
2015/02/05 职场文书
2019年圣诞节祝福语集锦
2019/12/25 职场文书
Mysql - 常用函数 每天积极向上
2021/04/05 MySQL
MySQL数据库如何使用Shell进行连接
2022/04/12 MySQL
Win10服务主机占用内存怎么办?Win10服务主机进程占用大量内存解决方法
2022/09/23 数码科技
使用CSS实现按钮边缘跑马灯动画
2023/05/07 HTML / CSS