好友
阅读权限30
听众
最后登录1970-1-1
|
楼主|
pwp
发表于 2024-2-3 18:06
本帖最后由 pwp 于 2024-2-4 18:26 编辑
这个diff我是搜了好久才搜到他生成的地方,大家搜索的时候可以不再慢慢去找diff了,直接搜索t.saveToken函数就行了,这个函数原型如下,
[JavaScript] 纯文本查看 复制代码 t.saveToken = function(e, t) {
return e && !e.diff && (e.diff = e.server_time ? wt()(e.server_time).toNumber() - wt()().toNumber() : 0),
this._tokenStorage.set("token", JSON.stringify(e), void 0, t),
e
}
这个函数咋看也看不懂,让ai帮我们换一种写法并解释:
[JavaScript] 纯文本查看 复制代码 t.saveToken = function(e, t) {
if (e && !e.diff) {
e.diff = e.server_time ? wt()(e.server_time).toNumber() - wt()().toNumber() : 0;
}
this._tokenStorage.set("token", JSON.stringify(e), void 0, t);
return e;
}
这段代码是一个名为saveToken的函数,它接受两个参数:e和t。函数的作用是将一个包含令牌信息的对象e保存到本地存储中,并返回该对象。首先,函数会检查对象e是否存在且不包含diff属性。如果满足条件,它会计算diff的值并将其添加到对象e中。diff的值是通过将服务器时间(e.server_time)转换为数字并与当前时间相减得到的。接下来,函数使用this._tokenStorage.set()方法将对象e以JSON字符串的形式保存到本地存储中,键为"token",过期时间为t。最后,函数返回保存后的对象e。
这wt()又是啥,点进去后长这样:[JavaScript] 纯文本查看 复制代码 function V(e) {
var t = e.url
, n = e.headers
, r = e.data
, o = void 0 === r ? "{}" : r
, i = e.method
, s = void 0 === i ? "GET" : i
, a = e.isProxy
, c = void 0 === a || a;
n = K(K({}, F), n),
n.Host = z(t).host,
null === o["org_name"] && delete o["org_name"];
var u = {
$headers: n,
$body: o,
$method: s
}
, d = "$proxy=proxyhttp&bodys=".concat(encodeURIComponent(JSON.stringify(u)));
return c && (t += (t.indexOf("?") >= 0 ? "&" : "?") + d),
t = t.replace("?&", "?"),
new Promise((function(e, n) {
Z(t, {
prefix: "nd_uc_sdk_".concat(+(new Date).getTime())
}, (function(t) {
var r = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : {};
if (t)
return "string" === typeof t ? void n(new L(t)) : void n(t);
var o = r.$status >= 200 && r.$status < 300 || 304 === r.$status || W(r);
if (o)
if (void 0 === r.$body && (r.$body = {}),
N()(r.$body))
e(r.$body);
else
try {
e(JSON.parse(r.$body))
} catch (_o) {
n(new L("UCSDK/SERVER_ERROR"))
}
else if (!1 === o && N()(r.$body))
n(r.$body);
else
try {
n(JSON.parse(r.$body))
} catch (_o) {
n(new L("UCSDK/SERVER_ERROR"))
}
}
))
}
))
}
问ai他说:这段代码是一个名为V的函数,它接受一个包含请求信息的对象作为参数。该函数的作用是发送一个HTTP请求,并返回一个Promise对象。 请注意,上述代码中的wt()函数未提供定义,因此无法确定其具体实现。
越搞越糊涂,没办法,直接执行这个函数看看是啥:
看起来是一个时间戳啊为了验证我的猜想我给他转换一下:
而这个时间,视乎在哪里看见过:
我为了猜测他们是什么意思,我尽然无底线地运行了无限次:
最终和程序猿想到一块去了:服务器时间-当前时间。
服务器时间又哪里来的呢,其实就是登录成功后来的,为了验证我的猜想,我给他刷新了看,果不其然:
真的是啊,那所有参数都搞定了,就来模拟吧。
模拟前,需要注意的是,这里有个耿,大于5分钟就会弹出错误提示,小伙伴们自己测试吧!!!
经过多次测量求平均值,发现这地方在1120左右,估计就是登录成功到给这个参数赋值所需要的时间,
两时间做和差积商是我的短板,我就将这个时间差设为(1000,1200)。
用python模拟这些过程得:
[Python] 纯文本查看 复制代码 def Ne(e):
t = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
n = ""
for i in range(e):
n += t[random.randint(0, 35)]
return n
def He(i):
timestamp = int(time.time())
return str(timestamp) + str(i) + ":" + Ne(8)
def Ze(e, t, n, r):
parsed_url = urlparse(e)
o_relative = parsed_url.path + '?' + parsed_url.query # 路径+参数
o_authority = parsed_url.netloc # 域名
# i = t + "\n" + n.toUpperCase() + "\n" + o.relative + "\n" + o.authority + "\n";
i = (t + '\n' + str.upper(n) + '\n' + o_relative + '\n' + o_authority + '\n').encode('utf-8')
# # Calculate HMAC SHA256
signature = hmac.new(r.encode(), i, digestmod=hashlib.sha256).digest()
# # Encode the signature in Base64 format
return base64.b64encode(signature).decode('utf-8')
def Ge(e):
t = 'GET' #t = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : "GET"
r = access_token #r = n.accessToken
o = mac_key_decrpyt #o = n.macKey
i =random.randint(1000,1200) #i = n.diff
s = He(i)
a =Ze(e,s,t,o)
c = f'MAC id="{r}",nonce="{s}",mac="{a}"'
#c = 'MAC id="'.concat(r, '",nonce="').concat(s, '",mac="').concat(a, '"');
return c
e = 'https://uc-gateway.ykt.eduyun.cn/v1.1/users/45259xxxxxxx?with_ext=true&session_id=8da6f745-071f-4317-8d87-axxxxxxxxxxx'
t = 'GET'
n = logininfo
def getMACAuthorizationHeaders(e):
r = Ge(e)
return r
Authorization = getMACAuthorizationHeaders(e)
print('Authorization:', Authorization)
这东西解决了,我认为就没啥难度了。
接下来应该就是获取专题id,获取专题列表,看视频,提交参数了。
如果您耐心地看到这里,相信后面您也会了。
但为了有始有终,话不多说,继续开干。
打开这个页面,好多请求,发现可疑链接train_courses.json。看他返回数据,果不其然,和网页显示的一模一样啊:
激动之余,赶紧码代码:
[Python] 纯文本查看 复制代码 import requests
url = "https://s-file-2.ykt.cbern.com.cn/teach/api_static/trains/2024hjpx/train_courses.json"
headers = {
"accept": "application/json, text/plain, */*",
"accept-language": "zh-CN,zh;q=0.9",
"cache-control": "no-cache",
"pragma": "no-cache",
"sec-ch-ua": '"Not.A/Brand";v="8", "Chromium";v="114", "Google Chrome";v="114"',
"sec-ch-ua-mobile": "?0",
"sec-ch-ua-platform": '"Windows"',
"sec-fetch-dest": "empty",
"sec-fetch-mode": "cors",
"sec-fetch-site": "cross-site",
}
referrer = "https://basic.smartedu.cn/training/2024hjpx"
referrer_policy = "no-referrer-when-downgrade"
response = requests.get(url, headers=headers, timeout=10)
print(response.json())
return response.json()
绝对奈斯!
fulls.json好像和页面有很多关联的数据:
image.png
(205.25 KB, 下载次数: 0)
而链接里面的这个数据视乎又来自这个json,那就好办了吧:
image.png
(56.05 KB, 下载次数: 0)
|
-
|