油猴脚本怎么实现跨域的同步请求
油猴脚本怎么实现跨域的同步请求,我使用了// @grant GM_xmlhttpRequest但是我的请求需要同步,而不是异步,这个我不知道怎么该怎么办,GM_xmlhttpRequest 有可能变成同步请求吗?
https://www.liaoxuefeng.com/wiki/1022910821149312/1023024413276544
http://www.ruanyifeng.com/blog/2015/05/async.html
针对这个问题,我帮你找到了两篇文章,你读一读,我感兴趣的是想知道你读完后会不会晕 调试了下你的代码,怎么说呢,老生常谈的问题了:**不要在遍历数组时修改数组长度!** 你在给数组添加磁力链的时候用了try catch,一旦这一步失败,你的数组长度就不再是4的倍数了,导致后续循环在取url时整个错位,取到的实际上是title、info这些东西,把它传给GM_xmlhttpRequest当然会出错了,你输出的东西全乱了也是这个原因。这个问题用对象解决是最简单的:
```javascript
//...
for (let i = 0; i < count; i++) {
let title = $(search_results).children('li').innerText
let info = $(search_results).children('li').innerText
let href = 'https://skrbtba.xyz/' + $($(search_results).children('li')).children('a').attr("href")
//data_list = title
//data_list = info
//data_list = href
data_list.push({
title: title,
info: info,
href: href
});
}
//for (let k = 0; k < data_list.length; k = k + 3) {
for(let k = 0; k < data_list.length; k++) {
header.referer = search_url
//let content_url = data_list
let content_url = data_list.href;
//...
//data_list.splice(k + 3, 0, $(doc.find('.list-unstyled')).children('li').innerText.match(/{40,40}$/))
data_list.magnet = $(doc.find('.list-unstyled')).children('li').innerText.match(/{40,40}$/);
//...
//$(flag).after(`<br>************${k}***********<br>${data_list} ${data_list} ${data_list}`)
$(flag).after(`<br>************${k}***********<br>${data_list.title} ${data_list.info} ${data_list.magnet}`)
//...
```
另外skrbtba.xyz这个网站我测试的时候不太稳定,似乎隔一段时间就会发生一次重定向,需要过一遍人工验证,这可能是GM_xmlhttpRequest失败的原因。
async和await语法糖
我之前阿里云盘写过一个大概的
async function CreateTextUpload(name, size, hash) {
return new Promise((resolve, reject) => {
let useruid = JSON.parse(localStorage.getItem('token')).default_drive_id
let uploadtext = '{"drive_id":"' + useruid + '","part_info_list":[{"part_number":1}],"parent_file_id":"' + parent_file_id + '","name":"' + name +
'","type":"file","check_name_mode":"auto_rename","size":' + size + ',"content_hash":"' + hash + '","content_hash_name":"sha1"}'
GM_xmlhttpRequest({
url: "https://api.aliyundrive.com/v2/file/create",
method: "POST",
data: uploadtext,
headers: {
"Content-type": "application/json;charset=utf-8",
"Authorization": accesstoken
},
onload: function (xhr) {
resolve(xhr.responseText);
}
});
});
} 使用的时候
async function UploadTextToAliYunpan(text) {
await UploadTextBin(createurl, text)
} promise大概这个月会讲,哥哥不理解的话9.1再来看看 XMLHttpRequest.open(),相关参数和解释
参数
method
要使用的HTTP方法,比如「GET」、「POST」、「PUT」、「DELETE」、等。对于非HTTP(S) URL被忽略。
url
一个DOMString表示要向其发送请求的URL。
async 可选
一个可选的布尔参数,表示是否异步执行操作,默认为true。如果值为false,send()方法直到收到答复前不会返回。如果true,已完成事务的通知可供事件监听器使用。如果multipart属性为true则这个必须为true,否则将引发异常。
注意:主线程上的同步请求很容易破坏用户体验,应该避免;实际上,许多浏览器已完全弃用主线程上的同步XHR支持。在 Worker中允许同步请求
https://developer.mozilla.org/zh-CN/docs/Web/API/XMLHttpRequest/open 查了一下,`GM_xmlhttpRequest`确实支持同步:
```javascript
const xhr = GM_xmlhttpRequest({
//...
synchronous: true,
});
console.log(xhr.response);
```
我不确定这是否适用于多数版本的油猴,可能只是一个旧版本的特性。话说回来,令耗时的ajax同步执行本身就不是一个好想法,如果网络不好,页面会长时间假死,这在用户体验上是很糟糕的,如果真有这种需求,尝试用异步+await解决更好。
水凛子 发表于 2021-8-18 22:30
XMLHttpRequest.open(),相关参数和解释
参数
method
楼主说的是油猴的XHR啦 王一之 发表于 2021-8-18 23:56
楼主说的是油猴的XHR啦
我还以为大差不差呢{:4_115:}{:4_115:} 学习了