某智慧教育平台登录流程分析
本文档仅对某智慧教育平台登录过程进行了分析,并未提供相应js与py程序。
1. 获取 session_id
和 session_key
-
程序名称:
get_session_id_key.py
-
功能: 执行此程序以获取后续流程所需的
session_id
和session_key
。 -
响应结构示例:
{"session_id": "b8cc1dee-7cf7-477b-8e43-3698b01eb622","session_key": "LQxLBLZu","is_normal": true }
2. 获取 randstr
和 ticket 破解腾讯滑块验证码
- 程序名称:
get_ticket_randstr.py
- 功能: 获取用于人机验证的
randstr
和ticket
值。 - 响应结构示例:
{"errorCode": "0","randstr": "@6H5","ticket": "tr03G-Ln9nPHEpUq7QBwcLvCayfSmVxx-1zgux2aoXWW32wvCnWiXuIWNxAY8eaUY9OoAuuG3hnzD_aBpe1tzWkOyqoZHR99Y1Kp6XrGpgrGw3I35DZ_BFLTrPLYAA0zJUQnx4N-zoQiVRc*","traceId": "","errMessage": "","sess": "" }
3. 获取 identify_code
- 程序名称:
get_identify_code.py
- 功能: 使用上一步获取的
ticket
和randstr
来获取验证码identify_code
。 - 关键实现:
- 在此程序中,需要动态拼接请求的 URL。
- URL 模板:
https://uc-gateway.ykt.eduyun.cn/v1.1/sessions/{session_id}/third_captcha_code/valid
- 注意: URL中的
{session_id}
必须替换为第 1 步中获取的实际session_id
。
4. 获取 sensorsdata2015jssdkcross
-
程序名称:
get_and_encode_sensorsdata2015jssdkcross.py
-
功能: 获取用于神策数据分析的加密字符串
sensorsdata2015jssdkcross
。
5. 加密登录凭证
- 程序名称:
get_loginname_password_zhitongpassword.py
- 功能: 对用户的手机号和密码进行加密,生成最终登录请求所需的
login_name
、password
和zhitong_password
。 - 初始变量:
username
= “你的手机号”password
= “你的登录密码”zhitong_password
= “你的登录密码此处与password的值是一样的”
- 加密依赖: 加密计算过程中需要使用第 1 步获取的
session_key
。
6. 执行登录并获取 token
- 程序名称:
login_get_token.py
- 功能: 整合所有前面步骤获取的参数,发起最终的登录请求,以获取
token
。 - 所需参数:
session_id
login_name
(加密后)password
(加密后)identify_code
zhitong_password
(加密后)
- 请求参数结构示例:
params = {"$proxy": "proxyhttp","bodys": "{\"$headers\":{\"Accept\":\"application/json\",""\"Content-Type\":\"application/json\",""\"SDP-APP-ID\":\"e5649925-441d-4a53-b525-51a2f1c4e0a8\",""\"UC-COLL\":\"e5649925-441d-4a53-b525-51a2f1c4e0a8/1.0(Win10;Chrome138;1707x961;JwWin10/Chrome138/7b50eb2c-8e5e-4bab-aa93-d1cf57205b5c;)\",""\"Host\":\"sso.basic.smartedu.cn\"},""\"$body\":{\"session_id\":\"前面获取的session_id\",""\"login_name\":\"加密后的用户名\",""\"password\":\"加密后的密码\",""\"identify_code\":\"前面获取的identify_code\",""\"zhitong_password\":\"前面加密后的密码,这个与登录密码加密方式不同\"},""\"$method\":\"post\"}","callback": "nd_uc_sdk_时间戳" }
关键输入与输出
步骤编号 | 流程节点 | 详细说明 | 关键输入/依赖 | 关键输出 |
---|---|---|---|---|
1 | 获取Session | 向 uc-gateway.ykt.eduyun.cn 服务器发送POST请求,以获取一次性的会话ID和加密密钥。这是所有后续加密操作的基础。 | device_id (一个固定的设备标识符) | session_id , session_key |
2 | 破解腾讯滑块验证码 | 模拟浏览器行为,完成腾讯防水墙的滑块验证。这个过程非常复杂,包括获取任务、计算PoW、生成浏览器指纹、识别滑块缺口距离(使用ddddocr)、并最终提交验证。 | requests 会话 (保持Cookie) | ticket , randstr |
3 | 获取Identify Code | 将上一步获得的ticket 和randstr ,连同第一步的session_id ,发送到服务器进行校验,以换取一个内部验证码identify_code 。 | session_id , ticket , randstr | identify_code |
4 | 生成神策Cookie | 调用外部的Node.js脚本 (generate_sensors_data.js ) 来模拟神策分析SDK的行为,生成一个用于追踪和风控的sensorsdata2015jssdkcross Cookie值。 | generate_sensors_data.js | 经过URL编码的Cookie字符串 |
5 | 加密登录凭据 | 使用第一步获取的session_key ,对用户的login_name 、password 和zhitong_password 进行DES加密。关键点:password 的MD5哈希计算使用了latin-1 编码来处理盐值中的特殊字符。 | session_key , 用户名, 密码 | 加密后的凭据 |
6 | 发起最终登录请求 | 将前面所有步骤获得的数据(session_id , identify_code , 加密凭据, 神策Cookie等)打包成一个复杂的bodys 参数,通过JSONP的方式发送给登录接口。 | 所有之前步骤的输出 | 服务器返回的原始Token响应 |
7 | 转换并保存Token | 这是登录成功的后续处理,也是最关键的一步。 | 原始Token响应, session_key | 最终的smartedu_token.json 文件 |
7a | 解密$body | 从登录响应中提取$body 对象,并使用session_key 解密其中的user_id 和mac_key 字段。 | session_key , $body 对象 | 包含明文敏感信息的Token对象 |
7b | 计算diff 字段 | 检查解密后的Token对象是否存在diff 字段。如果不存在,则根据server_time 和当前本地时间计算出差值并添加到对象中。这是确保后续API签名正确的关键。 | 解密后的Token对象 | 包含diff 字段的完整Token对象 |
7c | 序列化和计算过期时间 | 将完整的Token对象转换为一个紧凑的JSON字符串(作为value ),并从expires_at 字段计算出毫秒级时间戳(作为expire )。 | 完整的Token对象 | value 字符串, expire 时间戳 |
7d | 生成.json 文件 | 将value 和expire 写入smartedu_token.json 文件,格式严格遵循下载程序的要求。 | value 字符串, expire 时间戳 | smartedu_token.json 文件 |