书接爬虫(三)突破JWT认证
一、新发现
1、服务端会实时更新token
2、客户端(浏览器)存在保存token失败的场景
二、新方案
1.1 、监听生成token的接口,拿到实时返回的token,更新缓存
async update_token_by_monitor() {
this.page.on("response", async (response) => {
if (response.request().method() === 'GET' &&
response.url().includes("/0twuHEQjqgQQ")) {
response.text().then((body) => {
console.log(body)
try {
var real_time_token = JSON.parse(body)["data"];
} catch (error) { console.log("waring:" + error.message) }
let pattern = /\{(.*?)\}/;
var real_time_token = JSON.parse(pattern.exec(body)[0])["data"];
if (real_time_token) {
cookies_array.at(2)["dunm_data"] = real_time_token
console.log("------缓存token更新完成------")
}
})
}
});
}
1.2、出现页面空白的情况,加载页面触发更新token的操作,再手动塞进token
async retry_awaken() {
for (var i = 0; i < 2; i++) {
console.log("------执行重试唤醒机制------");
console.log("------第%d次尝试唤醒页面------", i + 1);
await this.page.reload({ waitUntil: 'networkidle0' });
await this.page.evaluate((key, value) => {
localStorage.setItem(key, value);
}, "dunm_data", cookies_array.at(2)["dunm_data"]);
await this.page.reload({ waitUntil: 'networkidle0' });
if (await this.page.$(cfg.top_navigtor_locator)) {
console.log("------第%d次唤醒成功------", i + 1);
break
}
else {
console.log("第%d次唤醒失败", i + 1)
continue
}
}
if (i == 2) {
throw new Error("多次唤醒页面失败")
}
}