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自行修改