Pythonで検索エンジン拡張機能を自動生成するツールを作った(for Chrome)

公開日:2019-01-29
最終更新:2019-02-01

記事の内容のアップデートも兼ねて書き直したものをQiitaに投稿しました。
Chromeでもブックマークニックネームがしたかった私は拡張機能を自動作成することにした。

はじめに

Google Chromeにおいて、検索エンジン機能は数少ない、そしてとても有用なカスタマイズ可能な機能です。
ブックマークニックネーム機能を実現することができたりブックマークレットと組み合わせて悪魔的ないろいろができたりします。

そんなカスタム検索エンジン機能ですが、設定が圧倒的にめんどくさい!!!
どうにかして自動化できたらいいんですが…。

ブックマークではないためインポート用HTMLを生成する方法は使えず…。
関連記事: Pythonでブックマークインポート用HTMLを自動生成するツールを作った(for Firefox)

拡張機能でなんとかしてみたものの、使い勝手が悪すぎて耐えられず…。
関連記事: Chromeでのブックマークニックネームを拡張機能でなんとかしたい!

行き着いたのは、悪魔的解決法でした。

拡張機能自動生成

拡張機能で検索エンジンを登録するという方法です。
調べてみたら、manifest.json内でchrome_settings_overridesを用いることで設定できるようです。

{  
    "manifest_version": 2,  
    "name": "niconico",  
    "version": "0.1",  
    "chrome_settings_overrides": {  
        "search_provider": {  
            "name": "niconico",  
            "keyword": "nv",  
            "search_url": "https://www.nicovideo.jp/search/{searchTerms}",  
            "favicon_url": "https://www.google.com/s2/favicons?domain=www.nicovideo.jp",  
            "encoding": "utf-8",  
            "is_default": false  
        }  
    }  
}

上記のmanifest.jsonをChromeに読み込ませることにより、検索エンジンが設定されます。
ちなみに上記はニコニコ動画検索用のものです。

見てもらえば分かる通り、manifest.json一つ = 拡張機能一つに対し、検索エンジン一つしか設定できません。
(まぁ当然ですが)。

そのため、たくさんの検索エンジンを設定するためには、manifest.jsonを自動生成する = 拡張機能を自動生成する必要があります。

悪魔的ッ!

作ったもの

Pythonでブックマークインポート用HTMLを自動生成するツールを作った(for Firefox)をもとにしました。

ディレクトリ構造は、以下の通り。

├── data  
│   └── bookmarks.json  
└── master.py

./data/bookmarks.jsonを読み込み、拡張機能用manifest.jsonに加工します。

bookmarks.jsonは以下のような感じ。

[  
    { "key": "gg",  "name": "Google", "uri": "https://www.google.com/" },  
    { "key": "gg:", "name": "Google", "uri": "https://www.google.com/search?q=%s" },  
]

そして加工するmaster.pyは以下の通り。

#!/usr/bin/env python3  
# -*- coding: utf-8 -*-  

template = {  
    "manifest_version": 2,  
    "version": "1",  
    "name": "",  
    "chrome_settings_overrides": {  
        "search_provider": {  
            "name": "",  
            "keyword": "",  
            "search_url": "",  
            "favicon_url": "",  
            "encoding": "utf-8",  
            "is_default": False  
        }  
    }  
}  

import os  
import shutil  
import json  
from urllib.parse import urlparse  

os.chdir(os.path.dirname(__file__) or './')  

if os.path.isdir('./result'):  
    shutil.rmtree('./result')  
os.mkdir('./result')  

with open('./data/bookmarks.json') as f:  
    bookmarks = json.loads(f.read())  

for bookmark in bookmarks:  
    manifest = template.copy()  

    manifest['name'] = bookmark['name']  
    manifest['chrome_settings_overrides']['search_provider']['name'] = bookmark['name']  
    manifest['chrome_settings_overrides']['search_provider']['keyword'] = bookmark['key']  
    manifest['chrome_settings_overrides']['search_provider']['search_url'] = bookmark['uri'].replace('%s', '{searchTerms}')  
    manifest['chrome_settings_overrides']['search_provider']['favicon_url'] = 'https://www.google.com/s2/favicons?domain=' + urlparse(bookmark['uri']).netloc  

    os.mkdir('./result/' + bookmark['key'])  
    with open('./result/' + bookmark['key'] + '/manifest.json', mode='w') as f:  
        f.write(json.dumps(manifest))

templateは文字通りmanifest.jsonのテンプレートです。
template.copy()して使っています。

コピーした連想配列に、読み込んだブックマークのデータをもとに値を一つ一つ入れていきます。
favicon_urlは適当にGoogleに働いてもらいます。

そして、ディレクトリを作りその中にmanifest.jsonとして書き出します。

結果的に以下のようなディレクトリ構造になります。

├── data  
│   └── bookmarks.json  
├── master.py  
└── result  
    ├── gg  
    │   └── manifest.json  
    └── gg:  
        └── manifest.json

問題点

ブックマークレットが使えない

WebExtensionsの仕様なのか、javascript:で始まるURIだと弾かれました。
まぁ仕方ないですかね。任意のコードを実行されると危険ですし。

Data URIが使えない

WebExtensionsの仕様なのか、data:で始まるURIだと弾かれました。
まぁ仕方ないですかね。フィッシングとかに使えそうな感じですし。

Chromeではファビコンが表示されない

おいおい。せっかく設定してやったっていうのに。
まぁ見た目はどうでもいいですかね。

インストールがめんどくさい

拡張機能のページに一つ一つドラッグアンドドロップするのはめんどくさいです。
まとめてぶち込みたい!

追記(2019/02/01)
Chromeの起動オプション使えばいいことに気が付き、起動スクリプトを書きました。
詳しくはQiitaのほうの記事をご参照ください

アドレスバーが賑やかになる

大変賑やかな様子になっております。

(ちなみに黒いのは今Google Chrome Canaryでテスト中のダークテーマです)。

おわりに

あーもっとドキドキするようなWebブラウザないかなー。

記事が少しでもいいなと思ったらクラップを送ってみよう!
36
+1
@okayuの大して技術的ではないブログ

よく一緒に読まれている記事

0件のコメント

ブログ開設 or ログイン してコメントを送ってみよう
目次をみる

技術ブログをはじめよう

Qrunch(クランチ)は、ITエンジニアリングに携わる全ての人のための技術ブログプラットフォームです。

技術ブログを開設する

Qrunchでアウトプットをはじめよう

Qrunch(クランチ)は、ITエンジニアリングに携わる全ての人のための技術ブログプラットフォームです。

Markdownで書ける

ログ機能でアウトプットを加速

デザインのカスタマイズが可能

技術ブログ開設

ここから先はアカウント(ブログ)開設が必要です

英数字4文字以上
.qrunch.io
英数字6文字以上
ログインする