学习笔记——12306 自动通过验证码(2)

在互联网发展的历程中,网站的验证码一直在不断的迭代更新,从最初的直接用字符作为验证码到后来的用字符生成图片,再到后来在验证码图片上加上各种各样的干扰,再到最后面的位置验证码等等,而自动验证从最初的获取验证码字符到后面的识别验证码再到最后12306的这种类型验证码几乎已经很难做到程序自动识别(可以用机器学习方式识别,但是成本很大),所以目前大部分的验证码识别都是通过云打码的方式

云打码:把验证码获取到后发送给打码平台服务器,打码平台把验证码分配给正在打码的码农,码农根据验证码输入正确的验证码信息返回给打码平台再返回给软件自动提交请求

那么首先我们要找到一个可以进行云打码的平台www.dama2.com(打码兔)首先注册一个开发者账号,然后创建好你的软件,注意打吗的类型不要选错了,是坐标1-6个

然后再创建一个用户账号(开发者账号是用来赚钱的,用户账号是需要花钱的)设置的参数主要有4个1,打码兔的账号和密码2,图片文件和打码类型3,软件ID4,软件KEY
下面是接入的http实例代码

#-*- coding:utf-8 -*-
#python版本2.7

import hashlib
# import 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

接下来就可以放心的运行了。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值