验证码破解

验证码破解

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())

模拟登录人人网
posted @ 2020-04-28 15:43  black__star  阅读(743)  评论(0编辑  收藏  举报