【Google Chrome】NativeMessagingを使って拡張機能とC#クライアントアプリとで通信してみた

C#,WEB拡張,開発

おはようございます。

超久しぶりに技術ネタ。

Google Chrome(Edge、Firefox)の拡張機能を(自作)利用すると

クライアント側のアプリ(ソフト)と連携ができると知ったのでちょっと試してみました。

なかなか興味深いです。

スポンサーリンク

Native Messaging とは

Google Chrome公式ドキュメントより(翻訳)

拡張機能とアプリは、他のメッセージパッシングAPIと同様のAPIを使用して、ネイティブアプリケーションとメッセージを交換できます。

この機能をサポートするネイティブアプリケーションは、拡張機能との通信方法を知っているネイティブメッセージングホストを登録する必要があります。

Chromeは別のプロセスでホストを起動し、標準入力ストリームと標準出力ストリームを使用してホストと通信します。

簡単に言えば、クライアントアプリとWEB拡張機能の間でメッセージのやり取りができる仕組みです。

これを用いることにより、ブラウザだけではできなかったことが出来たりします。

拡張機能

拡張機能側は、manifest に拡張機能自体の情報や、利用する html や css、javascript などの情報を記述します。

manifest.json

Native Messaging を利用するために「Permissions」に権限を記述します。

content_scripts.js

WEBサイトを表示する度に実行されるスクリプトです。

(manifest で matches に全てのWEBサイトで動作するように指定してあります)

background.js

background.js 側で、SendMessage イベントをハンドリング。

また、その中で「sendNativeMessage」でアプリケーションとの通信を実行しています。

拡張機能のインストール

Google Chrome の設定>メニュー>拡張機能で拡張機能管理画面を表示します。

拡張機能管理
拡張機能管理

右上のデベロッパーモードをオンにします。

拡張機能の読み込み
拡張機能の読み込み

左上に出てくる、「パッケージ化されていない拡張機能を読み込む」をクリックし、自作した拡張機能ファイルが格納されているフォルダを選択します。

インストール後
インストール後

インストールされると管理画面に表示されるようになります。

※表示されている「ID」を控え、アプリ側の manifest.json に記述する必要があります。

これでひとまず拡張機能側の準備は完了です。

C#プログラム

manifest.json

「name」に指定した文字列が、拡張機能側から呼び出す時と、レジストリに設定するキーと一致している必要があります。

「allowed_origins」に拡張機能の管理画面で控えた文字列を記述します。

レジストリ登録

下記をコマンドプロンプトやバッチファイルから実行します。

※manifest.json と同じディレクトリで実行する

Json用のライブラリを追加

NuGetパッケージ管理
NuGetパッケージ管理

ソリューションエクスプローラーからプロジェクトを右クリックし、「NuGetパッケージの管理」を選択します。

パッケージインストール
パッケージインストール

検索ボックスに「json」と入力、一覧から「Newtonsoft.Json」を選択しインストールします。

確認ダイアログ
確認ダイアログ

確認ダイアログが表示された場合は、「OK」ボタンをクリックします。

Program.cs

メインの処理です。

拡張機能とのやり取りは、Json でしか行えません。

起動後に拡張機能から送られてきたメッセージを取得し、メッセージによって返却する文字列を変更する処理としました。

起動してみる

実行サンプル
実行サンプル

適当なページを表示した際に、拡張機能が実行されアプリから返却された文字列をアラート表示します。

うまくいきましたね。

エラーサンプル

エラーサンプル
エラーサンプル

上記は、拡張機能、レジストリ、アプリ(manifest)に記述したアプリを判別するキーが一致しなかった場合に出るエラーです。

エラー原因までなんとなく表示してくれるので大体調べたら分かりそうな感じですね。

まとめ

とにかくシンプルな仕組みでサンプルを作ってみました。

他にも色々出来そうなので、機会があったら続編も書きます。

何かのお役に立てれば。

ではでは。

 

スポンサーリンク


関連するコンテンツ