本帖最后由 榆生丶大牛 于 2022-11-10 14:21 编辑
构建登录请求
先抓包登录接口
发现密码和账户是加密过的 如下图
通过调用堆栈 发现是AES加密 如下图
密匙直接看到是 u2oh6Vu^HWe4_AES
其实偏移也是这个
网上抄袭的AES加密的代码 修改了一下直接拿来用了
import base64
from Crypto.Cipher import AES
AESKEY = 'u2oh6Vu^HWe4_AES' # 请修改 一定是 16位的字符串
AESIV = 'u2oh6Vu^HWe4_AES' # 和KEY保持一致即可
class AESTool:
def __init__(self):
self.key = AESKEY.encode('utf-8')
self.iv = AESIV.encode('utf-8')
def pkcs7padding(self, text):
"""
明文使用PKCS7填充
"""
bs = 16
length = len(text)
bytes_length = len(text.encode('utf-8'))
padding_size = length if (bytes_length == length) else bytes_length
padding = bs - padding_size % bs
padding_text = chr(padding) * padding
self.coding = chr(padding)
return text + padding_text
def aes_encrypt(self, content):
"""
AES加密
"""
cipher = AES.new(self.key, AES.MODE_CBC, self.iv)
# 处理明文
content_padding = self.pkcs7padding(content)
# 加密
encrypt_bytes = cipher.encrypt(content_padding.encode('utf-8'))
# 重新编码
result = str(base64.b64encode(encrypt_bytes), encoding='utf-8')
return result
def aes_decrypt(self, content):
"""
AES解密
"""
cipher = AES.new(self.key, AES.MODE_CBC, self.iv)
content = base64.b64decode(content)
text = cipher.decrypt(content).decode('utf-8')
return self.pkcs7padding(text)
构建视频播放请求
视频播放抓包如下图
参数的来源和作用 一个一个分析的话过于繁琐
这里直接跟你们简单说下作用和来源把吧
"clazzId": "61611875", # 视频有关 通过课程列表获取
"playingTime": "82",# 已播放时长 跟
"duration":"400" #发送请求时 视频播放到的时长
"clipTime": "0_400" # 视频的总时长
"objectId": "7bdeb5431692e53faea60f183cbb0411", # 当前播放的视频的信息 来源是服务器返回
"otherInfo": "nodeId_637889344-cpi_208839772-rt_d-ds_d-ff_1-be_0_0-vt_1-v_6-enc_d7f81a4d4319155dadd3a1586d45a8e8", # 根据播放的视频变化而变化 服务器返回
"courseId": "227801601", #视频有关 当前播放的课程ID
"jobid": "1629619820783362", # 跟视频有关
"userid": "200830620",# 跟登录的账号有关
"isdrag": "3",# 3 代表点击暂停 2代表点击播放 0代表心跳包 4代表视频播放结束
"view": "pc",# 固定
"enc": "c41bca3032d64e562ef3f51b9988ac64", # 把对应的值替换进这个字符串进行md5加密 '[clazzId][userid][jobid][objectId][duration*1000][d_yHJ!$pdA~5][视频的总时长*1000][clipTime]'
"rt": "0.9", #这个参数 会根据播放内容的详细类型变动 如视频又分为 MP4 mov 音频又分为MP3
"dtype": "Video",#这个参数会根据任务节点是视频还是音频又或者是文档 变换
"_t": "1667034959960" # 时间戳
综上所述,实现自动播放大致有下面几个步骤
-
先发送登录请求 获取Cookie 下面的这几个Cookie是关键Cookie 缺失的话无法请求到数据
# 关键cookie
"_uid": "200830620", # 用户ID
"_d": "1667037792758", # 时间戳
# 服务器返回
"vc3": "OKt0tYz42iQ%2Fbf1WhXi9zWJFKkH8UCYm86eodZDD19zVLObi4ureRg1THs37Qcyh7hZvJtfHCOW1D0HdArENGvpZ73joesKVDPoxVF9hPrD4BmsdCSmt6wTQjNjI6%2FfRebtQNbtR%2FyPnBicoFHMeU5DUN7%2BoYA%2BQA5t2BctLVWs%3De12778ffce0f0fb992da4f65185d815d",
# 视频ID 可有可无
"videojs_id": "7849012"
"k8s" 这个cookie 在输入验证码时不可缺失
-
再去遍历课程列表 拿到课程ID(courseId) 任务节点ID(jobid) 构建请求 得到对应的视频ID 如otherInfo、objectId、clipTime
-
通过第二部得到的视频参数 ,构建视频播放时的请求,设计时间间隔定时发送即可 注:视频的心跳包 是60s一次
分享下成品代码,写的不好,请笑纳
链接:https://pan.baidu.com/s/1Wd40Sp-DsagGybpRHAaZPQ?pwd=52pj
提取码:52pj
|