Tampermonkey

分类下相关文章

提升 Tampermonkey 脚本代码可读性的反思

晚上看了一段几年前写的会计网校自动挂学时的 Tampermonkey 脚本。 我发现可读性太差了,要修改功能的时候,逻辑梳理起来异常痛苦。 为何痛苦 自动挂学时其实原理很简单,就是模拟正常的点击操作。 但是,我的代码存在几个问题 代码头部一堆公共函数,而真正的逻辑在后面,看起来特别别扭 代码全是各种遍历 tr, td 的操作,然后各种 1,2, 3 判断,不知所云 面向逻辑编程,而不是面向 HTML 编程 解决方法 封装好功能,函数名可读性好。不要在循环里处理各种逻辑 公共函数置后 更多注释。难说一个脚本不会为何10年。。。 全局 debug 开关,方便直观的看到问题出在哪里。或者封装一 ...

阅读全文...

对 Tampermonkey GM_xmlhttpRequest 发送的 HTTP 请求进行调试

使用 Tampermonkey GM_xmlhttpRequest 循环提交几十次数据,服务器均报 500 异常时,会发现之后,再提交数据 console 中不再出现报错信息 服务器端 Nginx 中也没有请求日志 所以推测 Chrome 对请求进行了拦截。 在哪里能看到 HTTP 请求的报错信息 右键点击 tampermonkey 插件,选择“管理扩展程序”,在弹出的窗口中,点击 background.html 此时就能看到 HTTP 的错误信息了。 Failed to load resource: Request throttled Chrome 报的错误是这个,果然是被拦截了。网上 ...

阅读全文...

Tampermonkey Javascript 使用 window.close() 关闭当前 tab 页

一个自动化操作的需求,在新的 tab 页完成任务之后,使用 Tampermonkey 关闭这个 tab 页。 在当前最新版 Chrome 版本 70.0.3538.102(正式版本) (64 位)中测试 window.close() VM750:1 Scripts may close only the windows that were opened by it. 也就说,window.close() 只能关闭由 js 打开的窗口。如果这个窗口不是由 js 打开的,那就没有权限关闭。 function closeTab(){ window.open('', '_self', ''); ...

阅读全文...

Tampermonkey 切换 select 下拉框

VueJS 现在越来越流行,用 vuejs 的网站也越来越多,导致我想自动挂个学时都得费点周折。 例如,课程列表会随着选择的 select 下拉框不同的年份,展示不同的数据。 要想遍历到所有年份的课程数据,实现的方法 // 获取历年切换 var years = $('select[name="plans"] option').length; GM_log("共计" + years + "年的课程"); for (var year = 0; year < years; year++) { // 间隔时间去获取课程列表 (fu ...

阅读全文...

Tampermonkey 数据存储之 GM_setValue / GM_getValue

Tampermonkey 存储临时数据,之前只用过 cookie 的读存方式,非常麻烦。 看一下内置的 GM_setValue / GM_getValue GM_setValue(name, value) Set the value of 'name' to the storage. GM_getValue(name, defaultValue) Get the value of 'name' from storage. 简单测试 // ==UserScript== // @name New Userscript // @namespace http://tampermo ...

阅读全文...

tampermonkey 设置页面 cookie

之前搞定了tampermonkey 获取 cookie, 现在需要设置 cookie 的方法 function setCookie(c_name, value, expiredays) { var exdate = new Date(); exdate.setDate(exdate.getDate()+expiredays); document.cookie = c_name + "=" + escape(value) + ((expiredays==null) ? "" : ";expi ...

阅读全文...

tampermonkey 触发 vuejs 网页中 input 控件的 v-model 双向同步

在 tampermonkey 模拟自动提交数据 $('input[placeholder="text1"]')[0].value = 1; $('input[placeholder="text2"]')[0].value = 2; $('.submit .btn')[0].click(); 运行之后,总是提示,没有填写数据。。。 看了一下页面中的 js,发现提交部分是用 vuejs 写的,input 的值存储在 vuejs data 的变量中。 理论上,input 是设置了 v-model 双向绑定,数据在填写之后会自动同步到 data 相应变量中。 ...

阅读全文...

tampermonkey 调用三方域名下的 HTTP 接口

示例 Get 请求 // @require https://cdn.staticfile.org/jquery/1.9.1/jquery.min.js // @grant GM_xmlhttpRequest // @connect sunzhongwei.com GM_xmlhttpRequest ( { method: "GET", url: "http://xxx.sunzhongwei.com/api/get_something", onload: function (respons ...

阅读全文...

tampermonkey 中使用 jQuery 模拟鼠标点击

例如点击一个按钮 $('.btn-wrap a')[0].click(); 注意 $('.btn-wrap a').click(); 在 chrome console 中可以触发 vuejs 的 click 事件,但是在 tampermonkey 中无法触发。 修改成 $('.btn-wrap a')[0].click(); 即可。 直接模拟点击比修改属性好在哪里 例如,勾选一个 checkbox 勾选框,可以这样做 $($('input[name=qa]')[0]).prop('checked', true); 但是,如果目标网站是用的 vuejs 之类的,在 input 上绑定了各 ...

阅读全文...

tampermonkey 当前页面跳转后没有触发新页面对应逻辑

现象 页面 A: https://www.sunzhongwei.com/#/coding 页面 B: https://www.sunzhongwei.com/#/sleeping 页面 B 的内嵌 iframe 页面 C: https://www.sunzhongwei.com/dreaming 对页面 C 做了 tamermonkey 规则,即跳转到页面 A: window.top.location.href = 'https://www.sunzhongwei.com/#/coding'; 但是跳转之后,页面 A 对应 tampermonkey 逻辑并没有执行 if (window ...

阅读全文...

tampermonkey 作用于页面内 iframe 时,将页面地址修改的方法

正确的做法 window.top.location.href = 'https://www.sunzhongwei.com'; 错误的做法 window.location.href = 'https://www.sunzhongwei.com'; 这样只会修改 iframe 的页面内容,而其宿主页面并不会改变。 查看页面 frame 层级 Chrome - Application - Frames ...

阅读全文...

终止当前正在运行的 tampermonkey 脚本

例如,我要遍历一个 list,若其中一行包含某个状态,则跳转到下一页。 实现方法是在修改 window.location.href 之后,抛出个异常,即可终止当前 tampermonkey 脚本。 $('li').each(function (index, item) { var url = base_url + $(item).attr('href'); var spans = $(item).find('something2'); if ($(spans[2]).text().trim() != '三个广告牌') { GM_log(url); ...

阅读全文...

tampermonkey 获取页面 cookie

获取页面 cookie 的方法 function getCookie(name) { var nameEQ = name + "="; var ca = document.cookie.split(';'); for(var i=0;i < ca.length;i++) { var c = ca[i]; while (c.charAt(0)==' ') c = c.substring(1,c.length); if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c ...

阅读全文...

tampermonkey $ is not defined

原页面中已引入 jQuery, 但是 tampermonkey 编辑器中总是提示 $ is not defined 虽然不影响实际运行,但是看上去非常不爽。 在代码头部插入 var $ = unsafeWindow.jQuery; 即可解决。 另一种情况,确实是没有引入 jQuery 例如, unsafeWindow.jQuery 也是 null,说明页面并没有引入 jQuery。 这时就需要在 tampermonkey 中指定引入 jQuery。例如: // @require https://cdn.staticfile.org/jquery/3.3.1/jquery.min ...

阅读全文...

GM_log is not defined

由于新建的 Tampermonkey 脚本,默认设置了 // @grant none 所以,调用 GM_log('Hello World!');会报错 GM_log is not defined 两种解决方法: 增加 // @grant GM_log 去掉 grant none 这行配置。TM 会自动判断脚本中需要使用那些函数。 我虽然倾向于使用第二种方式,因为省事。但是实际使用中发现,这种方式经常报错。。。逼得我只能使用第一种方式。。。 ...

阅读全文...