验证码破解
HTTP的响应状态码:
1xx 消息,一般是告诉客户端,请求已经收到了,正在处理,别急...
2xx 处理成功,一般表示:请求收悉、我明白你要的、请求已受理、已经处理完成等信息.
3xx 重定向到其它地方。它让客户端再发起一个请求以完成整个处理。
4xx 处理发生错误,责任在客户端,如客户端的请求一个不存在的资源,客户端未被授权,禁止访问等。
5xx 处理发生错误,责任在服务端,如服务端抛出异常,路由出错,HTTP版本不支持等。
验证码处理:
- 1.对携带验证码的页面数据进行抓取
- 2.可以将页面数据中验证码进行解析,验证码图片下载到本地
- 3.可以将验证码图片提交给三方平台进行识别,返回验证码图片上的数据值
- 云打码平台:
- 1.在官网中进行注册(普通用户和开发者用户)
- 2.登录开发者用户:
- 1.实例代码的下载(开发文档-》调用实例及最新的DLL-》PythonHTTP实例下载)
- 2.创建一个软件:我的软件-》添加新的软件
-3.使用示例代码中的源码文件中的代码进行修改,让其识别验证码图片中的数据值
模拟登录:
# 人人网携带验证码的模拟登录
# 1.识别验证码
import time
import random
import requests
from lxml import etree
from urllib import request
from code_class import YDMHttp
requests = requests.Session()
def get_code_text(code_type, file_path):
result = None
# 普通用户名
username = 'username'
# 密码
password = 'password'
# 软件ID,开发者分成必要参数。登录开发者后台【我的软件】获得!
appid = 7971
# 软件密钥,开发者分成必要参数。登录开发者后台【我的软件】获得!
appkey = 'b6fef487706d29041c20e6f9da220669'
# 图片文件
filename = file_path
# 验证码类型,# 例:1004表示4位字母数字,不同类型收费不同。请准确填写,否则影响识别率。在此查询所有类型 http://www.yundama.com/price.html
codetype = code_type
# 超时时间,秒
timeout = 30
# 检查
if (username == 'username'):
print('请设置好相关参数再测试')
else:
# 初始化
yundama = YDMHttp(username, password, appid, appkey)
# 登陆云打码
uid = yundama.login();
print('uid: %s' % uid)
# 查询余额
balance = yundama.balance();
print('balance: %s' % balance)
# 开始识别,图片路径,验证码类型ID,超时时间(秒),识别结果
cid, result = yundama.decode(filename, codetype, timeout);
print('cid: %s, result: %s' % (cid, result))
return result
def get_unique_timestamp():
"""
获取人人网登录地址时间戳
:return:
"""
localtime = time.localtime()
today = int(time.strftime("%w"))
ran_num = random.randint(1000, 99999)
unique_time_stamp = str(localtime[0]) + str(localtime[1] - 1) + str(today) + str(localtime[3]) + str(ran_num)
return unique_time_stamp
url = "http://www.renren.com/"
headers = {
"Connection": "close",
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.80 Safari/537.36"
}
page_text = requests.get(url=url, headers=headers).text
# 解析出验证码图片的地址
tree = etree.HTML(page_text)
img_url = tree.xpath('//*[@id="verifyPic_login"]/@src')[0]
print(img_url)
page_content = requests.get(url=img_url, headers=headers).content
with open('./img_code.jpg', 'wb') as f:
f.write(page_content)
# 使用打码平台识别验证码
code_text = get_code_text(1006, './img_code.jpg')
print(code_text)
# code_text = input("请输入验证码: ")
# 获取登录动态码参数rkey
get_key_url = "http://login.renren.com/ajax/getEncryptKey"
data_json = requests.get(url=get_key_url, headers=headers).json()
print(data_json) # {'isEncrypt': True, 'e': '10001', 'n': 'c98650a51a42c2522d67a37c13ae142be25821ac23074db8a8863114e22399f5', 'maxdigits': '19', 'rkey': '0452cd7fedabf16e84a21d42ee7b46d4'}
rkey = data_json['rkey']
# 模拟登录
login_url = "http://www.renren.com/ajaxLogin/login?1=1&uniqueTimestamp={}".format(get_unique_timestamp())
data = {
"email": "email",
"icode": code_text,
"origURL": "http://www.renren.com/home",
"domain": "renren.com",
"key_id": "1",
"captcha_type": "web_login",
"password": "53ed186e58ff5426ded959d41ac86024c0e31a9fdd32dc762afa8bda262dc0b4",
"rkey": rkey,
"f": "http%3A%2F%2Fwww.renren.com%2FSysHome.do"
}
"""
现在遇到的问题是密码属于RSA动态加密的,解决方案可参考文档https://blog.csdn.net/livecoldsun/article/details/30067165
"""
response = requests.post(url=login_url, headers=headers, data=data)
print(response.json())
模拟登录人人网