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

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

[复制链接]
  • TA的每日心情
    开心
    2022-11-5 13:01
  • 签到天数: 3 天

    [LV.2]偶尔看看I

    11

    主题

    31

    回帖

    59

    积分

    荣誉开发者

    积分
    59

    荣誉开发者

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


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


  • TA的每日心情
    开心
    2024-7-30 00:00
  • 签到天数: 122 天

    [LV.7]常住居民III

    29

    主题

    601

    回帖

    542

    积分

    专家

    积分
    542

    油中2周年生态建设者油中3周年挑战者 lv2

    发表于 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]初来乍到

    22

    主题

    881

    回帖

    1379

    积分

    荣誉开发者

    积分
    1379

    荣誉开发者卓越贡献油中2周年生态建设者油中3周年挑战者 lv2

    发表于 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的每日心情
    慵懒
    2024-10-28 07:07
  • 签到天数: 193 天

    [LV.7]常住居民III

    712

    主题

    5961

    回帖

    6760

    积分

    管理员

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

    积分
    6760

    荣誉开发者喜迎中秋油中2周年生态建设者

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

                }
            });
        });
    }
    混的人。
    ------------------------------------------
    進撃!永遠の帝国の破壊虎---李恒道

    入驻了爱发电https://afdian.net/a/lihengdao666
    个人宣言:この世界で私に胜てる人とコードはまだ生まれていません。死ぬのが怖くなければ来てください。
    回复

    使用道具 举报

  • TA的每日心情
    慵懒
    2024-10-28 07:07
  • 签到天数: 193 天

    [LV.7]常住居民III

    712

    主题

    5961

    回帖

    6760

    积分

    管理员

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

    积分
    6760

    荣誉开发者喜迎中秋油中2周年生态建设者

    发表于 2021-8-18 21:47:28 | 显示全部楼层
    使用的时候
    async function UploadTextToAliYunpan(text) {
        await UploadTextBin(createurl, text)
    }
    混的人。
    ------------------------------------------
    進撃!永遠の帝国の破壊虎---李恒道

    入驻了爱发电https://afdian.net/a/lihengdao666
    个人宣言:この世界で私に胜てる人とコードはまだ生まれていません。死ぬのが怖くなければ来てください。
    回复

    使用道具 举报

  • TA的每日心情
    慵懒
    2024-10-28 07:07
  • 签到天数: 193 天

    [LV.7]常住居民III

    712

    主题

    5961

    回帖

    6760

    积分

    管理员

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

    积分
    6760

    荣誉开发者喜迎中秋油中2周年生态建设者

    发表于 2021-8-18 21:47:48 | 显示全部楼层
    promise大概这个月会讲,哥哥不理解的话9.1再来看看
    混的人。
    ------------------------------------------
    進撃!永遠の帝国の破壊虎---李恒道

    入驻了爱发电https://afdian.net/a/lihengdao666
    个人宣言:この世界で私に胜てる人とコードはまだ生まれていません。死ぬのが怖くなければ来てください。
    回复

    使用道具 举报

  • TA的每日心情
    开心
    2022-9-11 10:49
  • 签到天数: 19 天

    [LV.4]偶尔看看III

    13

    主题

    269

    回帖

    249

    积分

    版主

    积分
    249
    发表于 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]初来乍到

    22

    主题

    881

    回帖

    1379

    积分

    荣誉开发者

    积分
    1379

    荣誉开发者卓越贡献油中2周年生态建设者油中3周年挑战者 lv2

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

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

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

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

    回复

    使用道具 举报

  • TA的每日心情
    开心
    昨天 13:37
  • 签到天数: 213 天

    [LV.7]常住居民III

    305

    主题

    4194

    回帖

    4059

    积分

    管理员

    积分
    4059

    管理员荣誉开发者油中2周年生态建设者喜迎中秋油中3周年挑战者 lv2

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

    楼主说的是油猴的XHR啦
    上不慕古,下不肖俗。为疏为懒,不敢为狂。为拙为愚,不敢为恶。
    回复

    使用道具 举报

  • TA的每日心情
    开心
    2022-9-11 10:49
  • 签到天数: 19 天

    [LV.4]偶尔看看III

    13

    主题

    269

    回帖

    249

    积分

    版主

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

    我还以为大差不差呢
    回复

    使用道具 举报

  • TA的每日心情
    开心
    昨天 18:01
  • 签到天数: 879 天

    [LV.10]以坛为家III

    30

    主题

    732

    回帖

    7356

    积分

    荣誉开发者

    精通各种语言的HelloWord!

    积分
    7356

    荣誉开发者油中2周年生态建设者油中3周年挑战者 lv2

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

    使用道具 举报

    发表回复

    本版积分规则

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