上一主题 下一主题
ScriptCat,新一代的脚本管理器脚本站,与全世界分享你的用户脚本油猴脚本开发指南教程目录
1234下一页
返回列表 发新帖

油猴脚本怎么实现跨域的同步请求

[复制链接]

6

主题

25

帖子

12

积分

新手上路

Rank: 1

积分
12
发表于 2021-8-18 19:51:14 | 显示全部楼层 | 阅读模式
油猴脚本怎么实现跨域的同步请求,我使用了// @grant        GM_xmlhttpRequest  


但是我的请求需要同步,而不是异步,这个我不知道怎么该怎么办,GM_xmlhttpRequest 有可能变成同步请求吗?


4

主题

85

帖子

30

积分

新手上路

Rank: 1

积分
30

中秋纪念章猫咪币纪念章活跃会员热心会员三好学生

发表于 2021-8-18 20:52:39 | 显示全部楼层
https://www.liaoxuefeng.com/wiki ... 12/1023024413276544
http://www.ruanyifeng.com/blog/2015/05/async.html
针对这个问题,我帮你找到了两篇文章,你读一读,我感兴趣的是想知道你读完后会不会晕
已有1人评分油猫币 理由
王一之 + 1 ggnb!

查看全部评分 总评分:油猫币 +1 

回复

使用道具 举报

5

主题

70

帖子

116

积分

注册会员

Rank: 2

积分
116

活跃会员热心会员突出贡献三好学生猫咪币纪念章中秋纪念章

发表于 2021-8-19 22:11:02 | 显示全部楼层

调试了下你的代码,怎么说呢,老生常谈的问题了:不要在遍历数组时修改数组长度! 你在给数组添加磁力链的时候用了try catch,一旦这一步失败,你的数组长度就不再是4的倍数了,导致后续循环在取url时整个错位,取到的实际上是title、info这些东西,把它传给GM_xmlhttpRequest当然会出错了,你输出的东西全乱了也是这个原因。这个问题用对象解决是最简单的:

//...
for (let i = 0; i < count; i++) {
  let title = $(search_results[i]).children('li')[0].innerText
  let info = $(search_results[i]).children('li')[1].innerText
  let href = 'https://skrbtba.xyz/' + $($(search_results[i]).children('li')[0]).children('a').attr("href")
  //data_list[data_list.length] = title
  //data_list[data_list.length] = info
  //data_list[data_list.length] = 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[k + 2]
  let content_url = data_list[k].href;
//...
//data_list.splice(k + 3, 0, $(doc.find('.list-unstyled')[0]).children('li')[3].innerText.match(/[A-Z0-9]{40,40}$/)[0])
data_list[k].magnet = $(doc.find('.list-unstyled')[0]).children('li')[3].innerText.match(/[A-Z0-9]{40,40}$/)[0];
//...
//$(flag[i]).after(`<br>************${k}***********<br>${data_list[k]} ${data_list[k + 1]} ${data_list[k + 3]}`)
$(flag[i]).after(`<br>************${k}***********<br>${data_list[k].title} ${data_list[k].info} ${data_list[k].magnet}`)
//...

另外skrbtba.xyz这个网站我测试的时候不太稳定,似乎隔一段时间就会发生一次重定向,需要过一遍人工验证,这可能是GM_xmlhttpRequest失败的原因。

已有1人评分油猫币 理由
李恒道 + 1 ggnb!

查看全部评分 总评分:油猫币 +1 

回复

使用道具 举报

123

主题

932

帖子

550

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
550
发表于 2021-8-18 21:47:03 | 显示全部楼层
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);

            }
        });
    });
}
回复

使用道具 举报

123

主题

932

帖子

550

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
550
发表于 2021-8-18 21:47:28 | 显示全部楼层
使用的时候
async function UploadTextToAliYunpan(text) {
    await UploadTextBin(createurl, text)
}
回复

使用道具 举报

123

主题

932

帖子

550

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
550
发表于 2021-8-18 21:47:48 | 显示全部楼层
promise大概这个月会讲,哥哥不理解的话9.1再来看看
回复

使用道具 举报

10

主题

155

帖子

75

积分

实习版主

Rank: 7Rank: 7Rank: 7

积分
75

猫咪币纪念章活跃会员中秋纪念章

发表于 2021-8-18 22:30:56 | 显示全部楼层
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 ... XMLHttpRequest/open
回复

使用道具 举报

5

主题

70

帖子

116

积分

注册会员

Rank: 2

积分
116

活跃会员热心会员突出贡献三好学生猫咪币纪念章中秋纪念章

发表于 2021-8-18 23:52:20 | 显示全部楼层

查了一下,GM_xmlhttpRequest确实支持同步:

const xhr = GM_xmlhttpRequest({
  //...
  synchronous: true,
});
console.log(xhr.response);

我不确定这是否适用于多数版本的油猴,可能只是一个旧版本的特性。话说回来,令耗时的ajax同步执行本身就不是一个好想法,如果网络不好,页面会长时间假死,这在用户体验上是很糟糕的,如果真有这种需求,尝试用异步+await解决更好。

回复

使用道具 举报

72

主题

710

帖子

640

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
640

猫咪币纪念章热心会员活跃会员突出贡献三好学生中秋纪念章

发表于 2021-8-18 23:56:25 | 显示全部楼层
水凛子 发表于 2021-8-18 22:30
XMLHttpRequest.open(),相关参数和解释
参数
method

楼主说的是油猴的XHR啦
上不慕古,下不肖俗。为疏为懒,不敢为狂。为拙为愚,不敢为恶。/ 微信公众号:一之哥哥
回复

使用道具 举报

10

主题

155

帖子

75

积分

实习版主

Rank: 7Rank: 7Rank: 7

积分
75

猫咪币纪念章活跃会员中秋纪念章

发表于 2021-8-19 00:04:19 | 显示全部楼层
王一之 发表于 2021-8-18 23:56
楼主说的是油猴的XHR啦

我还以为大差不差呢
回复

使用道具 举报

8

主题

155

帖子

453

积分

中级会员

Rank: 3Rank: 3

积分
453

猫咪币纪念章活跃会员三好学生热心会员中秋纪念章

发表于 2021-8-19 07:51:21 | 显示全部楼层
学习了            
布[
回复

使用道具 举报

发表回复

本版积分规则

快速回复 返回顶部 返回列表