Python3.4 12306 2015年3月验证码识别

import ssl
import json
from PIL import Image
import requests
import re
import urllib.request as urllib2
if hasattr(ssl, ‘_create_unverified_context‘):
    ssl.create_default_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 imgCut():
   pic_obj = Image.open(‘./tmp.jpg‘)
   box = (120, 0, 290, 25)
   region = pic_obj.crop(box)
   region.save(‘./text.jpg‘)
def ocrApi():
    filename = ‘./text.jpg‘
    upload_pic_url = "http://cn.docs88.com/pdftowordupload2.php"
    filename_tmp = filename.split(‘/‘)[-1]
    headers_fake = {
        ‘ccept‘: ‘*/*‘,
        ‘Accept-Encoding‘: ‘gzip, deflate‘,
        ‘Accept-Language‘: ‘zh-CN,zh;q=0.8,en;q=0.6‘,
        ‘Connection‘: ‘keep-alive‘,
        ‘Host‘: ‘cn.docs88.com‘,
        ‘Origin‘: ‘http://cn.docs88.com‘,
        ‘User-Agent‘: ‘Mozilla/5.0 (KHTML, like Gecko) Chrome/41.0.2272.89‘,
        ‘X-Requested-With‘: ‘ShockwaveFlash/17.0.0.134‘,
        }
    para = {‘Filename‘: filename_tmp,
            ‘sourcename‘: filename_tmp,
            ‘sourcelanguage‘: ‘cn‘,
            ‘desttype‘: ‘txt‘,
            ‘Upload‘: ‘Submit Query‘,
              }
    upload_pic = requests.post(upload_pic_url, data=para, files={"Filedata" : open(filename, ‘rb‘)}, headers=headers_fake)

    text_result_url = ‘http://cn.docs88.com/‘ + str(upload_pic.content)[5:-1]
    text_result = urllib2.urlopen(text_result_url).read().decode()
    return text_result
def get_img():
    resp = urllib2.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_url = urllib2.urlopen(req).read()
    url = "http://stu.baidu.com/n/searchpc?

queryImageUrl=" + urllib2.quote(resp_url)
    req = urllib2.Request(url, headers={‘User-Agent‘: UA})
    resp = urllib2.urlopen(req)
    html = resp.read().decode()
    return baidu_stu_html_extract(html)
def baidu_stu_html_extract(html):
    pattern = re.compile(r"keywords:‘(.*?)‘")
    matches = pattern.findall(html)
    if not matches:
        return ‘[UNKOWN]‘
    json_str = matches[0]
    json_str = json_str.replace(‘\\x22‘, ‘"‘).replace(‘\\\\‘, ‘\\‘)
    result = [item[‘keyword‘] for item in json.loads(json_str)]
    return ‘|‘.join(result) if result else ‘[UNKOWN]‘
if __name__ == ‘__main__‘:
    im = get_img()
    imgCut()
    captcha_text = ocrApi()
    print(captcha_text)
    dic_list = {}
    count = 0
    for y in range(2):
        for x in range(4):
            count += 1
            im2 = get_sub_img(im, x, y)
            result = baidu_stu_lookup(im2)
            dic_list[count] = result
            print((y, x), result)
    if captcha_text.strip():
        print(‘\n可能的结果是:‘)
        maybe_result = []
        for v in dic_list:
            for c in range(len(captcha_text.strip())):
                text = (captcha_text)[c]
                if text in dic_list[v]:
                    _str_res = ‘%s --- %s‘ % (v, dic_list[v])
                    maybe_result.append(_str_res)
        for r in list(set(maybe_result)):
            print(r)
        else:
            print(‘False‘)
<span style="font-family: Arial, Helvetica, sans-serif;">改自 https://gist.github.com/Evi1m0/fbbdb1ba7c66cc4e1bb2</span>
<span style="font-family: Arial, Helvetica, sans-serif;"></span><h2 style="font-family: ‘Microsoft Yahei‘, sans-serif; margin: 0px; padding: 0px; line-height: 26px;">转载请注明作者与出处:<a target=_blank target="_blank" href="http://blog.csdn.net/u013511642" style="color: rgb(202, 0, 0); text-decoration: none;">http://blog.csdn.net/u013511642</a>   王小涛_同學</h2>
				
时间: 2024-12-09 02:08:40

Python3.4 12306 2015年3月验证码识别的相关文章

2015年11月数据安全漏洞分析报告

报告核心观点 1.千帆过尽,SQL注入仍"不改" 2.本月金融业漏洞增长尤为突出 3.11月常见数据泄露原因分析 4.解决弱口令安全建议 报告正文 2015年11月,安华每日安全资讯总结发布了126个数据泄密高危漏洞,这些漏洞分别来自乌云.补天.漏洞盒子等平台,涉及8个行业,公司机构.互联 网.交通运输.教育.金融.能源.运营商.政府.漏洞类型涉及,SQL注入.系统漏洞.弱口令等7类,其中SQL注入仍然是漏洞类型的重灾区. 千帆过尽,SQL注入仍"不改" 数据安全问

2015年3月-前端开发月刊

1. 创业 2. 职业|项目管理 3. git 4. 知乎(zhihu) 5. 其它 6. Angular 7. 看书学习 8. 移动开发 9. Html5 10. CSS3 11. Javascript 前言: 技术只是一种手段,不是目的.人生的投资有很多种,很多个方向.技术只是其中的一个方向,是目前兴趣的所在点.兴趣会随着岁月的流逝,年龄的增长,会发生变化. 当然鸡蛋不能放在一个篮子里边,所以, 有空的时候提前看看,创业类的,产品,市场,营销类的书籍,提前给自己找点出路,免得后期技术路线走不

我的Python成长之路---第一天---Python基础(作业1:登录验证)---2015年12月26日(雾霾)

1 #!/usr/bin/env python3 2 # coding:utf-8 3 ''' 4 Created on: 2015年12月29日 5 6 @author: 张晓宇 7 8 Email: [email protected] 9 10 Version: 1.0 11 12 Description: 输入用户名密码,认证成功显示欢迎信息,认证失败,输错三次后锁定 13 14 Help: 15 ''' 16 import os 17 # 定义用户信息写入函数,用于把用户信息写回文件 1

我的Python成长之路---第一天---Python基础(作业2:三级菜单)---2015年12月26日(雾霾)

#!/usr/bin/env python3 # coding:utf-8 ''' Created on: 2015年12月30日 @author: 张晓宇 Email: [email protected] Version: 1.0 Description: 三层菜单 1.菜单一共三级即:省,市,区县 2.每一级菜单输入的如果输入的是菜单里的选项则进入下级菜单 3.第1级菜单输入q退出系统 4.第2.3级菜单输入q退出系统,输入b返回上级菜单 5.三级菜单全部正确打印最后的全部选择结果,否则继续

2015年7月15日 项目开发文档

日期 2015年7月15日 星期 星期三 位置 中蓝公寓蓝芳园D507 主要工作 1)         修改小错误 2)         将发送邮件功能添加到总程序中 3)         实现了多台机器远程通信功能 4)         对系统进行JUnit 5)         对系统进行人工手动测试 遇到的问题 1)         系统无法实现进行多台机器远程通信 2)         eclipse的JUnit和netbeans不一样,但之前只学习过eclipse的JUnit 3)  

WINDOWS 10 企业版LTSB 2015年11月补丁更新情况

WINDOWS 10 企业版LTSB 2015年11月补丁与其他WINDOWS 10版本自动更新KB3105213,按微软对LTSB的规划,LTSB不会轻易增加新功能,所以不会收到其他版本推送的1511更新包,安装这个KB3105213不会改变LTSB内部版本号,LTSB目前内部版本号还是10240, 不会更新到10586版本. LTSB的内部版本按以前的官方说明,一年只会升级一次

传智播客_2015年Java基础视频-深入浅出精华版 笔记(2015年9月14日23:11:11)

本笔记是个人笔记+摘录笔记相结合,非完全原创 day01 win 7系统打开DOS有趣方法:按住shift+右键,单击“在此处打开命令窗口”(注意:在此处可以是任何的文件夹,不一定是桌面) 用DOS删除的文件不可以在回收站恢复?!! 常用DOS命令d: 回车 盘符切换dir(directory):列出当前目录下的文件以及文件夹md (make directory) : 创建目录(创建文件夹)rd (remove directory): 删除目录(删除文件夹,注意:前提是文件夹必须是空的!!)如果

2015年8月27日课程作业(文件权限管理及grep正则和扩展正则表达式)-JY1506402-19+liuhui880818

学习内容:文件权限管理及grep正则和扩展正则表达式 系统环境:CentOS 6.7/7 x86_64 一.作业(练习)内容: 1.总结本此课程中所涉及命令的使用方法及相关示例展示: 2.总结基本正则表达式及扩展正则表达式 3.显示/etc/passwd文件中以bash结尾的行 4.显示/etc/passwd文件中的两位数或三位数 5.显示`netstat -tan`命令结果中以'LISTEN'后跟0个.1个或者多个空白字符结尾的行 6.添加用户bash.testbash.basher以及nol

linux运维实战练习-2015年8月30日课程作业(练习)安排

一.作业(练习)内容: 1.总结文本编辑工具vim的使用方法: 2.总结文件查找命令find的使用方法: 3.总结bash环境变量的相关内容: 4.总结Linux文件系统上的特殊权限(SUID.SGID.Sticky)的知识点: 5.总结Linux磁盘管理.文件系统相关知识点及其相关命令的使用方法: 6.复制/etc/grub.cfg配置文件至/tmp目录,用查找替换命令删除/tmp/grub.cfg文件中的行首的空白字符: 7.复制/etc/rc.d/init.d/functions文件至/t