Chrome拡張機能とWindowsアプリの連携

投稿者: | 2021年11月26日
お久しぶりです。GMO NIKKOのS.Tです。
今回は個人的に使用している作業自動化の事例を紹介します。
 

全体的な流れ

ある動画サイトの配信履歴を収集するシステムを作りました。
Windowsアプリでその配信履歴のページを解析するというものですが、
最近対策されたのかそのページをダウンロードしても解析できなくなりました。
(どうやらそっくりな偽サイトができたので対策したようです)
Chromeでそのページを見てみるとページ情報は問題なく見れているので、
拡張機能で解析してそのデータをWindowsアプリへ渡すようにしました。
 

Windows中継アプリのビルド

C#で下記のように記述します。
趣旨から外れるので詳細は省略しますが、 Read()で拡張機能から受信したJSONデータを標準入力で受け取ってテキスト型に変換しています。
そのあとSystem.Diagnostics.Process.GetProcessesByNameで起動中の常駐アプリを検索して(***には対象のウィンドウタイトル名を設定)
ウィンドウハンドルを取得してJSONデータをSendMessageで送信します。
exe名はChromeToWinapp.exeとします。
 

拡張機能の設定

下記ファイルを適当なフォルダにまとめておき、Chromeのデベロッパーモードでパッケージ化されていない拡張機能を読み込むで読み込みます。
 
manifest.json…設定ファイル
content_scriptsのmatchesに対象ページのURLを設定
permissionsにnativeMessagingを設定
content_script.js…特定のURLで実行するスクリプト
対象ページで取得したデータをbackground.jsにsendMessageで送信します。
background.js…バックグラウンドで実行するスクリプト
content_script.jsから受信したデータをsendNativeMessageでWindows中継アプリへ送信します。 chrome.runtime.sendNativeMessageの第一引数のtestはレジストリに登録する値に合わせる必要があります。
 

拡張機能でNative Messagingを使うための設定

ChromeToWinapp.jsonはこのように記述します。
pathはWindows中継アプリのexe名です。
allowed_originsのchrome-extension://に対象の拡張機能のIDを設定してください。
{
“name”: “test“,
“description”: “Native Message Test”,
“path”: “ChromeToWinapp.exe”,
“type”: “stdio”,
“allowed_origins”: [ “chrome-extension://loohlieaidnehfgjmimijmdfhaklnomd/” ]
}
 
レジストリに下記の値を登録してください。
色がついているテキストはjsonと合わせる必要があります。
キー: コンピューター\HKEY_CURRENT_USER\SOFTWARE\Google\Chrome\NativeMessagingHosts\test
値: [ChromeToWinapp.jsonのパス]
 

まとめ

対象ページを表示すると常駐アプリへ放送IDが送信されれば成功です。
完全放置で配信履歴を収集するようになります。
Native Messagingを使うとChromeの拡張機能とWindowsアプリが連携できるようになります。
極端な話、Chromeでページを表示するだけでPCのローカルファイルを削除できてしまうので非常に危険です。
なのでそこらへんは考えられていて、使用するには拡張機能のインストールとレジストリの登録が必要になっているので商用利用は難しいと思います。
今回の事例では個人的な作業の自動化に留めるようにしています。
 
参考URL