转载自油猴中文网:bbs.tampermonkey.net.cn
李恒道QQ4548212
油猴中文网bbs.tampermonkey.net.cn
TamperMonkey GreaseMonkey 油猴脚本 脚本交流 脚本分享
油猴脚本开发 油猴基础开发 油猴 油猴中文
公众号:叛逆青年旅舍
https://bbs.tampermonkey.net.cn/

本节主要内容

介绍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主,那么肯定就需要从我们的域名[url=https://bbs.tampermonkey.net.cn/]https://bbs.tampermonkey.net.cn/[/url]访问到[url=https://space.bilibili.com/1037793830]https://space.bilibili.com/1037793830[/url]哔哩哔哩的域名,这就产生了跨域访问.

同源策略

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

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

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

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

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

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

脚本的跨域访问

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

如果我们需要让我们的脚本能够完全的访问其它的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主的网络请求包是怎么样的.

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eSwif9W3-1611416860757)([img]https://bbs.tampermonkey.net.cn/data/attachment/forum/202101/12/164832t8jo64zk569ib6ik.png[/img])]

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

就像写ajax请求一样

// ==UserScript==
// @name         油猴中文网-自动关注up主
// @namespace    [url=https://bbs.tampermonkey.net.cn/]https://bbs.tampermonkey.net.cn/[/url]
// @version      0.1
// @description  油猴中文网-自动关注up主
// @author       Wyz
// @match        [url=https://bbs.tampermonkey.net.cn/]https://bbs.tampermonkey.net.cn/[/url]
// @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

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rBvZdaKc-1611416860759)([img]https://bbs.tampermonkey.net.cn/data/attachment/forum/202101/12/165004asao8lcmm0a9qdu0.png[/img])]

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

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

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

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

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

  1. 利用Nginx轻松实现Ajax的跨域请求(前后端分离开发调试必备神技)

    利用Nginx轻松实现浏览器中Ajax的跨域请求(前后端分离开发调试必备神技) 前言 为什么会出现跨域? 造成跨域问题的原因是因为浏览器受到同源策略的限制,也就是说js只能访问和操作自己域下的资源,不 ...

  2. jfinal里使用ajax,Jfinal解决AJAX的跨域请求

    JFinal 是基于 Java 语言的极速 WEB + ORM 框架,其核心设计目标是开发迅速.代码量少.学习简单.功能强大.轻量级.易扩展.Restful. 一开始使用AJAX来传输json数据时, ...

  3. ajax 跨域请求数据,JQuery Ajax执行跨域请求数据的解决方案

    JQuery Ajax执行跨域请求数据的解决方案 今天前端因为需要ajax调用两个不同的项目,请求域不一样,所以涉及ajax跨域的问题 ,其实很简单,具体如下 原来的ajax请求如下: $.ajax( ...

  4. ajax+php跨域请求数据库,基于jQuery的ajax跨域请求,PHP作为服务器端代码

    ajax实现跨域请求有两种方式: 方法一:jsonp的方式 jsonp方式的关键点在客户请求以jsonp作为数据类型,服务器端接收jsonp的回调函数,并通过回调函数进行数据的传输.具体代码如下: 客 ...

  5. jq中ajax请求跨域,jquery+ajax实现跨域请求的方法

    本文实例讲述了jquery+ajax实现跨域请求的方法.分享给大家供大家参考.具体实现方法如下: 说明:这里的dataType 为  "jsonp"  :type 只能为 GET ...

  6. ajax是如何实现跨域的,在JS中如何实现ajax与ajax的跨域请求

    下面小编就为大家分享一篇原生JS实现ajax与ajax的跨域请求实例,具有很好的参考价值,希望对大家有所帮助.一起跟随小编过来看看吧 一.原生JS实现ajax 第一步获得XMLHttpRequest对 ...

  7. [油猴脚本开发指南]脚本自动化之模拟点击和表单填写

    转载自油猴中文网:bbs.tampermonkey.net.cn 李恒道QQ4548212 油猴中文网bbs.tampermonkey.net.cn TamperMonkey GreaseMonkey ...

  8. [油猴脚本开发指南]脚本往页面上添加新元素

    本节主要内容 转载自油猴中文网:https://bbs.tampermonkey.net.cn/ 李恒道QQ4548212 油猴中文网https://bbs.tampermonkey.net.cn/ ...

  9. Java Ajax jsonp 跨域请求

    2019独角兽企业重金招聘Python工程师标准>>> 1. 什么是JSONP 一般来说位于 server1.example.com 的网页无法与不是 server1.example ...

最新文章

  1. java(十)IO流
  2. Kubernetes - - k8s - v1.12.3 动态存储管理GlusterFS及使用Heketi扩容GlusterFS集群
  3. mysql goto,如何在MySQL存储函数中使用goto标签
  4. 面下个对象 多态特性
  5. buck变换器设计matlab_2.5V/2A 高质量电源设计
  6. java list适配器_详解listview的四种适配器模式
  7. 山寨Facebook的Shimmer效果
  8. 【转】MapReduce读取lzo文件
  9. Exception:A generic error occurred in GDI+
  10. JS错误 theForm.submit();SCRIPT3: 找不到成员。
  11. 怎样启动本地mysql服务_启动本地mysql服务
  12. 慎用!3个容易被打的Python恶搞脚本!
  13. C语言中%d,%o,%f,%e,%x的意义
  14. 3行代码 为你的网站博客添加萌萌哒可爱二次元女动漫玩偶人物(看板娘)
  15. JAVA网课|字符串
  16. Telnet访问百度www.baidu.com
  17. 【Leetcode】19. Remove Nth Node From End of List (cpp)
  18. tar 分卷压缩与解压缩
  19. 什么是期权激励_理解激励股票期权的快速指南
  20. 文献阅读09期:基于ADMM方法的柔性负载实时定价

热门文章

  1. Android build.prop详细优化
  2. c语言指针数组 难点总结,C语言指针与数组的难点分析.pdf
  3. python 判断 字串包含_数百道BAT等大厂最新Python面试真题,学到你手软!
  4. 两个重要的常数项级数
  5. kafka启动报错:INFO: os::commit_memory(0x00000000c0000000, 1073741824, 0) failed; error=‘Cannot allocate
  6. 三星I8750的使用
  7. 坦克大战 自备注改成(非原创)
  8. matlab 跳频序列,一种新的混沌宽间隔跳频序列的构造方法及其Matlab仿真分析
  9. 磁敏感加权成像(SWI):技术要点和临床神经学应用
  10. 【Angular】弹框