macOSのFirefoxでアドオンなしでドメインベースのサイトブロックをする方法について。
言うまでもなく広告はウェブサイトの大切な収入源です。
適切に配置された美しい広告はWebサイトのコンテンツのひとつとも言えます。
一方、Webサイトの美観を損ねるだけの広告や、見る人を傷つける脅迫めいた広告、JavaScriptでユーザのリソースを無駄に消費するだけの迷惑な広告が多いのも事実です。

この広告は常にスクロールしているので非常に目障りなうえに、ExcelVBAの書籍を表示するなど、常軌を逸しています。
こういったものは、広告配信プラットフォームごと表示を拒否してしまうのが得策です。
そこで、Firefoxにアドオンを導入しようとしたのですが、有名どころのAdBlock PlusもuBlock Originもtoo muchに思えたので、Firefoxの基本機能だけでドメイン指定のサイトブロックをできないか試してみました。
ブロックすべきドメインの調査
ツール > ウェブ開発 > インスペクター
からインスペクターを立ち上げ、広告ウィジットのiframe要素やscript要素のsrc
に指定されているURLを探します。
先ほどの広告は、http://xml.affiliate.rakuten.co.jp
からJavaScriptが配信されているようです。
ドメインのブロック
Native content blocking in Firefox without installing any extensions によると、Firefoxプロファイルに含まれるpermissions.sqlite
を直接編集すると、ドメインを指定してコンテンツの読み込みをブロックできるようです。
Firefoxのプロファイルは、~/Library/Application\ Support/Firefox/Profiles/q4xjykpp.default
にあります。(q4xjykpp
の部分は環境によって異なるかもしれません)
まずこのディレクトリに移動します。
cd ~/Library/Application\ Support/Firefox/Profiles/*.default
パーミッションの設定はpermissions.sqlite
に記録されています。
このファイルはsqliteというデータベースなので、sqliteにアクセスするためのコマンドがあるかどうか確認します。
sqlite3 --version
3.16.0 2016-11-04 19:09:39 0e5ffd9123d6d2d2b8f3701e8a73cc98a3a7ff5f
このようにバージョン番号が表示されればsqlite3コマンドは存在しています。
もし、sqlite3: command not found
と言われてしまった場合は、次のようにしてインストールします。
brew update
brew install sqlite3
続いて、現在設定されているパーミッションの設定を確認してみます。
(echo ".headers on"; \
echo ".mode column"; \
echo ".width 4 40"; \
echo "select * from moz_perms;") | \
sqlite3 permissions.sqlite
id origin type permission expireType expireTime modificationTime
---- ---------------------------------------- ----------- ---------- ---------- ---------- ----------------
1 https://outlook.office.com offline-app 1 0 0 1491799577598
2 https://teams.microsoft.com offline-app 1 0 0 1491811815188
4 http://www.openstreetmap.org geo 1 0 0 1497640565896
7 https://wired.jp desktop-not 2 0 0 1512983172841
.
.
.
ここまで確認できたら、sqlite3
コマンドで、http://xml.affiliate.rakuten.co.jp
からのJavaScript読み込みを禁止する設定を追加してみます。
echo "INSERT INTO 'moz_perms' (origin, type, permission) VALUES('http://xml.affiliate.rakuten.co.jp', 'script', '2');" | \
sqlite3 ./permissions.sqlite
追加ができたら、ちゃんと追加されているかどうか確認してみます。
(echo ".headers on"; \
echo ".mode column"; \
echo ".width 4 40"; \
echo "select * from moz_perms;") | \
sqlite3 permissions.sqlite | \
grep rakuten
57 http://xml.affiliate.rakuten.co.jp script 2
あとはFirefoxを再起動すれば、さきほどの広告が消えているはずです。