? ? ? 文章

神器级脚本:基于黑名单内容屏蔽的油猴脚本,根据黑名单过滤当前页面中你不想显示的信息

最近 什么值得买 越来越没看头了,简直就是妇女之友,各种化妆、洗护、母婴,还有市场大妈的鸡毛蒜皮,例如手纸、拖把、衣架、餐具等等,甚至还有虾片、花生、铅笔,就是便宜几毛一两块钱的东西,真是丧心病狂。信噪比极高,浪费人生,对男人老狗来说烦不胜烦,所以急需一个脚本过滤掉这些不喜欢的内容。

开始想到最简单粗暴的方法就是关键词过滤,但考虑到其它网站例如论坛总有一些让你哀伤不已想除之而后快的傻逼用户和月经话题,所以我打算写成通用的脚本,通过配置来支持更多网站。

于是我写了个油猴脚本 ,100 行不到,精简够用,仅支持 Firefox。

你不需要直接安装,因为不会有任何作用,这个脚本是作为库来调用的,需要再写一个脚本来间接使用,这样核心代码和配置代码分离,独立更新,易于维护。

来看看这么用。

在文件管理器里创建一个文本文件 blacklist_blocker_rule.user.js ,粘贴下面内容,以 UTF-8 编码保存,然后拖进 Firefox 里安装。

// ==UserScript==
// @name        Blacklist Blocker Rule
// @description blacklist blocker 规则
// @grant       none
// @require     https://raw.githubusercontent.com/muzuiget/greasemonkey-scripts/master/blacklist_blocker.user.js
// @include     *
// ==/UserScript==

let rules = [
{
    urls: 'http://www.smzdm.com/',
    test: true,
    node: '.leftWrap .list[articleid]',
    hide: function(node) {
        return node.querySelector('.itemName').textContent.contains('女');
    }
},
];

let blocker = BlacklistBlocker(rules);
blocker.run();
window.addEventListener('scroll', blocker.run);

然后打开 什么值得买首页 ,你会发现标题包含「女」字的商品,都被加上了一个红框,在自动翻页后,依然有效果。

神器级脚本:基于黑名单内容屏蔽的油猴脚本,根据黑名单过滤当前页面中你不想显示的信息

如果你现在看的页面刚好没有带「女」字的商品,修改上面的代码,把「女」字替换成其它。

来解释下每个规则属性的意义

urls: 'http://www.smzdm.com/',

很简单,这条规则对应的网址,这里是用的是正则表达式,部分匹配。

test: true,

测试模式,就是那个红框,用来预览要被过滤的内容,只要你改成 test: false ,再刷新,原先红框里的内容就会消失。

node: '.leftWrap .list[articleid]',

要被过滤内容的 CSS 选择器,匹配的节点将会被处理,这里就是每个商品的条目。

hide: function(node) {
    return node.querySelector('.itemName').textContent.contains('女');
}

过滤依据函数,带一个参数,就是上面 CSS 选择器匹配的节点,函数需要返回 true 或 false 来表示是否过滤。函数体代码意思是,选择出标题节点,看看文字是否包含「女」字。

纯粹的 JavaScript,判断条件代码你爱怎么写就怎么写。例如你想把 「童」这个字也过滤掉,可以这么写

hide: function(node) {
    let title = node.querySelector('.itemName').textContent;
    let keywords = ['女', '童'];
    for (let keyword of keywords) {
        if (title.contains(keyword)) {
            return true;
        }
    }
    return false;
}

但考虑到关键词是最常用的过滤依据,所以我加了个工具函数 xcontains ,让代码写得短一点,

hide: function(node) {
    let keywords = ['女', '童'];
    return node.xcontains('.itemName', keywords);
}

第一个参数是子节点选择器,第二个参数是关键词数组。

复杂一点,我还想只看几个主流商城的,过滤掉非华南地区的,以及一些鸡毛蒜皮的东西

hide: function(node) {
    // 只看商城
    let mallKeywords = ['亚马逊中国', '京东', '易讯', '苏宁易购'];
    if (!node.xcontains('.mall', mallKeywords)) {
        return true;
    }

    // 过滤物品
    let itemKeywords = [
        // 标签
        '限华东', '限华北', '每日更新', '凑单品','白菜', 
        // 不看
        '洗衣', '洗发', '沐浴', '牙膏', '牙刷', '狗粮', '猫粮',
        // 各种化妆品、洗护、母婴,丧心病狂的多,自己补充吧
    ];
    return node.xcontains('.itemName', itemKeywords);
}

我的物品关键词已经 100+ 了,每页信噪比 1:5,要换成白名单的节奏,累觉不爱。

幸运的是,什么值得买的页面设计很规范,发现频道 能使用相同的规则代码,而 urls 属性同样支持数组,所以不需要重复写了。

urls: ['http://www.smzdm.com/', 'http://fx.smzdm.com/'],

再举一个规则例子,屏蔽 V2EX 的月经话题

{
    urls: 'http://www.v2ex.com/',
    test: false,
    node: '.cell.item',
    hide: function(node) {
        let keywords = [
            '二手交易', '小米', '红米',
            '如何评价', '如何看待', '怎么评价', '怎么看',
        ];
        return node.xcontains('table', keywords);
    }
},

还有最后一个注意的地方,油猴的 @include * ,使用了全局匹配,不是一个好习惯,我这里为了方便调试偷懒而这样写的,当调试完成后,最好明确改成指定网址,对上面提到的两个网站,就是

// @include     http://*.smzdm.com/*
// @include     http://*.v2ex.com/*

注意,油猴这里用的是通配符。

所以编写一个规则的流程是:

  • 指定规则的网址
  • 打开测试模式
  • 编写节点选择器
  • 编写过滤依据函数,反复刷新页面测试
  • 关掉测试模式
  • 明确指定油猴的 @include 的匹配网址

本脚本作者:七星庐

基于黑名单内容屏蔽的油猴脚本下载地址
原文链接:,转发请注明来源!
1 0

发表评论

  • 评论4则,共1页,当前第1
    • nacl

      还是懒得屏蔽了,直接在 移动端订阅想买的东西好了

      0 0 Firefox 38.0 Firefox 38.0 Windows 10 x64 Edition Windows 10 x64 Edition回复
      • 嗯,现在都是用APP

    • linklemon

      什么值得买现在广告泛滥,黄牛成群。
      真正值得买的你几乎买不到。

      0 0 Firefox 35.0 Firefox 35.0 Windows 8.1 x64 Edition Windows 8.1 x64 Edition回复