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

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

[复制链接]
  • TA的每日心情
    开心
    2022-3-13 14:58
  • 签到天数: 2 天

    [LV.1]初来乍到

    11

    主题

    45

    帖子

    55

    积分

    荣誉开发者

    Rank: 10Rank: 10Rank: 10

    积分
    55

    荣誉开发者

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


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


  • TA的每日心情
    擦汗
    2022-6-12 21:47
  • 签到天数: 21 天

    [LV.4]偶尔看看III

    11

    主题

    246

    帖子

    197

    积分

    中级工程师

    Rank: 5Rank: 5

    积分
    197

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

    发表于 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 

    回复

    使用道具 举报

  • TA的每日心情
    慵懒
    2022-3-8 11:41
  • 签到天数: 2 天

    [LV.1]初来乍到

    12

    主题

    390

    帖子

    578

    积分

    荣誉开发者

    Rank: 10Rank: 10Rank: 10

    积分
    578

    活跃会员热心会员突出贡献三好学生猫咪币纪念章中秋纪念章国庆纪念章荣誉开发者

    发表于 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 

    回复

    使用道具 举报

  • TA的每日心情
    开心
    前天 00:00
  • 签到天数: 49 天

    [LV.5]常住居民I

    350

    主题

    3064

    帖子

    3077

    积分

    荣誉开发者

    非物质文化遗产社会摇传承人

    Rank: 10Rank: 10Rank: 10

    积分
    3077

    猫咪币纪念章国庆纪念章中秋纪念章荣誉开发者家财万贯

    发表于 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);

                }
            });
        });
    }
    混的人。
    ------------------------------------------
    進撃!永遠の帝国の破壊虎---李恒道
    个人宣言:この世界で私に胜てる人とコードはまだ生まれていません。死ぬのが怖くなければ来てください。
    回复

    使用道具 举报

  • TA的每日心情
    开心
    前天 00:00
  • 签到天数: 49 天

    [LV.5]常住居民I

    350

    主题

    3064

    帖子

    3077

    积分

    荣誉开发者

    非物质文化遗产社会摇传承人

    Rank: 10Rank: 10Rank: 10

    积分
    3077

    猫咪币纪念章国庆纪念章中秋纪念章荣誉开发者家财万贯

    发表于 2021-8-18 21:47:28 | 显示全部楼层
    使用的时候
    async function UploadTextToAliYunpan(text) {
        await UploadTextBin(createurl, text)
    }
    混的人。
    ------------------------------------------
    進撃!永遠の帝国の破壊虎---李恒道
    个人宣言:この世界で私に胜てる人とコードはまだ生まれていません。死ぬのが怖くなければ来てください。
    回复

    使用道具 举报

  • TA的每日心情
    开心
    前天 00:00
  • 签到天数: 49 天

    [LV.5]常住居民I

    350

    主题

    3064

    帖子

    3077

    积分

    荣誉开发者

    非物质文化遗产社会摇传承人

    Rank: 10Rank: 10Rank: 10

    积分
    3077

    猫咪币纪念章国庆纪念章中秋纪念章荣誉开发者家财万贯

    发表于 2021-8-18 21:47:48 | 显示全部楼层
    promise大概这个月会讲,哥哥不理解的话9.1再来看看
    混的人。
    ------------------------------------------
    進撃!永遠の帝国の破壊虎---李恒道
    个人宣言:この世界で私に胜てる人とコードはまだ生まれていません。死ぬのが怖くなければ来てください。
    回复

    使用道具 举报

  • TA的每日心情

    2022-4-18 23:32
  • 签到天数: 17 天

    [LV.4]偶尔看看III

    13

    主题

    264

    帖子

    228

    积分

    版主

    Rank: 8Rank: 8

    积分
    228

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

    发表于 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
    回复

    使用道具 举报

  • TA的每日心情
    慵懒
    2022-3-8 11:41
  • 签到天数: 2 天

    [LV.1]初来乍到

    12

    主题

    390

    帖子

    578

    积分

    荣誉开发者

    Rank: 10Rank: 10Rank: 10

    积分
    578

    活跃会员热心会员突出贡献三好学生猫咪币纪念章中秋纪念章国庆纪念章荣誉开发者

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

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

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

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

    回复

    使用道具 举报

  • TA的每日心情
    慵懒
    5 小时前
  • 签到天数: 64 天

    [LV.6]常住居民II

    150

    主题

    1976

    帖子

    2119

    积分

    管理员

    Rank: 10Rank: 10Rank: 10

    积分
    2119

    猫咪币纪念章热心会员活跃会员突出贡献三好学生中秋纪念章国庆纪念章管理员家财万贯

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

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

    使用道具 举报

  • TA的每日心情

    2022-4-18 23:32
  • 签到天数: 17 天

    [LV.4]偶尔看看III

    13

    主题

    264

    帖子

    228

    积分

    版主

    Rank: 8Rank: 8

    积分
    228

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

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

    我还以为大差不差呢
    回复

    使用道具 举报

  • TA的每日心情
    开心
    昨天 08:27
  • 签到天数: 159 天

    [LV.7]常住居民III

    25

    主题

    640

    帖子

    6233

    积分

    荣誉开发者

    精通各种语言的HelloWord!

    Rank: 10Rank: 10Rank: 10

    积分
    6233

    猫咪币纪念章活跃会员三好学生热心会员中秋纪念章国庆纪念章荣誉开发者家财万贯

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

    使用道具 举报

    发表回复

    本版积分规则

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