目的
- 通过python模拟登录学习通。
- 目标网址:aHR0cHM6Ly9wYXNzcG9ydDIuY2hhb3hpbmcuY29tL2xvZ2lu
过程
找请求接口
- 既然我们是登录过程,在一开始就可以找下有没有带着login字眼的请求,再结合payload中,请求所携带的参数uname和password,这应该就是用户登录的第一个请求。
明确请求参数
-
在明确了要请求哪个接口后,复制其cURL(bash)到postman或者reqable中进行请求重放。根据返回的结果,对不必要的请求参数进行删减。然后剩下图中所示的请求参数。
-
-
然后再把cURL(bash)复制到在线网站,一键生成python代码,最后看下请求返回值是否跟刚刚的一致。如果不一致可能是你的tls指纹问题,也有可能是你把请求参数压缩了,然后给检测到。
-
cURL转Python代码的在线网站:https://spidertools.cn/#/curl2Request
-
通过上边的步骤,剔除掉无关的请求参数后,发现就uname和password是需要加密的。
找函数入口
-
直接全局搜索变量名password,也可以password : ,password =,或者直接搜encrypt。觉得可疑的也可以都打上断点。下面是看到了ajax所以就八九不离十了,接着就是往上找含有pwd和phone,可疑就打断点,然后不断往上看,直到整个函数loginByPhoneAndPwdSubmit的头部,函数传参也要看(如果有的话)。
-
-
打完断点就登录一下试试,登录的时候,最好用固定的账号密码,以便以后遇到一些加密字符串你能够靠经验猜测出来。
-
-
函数加密入口:
抠代码
- 反手先把加密函数扣下来,然后补齐需要的环境。然后就得到结果了。我直接把源码都放出来了,因为就导个加密库就可以了。
源码
import requests
import execjs
import time
def main(username, password, isProxy, Port):
"""
目的:学习通登录过程
"""
headers = {'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8'}
cookies = {}
data = {
'uname': '',
'password': '',
'refer': 'https%3A%2F%2Fi.chaoxing.com',
't': 'true',
}
# 代理
proxies = {} if not isProxy else {
'http': f'http://127.0.0.1:{Port}',
'https': f'http://127.0.0.1:{Port}',
}
# 该秘钥在加密函数入口处上方
aeskey = "u2oh6Vu^HWe4_AES" # arg1 aes加密秘钥写死,后面可能要改
# 导入加密函数文件
with open('./xxt.js', 'r', encoding="utf-8") as f:
js_code = f.read()
# 编译js代码
code = execjs.compile(js_code)
# js代码执行
encoded_username = code.call("encryptByAES", username, aeskey)
encoded_password = code.call("encryptByAES", password, aeskey)
# 修改payload中的值
data["uname"] = encoded_username
data["password"] = encoded_password
print(f"加密后的账户名 ------->>> {encoded_username}")
print(f" 加密后的密码 ------->>> {encoded_password}")
# 建立session会话
session = requests.Session()
# 第一次请求返回固定值: 'https%3A%2F%2Fi.chaoxing.com%2F' ,其实就是经过了uri编码,encodeURIComponent("https://i.chaoxing.com/")
first_response = session.post('https://passport2.chaoxing.com/fanyalogin', headers=headers, cookies=cookies, data=data, proxies=proxies)
# 第二次请求重定向可加可不加
# second_response = session.get("https://i.chaoxing.com/", headers=headers, cookies=cookies, data=data, proxies=proxies)
# 第三次请求返回数据仅可获取个人空间少部分数据,课程数据在另一个ajax请求返回
timestamp = int(time.time()*1000)
third_response = session.get(f"https://i.chaoxing.com/base?t={timestamp}", headers=headers, cookies=cookies, data=data, proxies=proxies)
# print(third_response.text)
if __name__ == "__main__":
# 输入你的用户名和密码
username = "12345678910"
password = "123456"
# isProxy标识是否使用代理,Port为代理端口,默认不使用。若要使用代理访问网页,请设置为True,代理默认使用7890端口
isProxy = False
Port = 7890
main(username, password, isProxy, Port)
const CryptoJS = require("crypto-js");
function encryptByAES(message, key){
let CBCOptions = {
iv: CryptoJS.enc.Utf8.parse(key),
mode:CryptoJS.mode.CBC,
padding: CryptoJS.pad.Pkcs7
};
let aeskey = CryptoJS.enc.Utf8.parse(key);
let secretData = CryptoJS.enc.Utf8.parse(message);
let encrypted = CryptoJS.AES.encrypt(
secretData,
aeskey,
CBCOptions
);
return CryptoJS.enc.Base64.stringify(encrypted.ciphertext);
}
// console.log(encryptByAES("12345678910", "u2oh6Vu^HWe4_AES"));
总结
- 这一章节只能算是练练python语法,下次弄下学习通个人空间的课程列表页。
免责声明:本文仅供学习和研究目的,禁止用于任何商业用途。读者在使用爬虫技术时需遵守相关法律法规,本文作者不对读者在使用爬虫技术时可能产生的任何法律风险负责。如有任何侵权或违法行为,请及时联系作者删除相关内容。