学习笔记——12306 自动通过验证码(2)
2017-11-02 09:55
302 查看
在互联网发展的历程中,网站的验证码一直在不断的迭代更新,从最初的直接用字符作为验证码到后来的用字符生成图片,再到后来在验证码图片上加上各种各样的干扰,再到最后面的位置验证码等等,而自动验证从最初的获取验证码字符到后面的识别验证码再到最后12306的这种类型验证码几乎已经很难做到程序自动识别(可以用机器学习方式识别,但是成本很大),所以目前大部分的验证码识别都是通过云打码的方式
云打码:把验证码获取到后发送给打码平台服务器,打码平台把验证码分配给正在打码的码农,码农根据验证码输入正确的验证码信息返回给打码平台再返回给软件自动提交请求
那么首先我们要找到一个可以进行云打码的平台www.dama2.com(打码兔)首先注册一个开发者账号,然后创建好你的软件,注意打吗的类型不要选错了,是坐标1-6个
然后再创建一个用户账号(开发者账号是用来赚钱的,用户账号是需要花钱的)设置的参数主要有4个1,打码兔的账号和密码2,图片文件和打码类型3,软件ID4,软件KEY
下面是接入的http实例代码
修改下上章的demo代码
接下来就可以放心的运行了。
云打码:把验证码获取到后发送给打码平台服务器,打码平台把验证码分配给正在打码的码农,码农根据验证码输入正确的验证码信息返回给打码平台再返回给软件自动提交请求
那么首先我们要找到一个可以进行云打码的平台www.dama2.com(打码兔)首先注册一个开发者账号,然后创建好你的软件,注意打吗的类型不要选错了,是坐标1-6个
然后再创建一个用户账号(开发者账号是用来赚钱的,用户账号是需要花钱的)设置的参数主要有4个1,打码兔的账号和密码2,图片文件和打码类型3,软件ID4,软件KEY
下面是接入的http实例代码
#-*- coding:utf-8 -*- #python版本2.7 import hashlib # impo 4000 rt http.client # import urllib.request import urllib import urllib2 import json import base64 def md5str(str): #md5加密字符串 m=hashlib.md5(str.encode(encoding = "utf-8")) return m.hexdigest() def md5(byte): #md5加密byte return hashlib.md5(byte).hexdigest() class DamatuApi(): ID = '51510' KEY = '966da54dd89c627c12de3dcd47bc50e1' HOST = 'http://api.dama2.com:7766/app/' def __init__(self,username,password): self.username=username self.password=password def getSign(self,param=b''): return (md5(bytes(self.KEY) + bytes(self.username) + param))[:8] def getPwd(self): return md5str(self.KEY +md5str(md5str(self.username) + md5str(self.password))) def post(self,path,params={}): data = urllib.urlencode(params).encode('utf-8') url = self.HOST + path response = urllib2.Request(url,data) return urllib2.urlopen(response).read() #查询余额 return 是正数为余额 如果为负数 则为错误码 def getBalance(self): data={'appID':self.ID, 'user':self.username, 'pwd':dmt.getPwd(), 'sign':dmt.getSign() } res = self.post('d2Balance',data) res = str(res) jres = json.loads(res) if jres['ret'] == 0: return jres['balance'] else: return jres['ret'] #上传验证码 参数filePath 验证码图片路径 如d:/1.jpg type是类型,查看http://wiki.dama2.com/index.php?n=ApiDoc.Pricedesc return 是答案为成功 如果为负数 则为错误码 def decode(self,filePath,type): f=open(filePath,'rb') fdata=f.read() filedata=base64.b64encode(fdata) f.close() data={'appID':self.ID, 'user':self.username, 'pwd':dmt.getPwd(), 'type':type, 'fileDataBase64':filedata, 'sign':dmt.getSign(fdata) } res = self.post('d2File',data) res = str(res) jres = json.loads(res) if jres['ret'] == 0: #注意这个json里面有ret,id,result,cookie,根据自己的需要获取 return(jres['result']) else: return jres['ret'] #url地址打码 参数 url地址 type是类型(类型查看http://wiki.dama2.com/index.php?n=ApiDoc.Pricedesc) return 是答案为成功 如果为负数 则为错误码 def decodeUrl(self,url,type): data={'appID':self.ID, 'user':self.username, 'pwd':dmt.getPwd(), 'type':type, 'url':urllib.quote(url), 'sign':dmt.getSign(url.encode(encoding = "utf-8")) } res = self.post('d2Url',data) res = str(res) jres = json.loads(res) if jres['ret'] == 0: #注意这个json里面有ret,id,result,cookie,根据自己的需要获取 return(jres['result']) else: return jres['ret'] #报错 参数id(string类型)由上传打码函数的结果获得 return 0为成功 其他见错误码 def reportError(self,id): #f=open('0349.bmp','rb') #fdata=f.read() #print(md5(fdata)) data={'appID':self.ID, 'user':self.username, 'pwd':dmt.getPwd(), 'id':id, 'sign':dmt.getSign(id.encode(encoding = "utf-8")) } res = self.post('d2ReportError',data) res = str(res) jres = json.loads(res) return jres['ret'] #调用类型实例: #1.实例化类型 参数是打码兔用户账号和密码 dmt=DamatuApi("test","test") #2.调用方法: # print(dmt.getBalance()) #查询余额 # print(dmt.decode('code/code.png',287)) #上传打码,第二个位验证码类型 # print(dmt.decodeUrl('http://captcha.qq.com/getimage?aid=549000912&r=0.7257105156128585&uin=3056517021',200)) #上传打码 #print(dmt.reportError('894657096')) #上报错误 def calcCode(): code = (dmt.decode('code/code.png', 287)) code=code.replace('|',',') code=code.split(',') x_list=code[0::2] y_list=code[1::2] s="" for i in zip(x_list,y_list): y=int(i[1])-30 s+='%s,%s,'%(i[0],y) return s[:-1]账号密码要改为自己的,ID,KEY根据自己添加的软件做修改。
修改下上章的demo代码
#-*-coding:utf-8 -*- import urllib2 import urllib # 验证码登录同步 import cookielib import damatuWeb import ssl #证书验证 ssl._create_default_https_context = ssl._create_unverified_context # 请求验证码图片 c=cookielib.LWPCookieJar()#生成一个储存cookie的对象 cookie=urllib2.HTTPCookieProcessor(c)#绑定 opener=urllib2.build_opener(cookie) urllib2.install_opener(opener) # opener绑定,用opener.open请求,自带cookie,实现验证码与登陆同步 req=urllib2.Request("https://kyfw.12306.cn/passport/captcha/" "captcha-image?login_site=E&module=" "login&rand=sjrand&0.3835166812770916") codeing=opener.open(req).read()#opener fn=open('code/code.png','wb') #保存到本地 fn.write(codeing) fn.close() req=urllib2.Request('https://kyfw.12306.cn/passport' '/captcha/captcha-check') code=damatuWeb.calcCode() # code=raw_input(">>") print code data={ "answer":code, "login_site":"E", "rand":"sjrand", } data=urllib.urlencode(data)#把字典类型转变为查询字符串 html=opener.open(req,data=data).read() print html #登录 req=urllib2.Request('https://kyfw.12306.cn/passport' '/web/login') data={ 'username':'abcdert', 'password':'123456', 'appid':'otn', } data=urllib.urlencode(data) html=opener.open(req,data=data).read() print html
接下来就可以放心的运行了。
相关文章推荐
- 【学习笔记】--java通过数据库表名自动生成实体类
- MFC学习笔记之:VC6.0中通过向导添加的消息响应系统自动添加的代码及删除方式
- python学习笔记(一)爬虫实战:图片自动下载器
- InterSystems Ensemble学习笔记(二) Ensemble创建镜像, 实现自动故障转移
- linux 自动执行 crontab学习笔记
- 文字自动补全插件typeahead的使用(学习笔记)
- Cocos2d-x学习笔记(九)实例——场景自动切换
- SQL学习笔记[5] - 通过分隔符解析方式实现向SQL存储过程传递数组参数
- Extjs4学习笔记-ExtJS 4 图片验证码的实现(部分摘自《Extjs4.0学习指南(中文)》)andStruts2
- docker学习笔记10:外部通过ssh访问centos容器
- php学习的笔记。包括ubuntu16.04不显示php代码的验证码(windeow下正常)等等,实时更新
- 【微信开发学习笔记】01消息自动回复&关键词自动回复
- [Erlang 学习笔记] 通过 erlang 向服务器发送 http post 请求
- JavaWeb学习笔记-spring-15-AOP-自动创建代理
- JavaScript学习笔记8--一个文字自动匹配的例子
- 【Python学习笔记】Flaky插件自动运行失败的测试
- JAX-RPC学习笔记(2)-通过动态代理客户端访问webservice
- 【Java学习笔记】——验证码
- iQQ 学习笔记2 :借助新浪微博输入验证码、远程控制退出
- 学习笔记--自动上线