User Script

tomorrow.cyz@gmail.com

摘要:本文讲述浏览器技术中常用的user script。

一、什么是user script

User scripts或者称userscripts,是用来在客户端(浏览器或者代理服务器)对特定的网页进行修改的脚本,一般用来改变页面的外观或者增加修改功能。User scripts目前常见的是用javascript书写的脚本。

最著名的user scripts是AdBlock,帮助用户拦截广告在内的各种页面元素,并使这些内容不被下载或者显示。

User scripts最早在Firefox上运用(通过Greasemonkey扩展),迄今为止,包括Chrome,Opera,IE,Safari等浏览器或内置或通过插件,都对user script进行的支持。详细情况参见http://emulefans.com/userscript-on-various-browsers/。

Chrome对User Script的安装最简单,9.0以后的版本,只要user.js后缀的脚本直接拖到浏览器中,在右下角的选择中,选允许,就成功安装了脚本,通过工具à扩展程序菜单,可以进行插件的管理。

Firefox需要安装Greasemonkey插件来支持user script,插件和user script的安装参考http://diveintogreasemonkey.org/install/index.html。

二、user  script的书写

书写user script的前提是熟悉html和javascript。在学习user script时,Dive into Greasmonkey(http://diveintogreasemonkey.org/toc/)是一本很棒的教材,几乎是手把手交。

下面以我写的一个user script为例来简单讲述user script的书写。

相信大家平常搜索引擎的使用概率都非常高,对于google和baidu这两个搜索引擎,大家可能各有喜好,对于我来说,技术方面的问题,我偏向用google进行搜索,但是有时候有些特定的搜索特别是中文搜索,貌似baidu的搜索结果也有优于google的地方,所以我特别希望浏览器提供一个功能,就是我在进行google搜索以后,如果不满意搜索结果,可以直接点击菜单进行baidu搜索,不需要再输入关键词。同样,在baidu搜索以后,如果没有找到合适的结果,则直接点击菜单进行google搜索,同样不需要输入关键词。以前我希望通过修改浏览器内核来实现,自从发现了user script这个东东以后,我发现,用user script来实现这个,只需要几句话,非常之简单,不需要深入内核。

先上一张图,在baidu中搜索”user script”的截图。

在上图中点击”try google”,转向google搜索。搜索结果如下图,红色标注链接try baidu,可以直接尝试搜索baidu。

看了一天的diveintogreasemonkey,写出了如下user script。

[javascript] view plaincopy
  1. // ==UserScript==
  2. // @name         Try another Search engine
  3. // @author       tomorrow.cyz@gmail.com
  4. // @namespace    http://t.sina.com.cn/chenyuzhi
  5. // @description  try another search engine when you perform baidu/google search
  6. // @include      http://www.baidu.com/s?*
  7. // @include      http://baidu.com/s?*
  8. // @include      http://www.google.com.hk/*
  9. // @include      http://google.com.hk/*
  10. // ==/UserScript==
  11. function g_search_func()
  12. {
  13. var keywords=document.getElementById("kw");
  14. window.location.href="http://www.google.com.hk/search?q="+keywords.value;
  15. }
  16. if (document.location.href.indexOf('baidu.com') != -1)
  17. {
  18. var tools = document.getElementById('tools');
  19. if (tools) {
  20. tools.parentNode.removeChild(tools);
  21. }
  22. var con = document.getElementById('mCon');
  23. if (con) {
  24. con.parentNode.removeChild(con);
  25. }
  26. var menus = document.getElementById('mMenu');
  27. if (menus) {
  28. menus.parentNode.removeChild(menus);
  29. }
  30. var allEle, thisEle;
  31. allEle = document.evaluate(
  32. "//*[@class='tools']",
  33. document,
  34. null,
  35. XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE,
  36. null);
  37. for (var i = 0; i < allEle.snapshotLength; i++) {
  38. thisEle = allEle.snapshotItem(i);
  39. thisEle.parentNode.removeChild(thisEle);
  40. }
  41. var google_btn=document.createElement("input");
  42. var baidu_btn=document.getElementById("kw").nextSibling;
  43. google_btn.setAttribute("type", "button");
  44. google_btn.setAttribute("name", "gsearch");
  45. google_btn.setAttribute("value", "try google");
  46. google_btn.addEventListener('click',g_search_func,true);
  47. google_btn.setAttribute("class","btn");
  48. baidu_btn.parentNode.insertBefore(google_btn,baidu_btn.nextSibling);
  49. }
  50. else
  51. {
  52. var allEle, thisEle;
  53. allEle = document.evaluate(
  54. "//input[@name='q']",
  55. document,
  56. null,
  57. XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE,
  58. null);
  59. for (var i = 0; i < allEle.snapshotLength; i++) {
  60. thisEle = allEle.snapshotItem(i);
  61. break;
  62. }
  63. var keywords=thisEle.value;
  64. var resultStats=document.getElementById('resultStats');
  65. if(resultStats)
  66. {
  67. var baidu_link=document.createElement("div");
  68. baidu_link.innerHTML="<a  class=/"gl nobr/"  style="/" mce_style="/""color:#4373db/" href="/" mce_href="/""http://www.baidu.com/s?wd=" +keywords+ "/"><strong>try baidu</strong></a>";
  69. }
  70. }

我是个javascript和html的菜鸟,所以这个user script,可想而知,写得也不咋样。但作为一个入门介绍的例子,将就着吧。

user script的开始首先要有meta data。这是固定的格式,说明作者,user script的描述,这些信息在用户安装的时候可能会弹出来提示用户。另外,@include很重要,表示这个user script适用的页面。同@include关键字相反,还有@exclude关键字,过滤掉一些网站。

推荐使用DOM inpector结合代码来进行学习分析。对于baidu的页面来说,该脚本去掉了tools,mCom,mMenu等元素(也就是手写,设为首页等我认为无用的链接,根据id识别),在这里用到的还都是javascript的语句。有时候baidu的页面中tools没有id,而是name属性,这时候用到了XPath的功能,XPath在用户脚本中非常重要,建议阅读diveintogreasemonkey的4.6节(http://diveintogreasemonkey.org/patterns/match-attribute.html)以及xpath教程。baidu获取关键字是通过getElementById,取value值,就是javascript语句,然后这里用到了一句window.location.href=来进行跳转。另外一个就是try google按钮的加入,其实只要通过DOM inspector找到"百度一下“按钮,然后用javascript实现出来,再调用insertBefore来插入生成的"try google”按钮的节点就可以。对于google的页面,生成的是link,所以更加简单,自己阅读代码吧。

http://userscripts.org  这个网站提供了大量的user script供大家免费下载学习,还可以在论坛提脚本申请。

参考

1.       UserScript(用户脚本)在Firefox、Opera、IE678等不同浏览器上的使用(http://emulefans.com/userscript-on-various-browsers/)

2.             Greasemonkey的wiki(http://zh.wikipedia.org/w/index.php?title=GreaseMonkey)

3.             Greasemonkey教程(http://diveintogreasemonkey.org/toc/)

4.               Opera的user script介绍(http://kb.operachina.com/node/184)

User Script浏览器用户自定义脚本userscripts相关推荐

  1. js如何使浏览器允许脚本异步加载

    js如何使浏览器允许脚本异步加载 如果脚本体积很大,下载和执行的时间就会很长,因此造成浏览器堵塞,用户会感觉到浏览器"卡死"了,没有任何响应.这显然是很不好的体验,所以浏览器允许脚 ...

  2. Script Insertion -客户端脚本植入攻击

    实验目的与要求 了解客户端脚本植入攻击的方式 掌握防范攻击的方法 预备知识 所谓客户端脚本植入( Script Insertion)攻击,是指将可以执行的脚本插入到表单.图片.动画或超链接文字等对象内 ...

  3. 深入比特币原理(四)——锁定脚本(locking script)与解锁脚本(unlocking script)

    通常比特币都是以虚拟货币的概念出现在大众眼前,实际上比特币是第一个真正的区块链"平台",利用它去中心化.不可篡改.可追溯等特点不光可以实现多种交易模式(如点对点交易.多重签名交易等 ...

  4. 清除所有浏览器历史数据脚本_不要让浏览器吸收所有数据

    清除所有浏览器历史数据脚本 一些工具可以帮助您私下浏览网页 (A few tools to help you surf the web privately) In the aftermath of F ...

  5. Postman教程-Pre-request Script和Tests脚本进阶

    下面介绍一下在postman中,一些脚本的常见用法: responseBody 等价于response.text,表示接口请求的响应体,类型为string,如果返回的字符串是json格式的,可以使用J ...

  6. Loadrunner11如何使用非IE浏览器录制脚本

    为什么80%的码农都做不了架构师?>>>    下面提到的loadrunner11版本是经过汉化后的,所以界面是汉化版的.下面的教程也适用于高版本的IE. 如何安装.汉化.破解可以参 ...

  7. 【错误记录】Groovy工程中的文件查找策略 ( main 函数中需要使用 src/main/groovy/Script.groovy | Groovy 脚本直接使用代码相对路径 )

    文章目录 一.报错信息 二.解决方案 一.报错信息 在 Java 类中 , 调用 Groovy 脚本 , 出现如下错误 ; java.io.FileNotFoundException: Y:\002_ ...

  8. php怎么跳转别的手机浏览器,JavaScript_JS脚本根据手机浏览器类型跳转WAP手机网站(两种方式),随着移动互联网的不断普及, - phpStudy...

    JS脚本根据手机浏览器类型跳转WAP手机网站(两种方式) 随着移动互联网的不断普及,企业的网络宣传不仅只局限在PC端,还要在移动端发展.我们在自己的网站做了WAP手机完整之后,如果有用户通过手机访问我 ...

  9. c++获取一段代码的执行时间_微软IE浏览器JScript脚本引擎远程代码执行漏洞通告...

    文档信息 编号 QiAnXinTI-SV-2019-0022 关键字 IE JScript RCE 远程命令执行CVE-2019-1367 发布日期 2019年09月24日 更新日期 2019年09月 ...

最新文章

  1. 西北师范大学地理与环境科学学院考研真题汇总(自然地理学)持续更新。。。
  2. javafx 项目_JavaFX,Jigsaw项目和JEP 253
  3. 计算机应用基础教学改革参考文献,关于计算机应用基础论文范文资料 与计算机应用基础课程教学改革分析有关论文参考文献...
  4. element-ui表格组件table踩坑总结
  5. sytlengan2 代码解析
  6. git 入门教程之 git 私服搭建教程
  7. 使用CROS解决跨域问题
  8. typeorm_如何评价TypeORM?
  9. static_cast、dynamic_cast、const_cast和reinterpret_cast总结(转)
  10. 自己写的一个 游标 实例
  11. 别不把自己当有钱人 ——让白领族成为百万富翁族的六大理财秘籍
  12. python的输入和输出语句
  13. 基于Fisher准则的线性分类器设计
  14. kinetis FTM 分析笔记
  15. ikbc键盘win键失灵原因
  16. Java面试题全集(上)-基础知识
  17. 联想thinkbook14+2023款和2022款区别对比评测
  18. 【FlashDB】第二步 FlashDB 移植 STM32L475 使用QSPI驱动外部 flash W25Q64之 SFUD 移植
  19. 华为鸿蒙系统支持旧机型,华为鸿蒙系统2.0来了! 华为鸿蒙2.0系统支持手机机型...
  20. SOUI的配置和使用

热门文章

  1. IPS是什么,有什么用
  2. java 根据日期计算当前周一和周日,及根据秒数计算天小时分钟秒数等相关日期
  3. 计算机科学属与a类吗,双一流大学名单及学科 a类b类有什么区别
  4. 迅龙数据恢复软件真的很万能
  5. plc与Android系统通讯,一文看懂PLC的通讯方式——AB系统(一)
  6. PLS-00402: 要求在游标的 SELECT 列表中具有别名, 以避免列名重复
  7. mysql 不同端口_mysql不同端口的连接
  8. Matlab学习 矩阵分解,特征值, 特征向量
  9. java多线程查询_java多线程查询
  10. 第四篇:常用风控模型指标体系