目录
目的过程找请求接口明确请求参数找函数入口抠代码 源码总结
目的
通过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 requestsimport execjsimport timedef 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语法,下次弄下学习通个人空间的课程列表页。免责声明:本文仅供学习和研究目的,禁止用于任何商业用途。读者在使用爬虫技术时需遵守相关法律法规,本文作者不对读者在使用爬虫技术时可能产生的任何法律风险负责。如有任何侵权或违法行为,请及时联系作者删除相关内容。