新思路,可以直接 劫持 js 修改源码
// ==UserScript==
// @name Test
// @namespace Test
// @description TEST
// @include http://the.website.com/*
// @version 1
// @grant GM_xmlhttpRequest
// @run-at document-start
// ==/UserScript==
function addScript(text) {
text = text.replace(/replaceThis();/g, "");
var newScript = document.createElement('script');
newScript.type = "text/javascript";
newScript.textContent = text;
var head = document.getElementsByTagName('head')[0];
head.appendChild(newScript);
}
window.addEventListener('beforescriptexecute', function(e) {
src = e.target.src;
if (src.search(/script_to_modify\.js/) != -1) {
e.preventDefault();
e.stopPropagation();
GM_xmlhttpRequest({
method: "GET",
url: e.target.src,
onload: function(response) {
addScript(response.responseText);
}
});
}
});
根据 @RedBuck 的思路,直接劫持了 XHR
下面的代码作用是,强制 ajax 请求使用 某个 Bearer token
let originSetRequestHeader = XMLHttpRequest.prototype.setRequestHeader;
XMLHttpRequest.prototype.setRequestHeader = function (key, value) {
// console.log('setRequestHeader', key, value, this);
if(key == 'Authorization') {
if (value != sessionStorage.jwt) {
value = sessionStorage.jwt;
}
}
return originSetRequestHeader.apply(this, [key, value]);
};
1
SoloCompany 2021-04-04 21:12:41 +08:00
必须通过 entry export 否则就像你所说的通过 webpackJsonp hack
|
2
renmu123 2021-04-04 21:20:11 +08:00 via Android
在油猴上直接请求登录的地址获取 token 后写入 localhost,不知道会不会触发跨域
|
3
renmu123 2021-04-04 21:20:53 +08:00 via Android
localstorge
|
4
xiadd 2021-04-04 21:23:22 +08:00
改成 umd 打包,提供对应的 api
|
5
dingyaguang117 OP @xiadd 项目不是我维护的,所以不能改代码
|
6
dingyaguang117 OP @renmu123 主要是这个 页面 token, 是直接通过设置 axios 全局属性的,在内存,改 localstorage 刷新页面才有用
|
7
dingyaguang117 OP @SoloCompany 跪求大神 Hack 方法
|
8
Mutoo 2021-04-04 22:41:00 +08:00 via iPhone
早期版本的 webpack 有泄漏问题,后来修复了。不过你可以试着通过 vue 元素直接 hack 进去 $anyVueElement.__vue__.axios 或者 __vue__.$axios
|
9
murmur 2021-04-04 23:57:58 +08:00
没有源代码的产品二次魔改?建议直接放弃
|
10
muzuiget 2021-04-05 00:49:23 +08:00
很难,你这个问题相当于问怎么访问函数里的闭包变量,JavaScript 本身不提供这个功能,所以无解。除非该变量在别的地方被引用,可以从 window 一直找下去。
|
11
ch2 2021-04-05 01:43:10 +08:00 via iPhone
没有源代码的情况下,你这个问题需要花费非常久的时间去逆向,还不一定有解
|
12
ysc3839 2021-04-05 05:44:28 +08:00 via Android
建议考虑别的方案。过期自动登录的话,脚本输入用户名密码然后点击登录不行吗?
|
13
ysc3839 2021-04-05 05:47:36 +08:00 via Android
|
14
redbuck 2021-04-05 08:38:37 +08:00 via iPhone
axios 的浏览器适配器是 xhr,劫持它就完了
|
15
dingyaguang117 OP @Mutoo 谢谢这个思路不错, 不过这个项目 好像没有使用 Vue.use 绑定 axios, 我试了下 是 undefined
|
16
dingyaguang117 OP @muzuiget 确实,我找到了在闭包里面的引用, 但是好像确实没办法获取到
|
17
dingyaguang117 OP @ysc3839 主要是我希望能不 重新加载页面, 因为 重新加载之后当前页面很多状态就丢失了,需要重新录入。
|
18
dingyaguang117 OP @redbuck 您这个思路很靠谱,通过劫持了 XHR,实现了需要的功能! 谢谢!
|