通过 Opera 的 URL 过滤 API 实现站点拦截

Opera 内置的拦截功能已经帮助用户很久了,随着 URL 过滤 API 的开放,开发者能开发出能更方便的拦截和控制拦截的扩展。接下来我们来看看 URL 过滤 API 是如何工作的,什么情况下它是有用的,教大家如何使用它。
-原理-
Opera 内置的拦截器通过过一个包含域名列表的文件来拦截,类似于操作系统里 hosts 文件的工作方式。这个文件即是 urlfilter.ini ,在用户配置文件夹里能找到,可以在浏览页面时右键选择“内容拦截”来添加拦截的内容。也可通过“菜单-设置-首选项-高级-内容-阻止的内容”来管理。 URL 过滤 API 允许扩展将域名临时添加到拦截器里。
-用途-
一些可能有用功能:

  • 按时拦截:如果你是微博控,可以让扩展在上班的时候拦截相关网站
  • 拦截页面内容:拦截页面上的广告
  • 一键拦截:点击按钮将当前访问的域名加入黑名单
  • 拦截定制:通过第三方列表拦截。

到这里你也许会有疑问,这些不都可以通过 Javascript 来实现吗?确实能够,但是通过这个 API 有以下两个好处:

  • 当拦截成百上千的站点时,用浏览器原生的功能能大大地提高效率
  • 通过一个简单的方法就能实现拦截,这使得代码简洁而易维护


-如何使用-
不说理论了,来点实际的吧。让我们来做一个非常简单的扩展,实现对新浪微博网站的拦截。
要使用 URL 过滤 API首先要在 config.xml 里声明它:

<feature name="opera:urlfilter"/>

我们知道扩展会通过 config.xml 来请求 index.html,建立它。这个扩展只需要调用一个脚本文件--background.js

<!DOCTYPE html>
<html lang="zh-cn">
<head>
<meta charset="utf-8">
<script src="background.js"></script>
<title>URL 拦截</title>
</head>
<body>
</body>
</html>

现在我们来看 background.js 里如何写:

var sites = ['*://weibo.com/*', '*://*.weibo.com'];
var filter = opera.extension.urlfilter;

注意:星号(*)可作为通配符用在 URL 里的任意位置,例如 *:// 将会阻止任何协议的的页面包括 http 和 https 。

目前为止都很简单。URLFilter 对象包含了一个拦截列表和两个方法:add() 和 remove() 。我们这个例子需要通过遍历数组来添加站点:

for (var i = 0, len = sites.length; i < len; i++) {
filter.block.add(sites[i]);
}

最后,我们应该将上面的代码放到一个 API 自检的判断里

if (typeof opera.extension.urlfilter != 'undefined') {
...
}

就是这样了。下载这个扩展,或者用下面完整的代码自己建立一个扩展。注意,在安装扩展后最好清理一下浏览器缓存,否则有可能没有用哦。

config.xml

<?xml version="1.0" encoding="utf-8"?>
<widget xmlns="http://www.w3.org/ns/widgets" defaultlocale="zh-cn">
<name>URL Filter Example</name>
<description>拦截站点的例子</description>
<author href="http://blog.weixiaowei.net/">味小味</author>
<feature name="opera:urlfilter"/>
</widget>

index.html

<!DOCTYPE html>
<html lang="zh-cn">
<head>
<meta charset="utf-8">
<script src="background.js"></script>
<title>URL 拦截</title>
</head>
<body>
</body>
</html>

background.js

// 检查 API 是否存在
if (typeof opera.extension.urlfilter != 'undefined') {
// 把要拦截的站点放进数组里
var sites = ['*://weibo.com/*', '*://*.weibo.com'];
// 把 URLFilter 对象赋给一个有意义的变量
var filter = opera.extension.urlfilter;
//通过遍历把站点添加到拦截列表里
for (var i = 0, len = sites.length; i < len; i++) {
filter.block.add(sites[i]);
}
}

很显然,这个例子还能进一步改进,例如允许用户自定义拦截站点,要实现则需要使用扩展的首选项功能。

-结语-
正如你看到的,URL 过滤 API 使用起来很简单,但是很强大。它是建立在 Opera 桌面浏览器里使用了很久的一个技术上,现在你可以建立你自己的接口使它变得更强大。值得提醒的是,Opera 的内容拦截并不是简单的隐藏--它是在下载页面时是就阻止了--用户不需要等待或者支付没看到的内容。
本文根据翻译改编而成,原文链接:http://dev.opera.com/articles/view/site-blocking-with-operas-url-filter-api

posted @ 2012-07-10 13:37  几个你  阅读(656)  评论(0编辑  收藏  举报