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

[油猴脚本开发指南]脚本ajax的跨域请求

[复制链接]
  • TA的每日心情
    开心
    2024-3-13 10:14
  • 签到天数: 211 天

    [LV.7]常住居民III

    293

    主题

    3900

    回帖

    3820

    积分

    管理员

    积分
    3820

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

    发表于 2021-1-12 16:50:35 | 显示全部楼层 | 阅读模式

    本节主要内容

    > 介绍ajax和跨域问题,油猴中的ajax请求.将使用GM_xmlhttpRequest来绕过 同源策略做一个访问我们油猴中文网就会自动关注我们的up主(夹杂私货手动狗头)

    > 本篇文章默认你已经懂了 XMLHttpRequestF12开发者工具(Network),如果不懂请先补习一下.

    AJAX

    > 这一大段内容更多是科普和说明我们在脚本里面为什么不能直接使用 XMLHttpRequest去访问我们自己的api

    AJAX即Asynchronous Javascript And XML,主要用于不刷新页面与网站后端通信.例如你在b站网页上的点赞/投币/收藏,在评论区翻页,就是使用了ajax技术.

    AJAX通常使用XMLHttpRequest(XHR),但是由于此api的设计不太友好,于是又有了Fetch API来解决这些问题,不过也有其它的封装让XHR的使用体验更友好,例如:axios和jQuery的ajax等.此处就不再展开.

    跨域

    跨域即两个不同域名之间的访问.例如我在开头说的访问我们油猴中文网就会自动关注我们的up主,那么肯定就需要从我们的域名https://bbs.tampermonkey.net.cn/访问到https://space.bilibili.com/1037793830哔哩哔哩的域名,这就产生了跨域访问.

    同源策略

    如果上述可以正常访问那肯定是不合理且不安全的.假如正常访问了,只是看页面还好,万一直接投币甚至转账那是无法接受的.就比如我可以随便从我家跑到你家看东西(GET),放东西(POST),丢东西(DELETE)一样.

    然后就引出了同源策略对此来加以限制.

    > 如果两个 URL 的 protocol、port (如果有指定的话)和 host 都相同的话,则这两个 URL 是同源。这个方案也被称为“协议/主机/端口元组”,或者直接是 “元组”。

    实际如下图所示,提示了错误.且不可以访问.

    image-20210112151930661.png

    如果希望可以解决这个问题,能够让我们跨域访问,主要有 JSONP,CORS,反向代理这三种方式.(限于篇幅和主题,本文不再详细描述)

    像b站点击关注哪里就是使用的 CORS,因为用户页面的域名是:space.bilibili.com,而关注api的域名是:api.bilibili.com,两个域名并不符合同源策略

    image-20210112152535760.png

    脚本的跨域访问

    > 前面啰嗦了一大把,终于可以进入正题了.至于油猴为什么可以绕过同源策略进行跨域访问,就牵扯到浏览器扩展开发了,以后再说.所以扩展和脚本还是不能乱装啊,多么不安全.

    如果我们需要让我们的脚本能够完全的访问其它的api,那么大概只有两种方法,一种是CORS,另外一种是通过油猴扩展去获得更高级的权限,让我们的脚本不受同源策略所限制.

    CORS方法如果你调用的api不是自己写的,不能自己去增加CORS策略,那么就几乎无解,好处是对你的api安全.(不过都脚本了,哪里还管安全....)

    所以脚本一般使用 GM_xmlhttpRequestAPI,我们需要通过 // @grant GM_xmlhttpRequest去申请此权限.

    这个方法更详细的文档:GM_xmlhttpRequest,看起来像XHR+jQuery的结合体.

    bilibili自动关注up主

    如果想实现访问我们的论坛然后自动关注我们的up主,那么我们得先知道,bilibili关注up主的api是什么.

    我们先通过f12的开发者工具,然后使用Network去查看bilibili关注up主的网络请求包是怎么样的.

    主要关注Request URL:https://api.bilibili.com/x/relation/modify,Request Method:POST,Form Data.先来完成我们的脚本第一版.如果有问题再继续调整.

    就像写ajax请求一样

    // ==UserScript==
    // @name         油猴中文网-自动关注up主
    // @namespace    https://bbs.tampermonkey.net.cn/
    // @version      0.1
    // @description  油猴中文网-自动关注up主
    // @author       Wyz
    // @match        https://bbs.tampermonkey.net.cn/
    // @grant        GM_xmlhttpRequest
    // @connect      api.bilibili.com
    // ==/UserScript==
    
    (function() {
        'use strict';
    
        GM_xmlhttpRequest({
            url:"https://api.bilibili.com/x/relation/modify",
            method :"POST",
            data:"fid=1037793830&act=1&re_src=11&jsonp=jsonp&csrf=e37f1881fd98f16756d16ab71109d37a",
            headers: {
                "Content-type": "application/x-www-form-urlencoded"
            },
            onload:function(xhr){
                console.log(xhr.responseText);
            }
        });
    })();

    执行一下,弹出了下面内容,当然点击允许啦!不过如果你不希望弹出这个内容,那么你可以在脚本中加入 // @connect api.bilibili.com这一行来设置允许通过的域名,以进行屏蔽.@connect

    不知道是延迟还是什么的原因,我刷新了几次之后才关注成功.

    不过到此,虽然可以关注了,但是还不能算完,因为这个请求里有一个参数:csrf是与账号相关的,需要从cookie里面去获取,如果你直接将上面的脚本代码发给别人运行,因为对方的csrf和你的不同,那么就会输出这个内容

    {"code":-111,"message":"csrf 校验失败","ttl":1}

    ~获取cookie取出csrf这些内容就留到下一节吧~ 记错了,gm_cookie是beta版本的功能,并未加入stable,暂时搁浅

    已有1人评分好评 贡献 理由
    李恒道 + 1 + 1 ggnb!

    查看全部评分 总评分:好评 +1  贡献 +1 

    上不慕古,下不肖俗。为疏为懒,不敢为狂。为拙为愚,不敢为恶。/ 微信公众号:一之哥哥

    该用户从未签到

    0

    主题

    3

    回帖

    20

    积分

    助理工程师

    积分
    20
    发表于 2021-8-24 22:49:41 | 显示全部楼层
    为什么写完脚本后,在油猴里面抓包,提交的包是403
    回复

    使用道具 举报

  • TA的每日心情
    开心
    2023-2-28 23:59
  • 签到天数: 191 天

    [LV.7]常住居民III

    637

    主题

    5191

    回帖

    6075

    积分

    管理员

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

    积分
    6075

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

    发表于 2021-8-25 09:06:22 | 显示全部楼层
    601tyl 发表于 2021-8-24 22:49
    为什么写完脚本后,在油猴里面抓包,提交的包是403

    可能协议头没搞上
    或者链接有sign之类的加密
    混的人。
    ------------------------------------------
    進撃!永遠の帝国の破壊虎---李恒道

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

    使用道具 举报

  • TA的每日心情
    开心
    2024-3-13 10:14
  • 签到天数: 211 天

    [LV.7]常住居民III

    293

    主题

    3900

    回帖

    3820

    积分

    管理员

    积分
    3820

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

    发表于 2021-8-26 14:29:02 | 显示全部楼层
    601tyl 发表于 2021-8-24 22:49
    为什么写完脚本后,在油猴里面抓包,提交的包是403

    后面已经说了

    因为这个请求里有一个参数:csrf是与账号相关的,需要从cookie里面去获取
    上不慕古,下不肖俗。为疏为懒,不敢为狂。为拙为愚,不敢为恶。/ 微信公众号:一之哥哥
    回复

    使用道具 举报

    该用户从未签到

    0

    主题

    3

    回帖

    20

    积分

    助理工程师

    积分
    20
    发表于 2021-8-29 17:54:00 | 显示全部楼层
    王一之 发表于 2021-8-26 14:29
    后面已经说了

    因为这个请求里有一个参数:csrf是与账号相关的,需要从cookie里面去获取 ...

    现在调整了一下我获取了自己的请求头,已经可以返回200状态码的包了。我也将csrf设置造成了自己的,但是返回的包显示csrf校验失败。
    回复

    使用道具 举报

  • TA的每日心情

    2022-4-9 09:41
  • 签到天数: 4 天

    [LV.2]偶尔看看I

    14

    主题

    38

    回帖

    70

    积分

    初级工程师

    积分
    70
    发表于 2021-9-1 08:55:28 | 显示全部楼层
    执行一下,弹出了下面内容,

    弹出了什么?
    回复

    使用道具 举报

    该用户从未签到

    5

    主题

    17

    回帖

    11

    积分

    助理工程师

    积分
    11
    发表于 2021-11-25 20:32:56 | 显示全部楼层
    我将fid修改了可是抓包抓出来还是403
    5544.PNG
    回复

    使用道具 举报

  • TA的每日心情
    开心
    2024-3-13 10:14
  • 签到天数: 211 天

    [LV.7]常住居民III

    293

    主题

    3900

    回帖

    3820

    积分

    管理员

    积分
    3820

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

    发表于 2021-11-25 22:55:20 | 显示全部楼层
    小胖子的梦想 发表于 2021-11-25 20:32
    我将fid修改了可是抓包抓出来还是403

    b站登录了么?看看header请求详情
    上不慕古,下不肖俗。为疏为懒,不敢为狂。为拙为愚,不敢为恶。/ 微信公众号:一之哥哥
    回复

    使用道具 举报

    该用户从未签到

    5

    主题

    17

    回帖

    11

    积分

    助理工程师

    积分
    11
    发表于 2021-11-26 08:28:04 | 显示全部楼层
    王一之 发表于 2021-11-25 22:55
    b站登录了么?看看header请求详情

    这个样子

    6622.PNG
    6633.PNG
    回复

    使用道具 举报

    该用户从未签到

    5

    主题

    17

    回帖

    11

    积分

    助理工程师

    积分
    11
    发表于 2021-11-26 08:29:23 | 显示全部楼层

    这个,b站登陆了

    6611.PNG
    回复

    使用道具 举报

    发表回复

    本版积分规则

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