python 四六级成绩查询 验证码识别 中国教育考试网 多线程

# -*- coding: utf-8 -*-

import sysfrom ctypes import *import requests
import re
import threading
# 下载接口放目录 http://www.yundama.com/apidoc/YDM_SDK.html
# 错误代码请查询 http://www.yundama.com/apidoc/YDM_ErrorCode.html
# 所有函数请查询 http://www.yundama.com/apidoc

class Cet():
    def __init__(self,kh,name):
        self.name=name
        self.kh=kh
        self.s=requests.session()
        print('>>>正在初始化...')
        self.YDMApi = windll.LoadLibrary('yundamaAPI')
        # 1. http://www.yundama.com/index/reg/developer 注册开发者账号
        # 2. http://www.yundama.com/developer/myapp 添加新软件
        # 3. 使用添加的软件ID和密钥进行开发,享受丰厚分成
        self.appId = 3912   # 软件ID,开发者分成必要参数。登录开发者后台【我的软件】获得!
        self.appKey = b'e2bafb5103206d8480ddb7ce3af2d082'     # 软件密钥,开发者分成必要参数。登录开发者后台【我的软件】获得!
        print('软件ID:%d\r\n软件密钥:%s' % (self.appId, self.appKey))
        # 注意这里是普通会员账号,不是开发者账号,注册地址 http://www.yundama.com/index/reg/user
        # 开发者可以联系客服领取免费调试题分
        self.username = b'test'
        self.password = b'test'
        ########################## 普通识别函数 YDM_DecodeByPath #########################
        print('\r\n>>>正在登陆...')
        # 第一步:初始化云打码,只需调用一次即可
        self.YDMApi.YDM_SetAppInfo(self.appId, self.appKey)
        # 第二步:登陆云打码账号,只需调用一次即可
        self.uid = self.YDMApi.YDM_Login(self.username, self.password)

        self.s = requests.session()
        self.s.headers = {
            'User-Agent': 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 10.0; WOW64; Trident/7.0; .NET4.0C; .NET4.0E; .NET CLR 2.0.50727; .NET CLR 3.0.30729; .NET CLR 3.5.30729)',
            'Host': 'cet.neea.edu.cn',
            'Referer': 'http://cet.neea.edu.cn/cet/'
        }
        url = 'http://cet.neea.edu.cn/cet/'
        self.s.get(url)
        self.submibt()
    def submibt(self):
        v=self.get_yzm()
        url='http://cache.neea.edu.cn/cet/query'
        #print v
        data={
            'data':'CET6_171_DANGCI,'+self.kh+','+self.name+'',
            'v':v
        }
        res=self.s.post(url,data=data)
        rq=re.compile(':\'(.*?)\'}')
        res=rq.findall(res.content)
        if res[0]=="您查询的结果为空!":
            print 'no res'+self.kh
        elif res[0]=="抱歉,验证码错误!":
            self.submibt()
        else:
            print 'find res'+self.kh
            with open("res.txt",'w') as f:
                f.write('find res'+self.kh)
            sys.exit(0)

    def get_yzm(self):
        url = 'http://cache.neea.edu.cn/Imgs.do?ik='+str(self.kh)+'&t=0.229722587762221'
        res = self.s.get(url)
        rq = re.compile('\"(.*?)"')
        res = rq.findall(res.text)[0]
        res = self.s.get(res)
        with open(self.kh+".jpg", 'wb') as f:
            f.write(res.content)
        #print('验证码获取over!')
        return self.yzm_sb()
    def yzm_sb(self):
        # 例:1004表示4位字母数字,不同类型收费不同。请准确填写,否则影响识别率。在此查询所有类型 http://www.yundama.com/price.html
        codetype = 1004
        # 分配30个字节存放识别结果
        result = c_char_p(b"                              ")
        # 识别超时时间 单位:秒
        timeout = 60
        # 验证码文件路径
        filename = self.kh+'.jpg'
        # 一键识别函数,无需调用 YDM_SetAppInfo 和 YDM_Login,适合脚本调用
        captchaId = self.YDMApi.YDM_EasyDecodeByPath(self.username, self.password, self.appId, self.appKey, filename, codetype, timeout, result)
        #print("一键识别:验证码ID:%d,识别结果:%s" % (captchaId, result.value))# 例:1004表示4位字母数字,不同类型收费不同。请准确填写,否则影响识别率。在此查询所有类型 http://www.yundama.com/price.html
        return result.value
#考场号起始位置
kch=''
name=''
for i in range(0,10):
    kch+=100
    # 每一个考场30人
    for i in range(0, 30):
        kch += 1
        t = threading.Thread(target=Cet, args=(str(kch),name))
        t.start()

使用的打码平台

因为一些原因我使用的是2.7的版本,py3自行修改

posted @ 2017-08-25 17:07  cnlh  阅读(1258)  评论(0编辑  收藏  举报