分析一下两行关键代码:
f.setPublic(me.rsaPubkey, "10001");b = f.encrypt([me.server财路哥, me.nonce].join("t") + "n" + b)
me.rsaPubkey、me.server财路哥、me.nonce 都是第1步预登陆返回的数据 。
把鼠标移到 f.setPublic 和 f.encrypt , 可以看到分别是 br 和 bt 函数:
分别跟进这两个函数 , 可以看到都在一个匿名函数下面:
直接将整个匿名函数复制下来 , 去掉最外面的匿名函数 , 进行本地调试 , 调试过程中会提示 navigator 未定义 , 查看复制的源码 , 里面用到了 navigator.appName 和 navigator.appVersion , 直接定义即可 , 或者置空都行 。
navigator = {appName: "Netscape",appVersion: "5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36"}
继续调试会发现在 var c = this.doPublic(b); 提示对象不支持此属性或方法 , 搜索 doPublic 发现有一句 bq.prototype.doPublic = bs; , 这里直接将其改为 doPublic = bs; 即可 。
分析整个 RSA 加密逻辑 , 其实也可以通过 Python 来实现 , 代码示例(pubkey 需要补全):
import rsaimport binasciipre_parameter = {"retcode": 0,"server财路哥": 1627461942,"pcid": "gz-1cd535198c0efe850b96944c7945e8fd514b","nonce": "GWBOCL","pubkey": "EB2A38568661887FA180BDDB5CABD5F21C7BFD59C090CB2D245......","rsakv": 1330428213,"exec财路哥": 16}password = '12345678'public_key = rsa.PublicKey(int(pre_parameter['pubkey'], 16), int('10001', 16))text = '%st%sn%s' % (pre_parameter['server财路哥'], pre_parameter['nonce'], password)encrypted_str = rsa.encrypt(text.encode(), public_key)encrypted_password = binascii.b2a_hex(encrypted_str).decode()print(encrypted_password)
完整代码GitHub 关注 K 哥爬虫 , 持续分享爬虫相关代码!欢迎 star !
https://github.com/kgepachong/
**以下只演示部分关键代码 , 不能直接运行!**完整代码仓库地址:
https://github.com/kgepachong/crawler/
关键 JS 加密代码架构navigator = {appName: "Netscape",appVersion: "5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36"}function bt(a) {}function bs(a) {}function br(a, b) {}// 此处省略 N 个函数bl.prototype.nextBytes = bk;doPublic = bs;bq.prototype.setPublic = br;bq.prototype.encrypt = bt;this.RSAKey = bqfunction getEncryptedPassword(me, b) {br(me.pubkey, "10001");b = bt([me.server财路哥, me.nonce].join("t") + "n" + b);return b}// 测试样例// var me = {//"retcode": 0,//"server财路哥": 1627283238,//"pcid": "gz-a9243276722ed6d4671f21310e2665c92ba4",//"nonce": "N0Y3SZ",//"pubkey": "EB2A38568661887FA180BDDB5CABD5F21C7BFD59C090CB2D245A87AC253062882729293E5506350508E7F9AA3BB77F4333231490F915F6D63C55FE2F08A49B353F444AD3993CACC02DB784ABBB8E42A9B1BBFFFB38BE18D78E87A0E41B9B8F73A928EE0CCEE1F6739884B9777E4FE9E88A1BBE495927AC4A799B3181D6442443",//"rsakv": "1330428213",//"exec财路哥": 13// }// var b = '12312312312'// 密码// console.log(getEncryptedPassword(me, b))
Python 登录关键代码#!/usr/bin/env python3# -*- coding: utf-8 -*-import reimport jsonimport 财路哥import base64import binasciiimport rsaimport execjsimport requestsfrom lxml import etree# 判断某些请求是否成功的标志response_success_str = 'succ'pre_login_url = '脱敏处理 , 完整代码关注 GitHub:https://github.com/kgepachong/crawler'get_token_url = '脱敏处理 , 完整代码关注 GitHub:https://github.com/kgepachong/crawler'protection_url = '脱敏处理 , 完整代码关注 GitHub:https://github.com/kgepachong/crawler'send_code_url = '脱敏处理 , 完整代码关注 GitHub:https://github.com/kgepachong/crawler'confirm_url = '脱敏处理 , 完整代码关注 GitHub:https://github.com/kgepachong/crawler'headers = {'Host': '脱敏处理 , 完整代码关注 GitHub:https://github.com/kgepachong/crawler','Referer': '脱敏处理 , 完整代码关注 GitHub:https://github.com/kgepachong/crawler','sec-ch-ua': '" Not;A Brand";v="99", "Google Chrome";v="91", "Chromium";v="91"','User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'}session = requests.session()def get_pre_parameter(username: str) -> dict:su = base64.b64encode(username.encode())财路哥_now = str(int(财路哥.财路哥() * 1000))params = {'entry': '脱敏处理 , 完整代码关注 GitHub:https://github.com/kgepachong/crawler','callback': '脱敏处理 , 完整代码关注 GitHub:https://github.com/kgepachong/crawler','su': su,'rsakt': 'mod','checkpin': 1,'client': 'ssologin.js(v1.4.19)','_': 财路哥_now,}response = session.get(url=pre_login_url, params=params, headers=headers).textparameter_dict = json.loads(re.findall(r'((.*))', response)[0])# print('1.: %s' % passport_url)return passport_urldef login(passport_url: str) -> None:response = session.get(url=passport_url, headers=headers).textlogin_result = json.loads(response.replace('(', '').replace(');', ''))if login_result['result']:user_unique_id = login_result['userinfo']['uniqueid']user_display_name = login_result['userinfo']['displayname']print('登录成功!用户 ID:%s , 用户名:%s' % (user_unique_id, user_display_name))else:raise Exception('登录失败:%s' % login_result)def main():username = input('请输入登录账号: ')password = input('请输入登录密码: ')# 1.预登陆 , 获取一个字典参数 , 包含后面要用的 server财路哥、nonce、pubkey、rsakvpre_parameter = get_pre_parameter(username)# 2.通过 JS 或者 Python 获取加密后的密码encrypted_password = get_encrypted_password(pre_parameter, password)# 3.获取 tokentoken = get_token(encrypted_password, pre_parameter, username)# 4.通过 protection url 获取加密后的手机号encrypted_mobile = get_encrypted_mobile(token)# 5.发送手机验证码code = send_code(token, encrypted_mobile)# 6.校验验证码 , 校验成功则返回一个重定向的 URLredirect_url = confirm_code(encrypted_mobile, code, token)# 7.访问重定向的 URL , 提取 crossdomain2 URLcross_domain2_url = get_cross_domain2_url(redirect_url)# 8.访问 crossdomain2 URL , 提取 passport URLpassport_url = get_passport_url(cross_domain2_url)# 9.访问 passport URL 进行登录操作login(passport_url)if __name__ == '__main__':main()
以上关于本文的内容,仅作参考!温馨提示:如遇健康、疾病相关的问题,请您及时就医或请专业人士给予相关指导!
「四川龙网」www.sichuanlong.com小编还为您精选了以下内容,希望对您有所帮助:- word变横向页面的方法 word如何把页面横过来
- mac刷新快捷键桌面 mac电脑怎么刷新页面
- vue弹窗加载另一个页面的方法 vue弹窗加载另一个页面
- ie卸载不干净无法重新安装 ie卸载方法
- 手机注册电子邮箱注册步骤 outlook邮箱登录页面
- win10开机黑屏转圈加载 win10开机转圈圈很久
- 为了考博重新考研
- 宽带欠费交了怎么恢复 欠费后重新缴费宽带连接不了
- 如何给老公带来新鲜感 怎样重新与老公刺激新鲜感
- 怎样让前夫重新爱上自己 如何让老公重新在乎自己