DockerとGoで実現!遠隔操作ブラウザ「ネコ」があなたの開発を変える
やあ、諸君! プロのソフトウェアエンジニアである君なら、きっと「もっと自由に、もっと安全に、ウェブの向こう側を覗き見たい」なんて考えたことがあるはずだ。まるでルパン三世がどんな厳重なセキュリティも掻い潜るようにね。今日紹介するのは、そんな君の願いを叶えるかもしれない、とびきりのツール「m1k1o/neko」、通称「ネコ」だ。
「ネコ」は、ルパン一味がどこかの隠れ家に秘密基地を構えるように、君自身のサーバーに仮想ブラウザを構築できる代物なんだ。しかも、ただのブラウザじゃない。Dockerでサッと起動できて、中ではGo言語がキビキビと動き、遠く離れた場所からでもWebRTCを使ってリアルタイムで操作できる。これって、まるで不二子ちゃんがルパンの代わりに現場の状況を遠隔操作で確認するようなもんだろ?
「ネコ」がソフトウェアエンジニアの君にとって、どんなお宝になるのか、いくつか例を挙げよう。
安全なサンドボックス環境でのブラウジング
怪しげなサイトを調査するとき、あるいは未知のウェブサービスを試すとき、君のPCを危険に晒したくないだろう? 「ネコ」は隔離された環境でブラウザを動かすから、万が一マルウェアに感染しても君のシステムには影響がない。まるで、ルパンが偽のターゲットを使って敵の罠をあぶり出すかのようだ。
Webスクレイピングの高度化
特定のウェブサイトから情報を収集したいけど、IPアドレス制限やボット対策に悩まされることがあるだろう。「ネコ」を使えば、プロキシと組み合わせたり、異なるIPアドレスからアクセスしたりといった工夫がしやすくなる。まさに、銭形のとっちゃんを欺くルパンの変装術に近い。
自動化されたE2Eテスト
ウェブアプリケーションのテストって、手動でやるのは骨が折れるし、毎回同じ結果になるとは限らない。「ネコ」はプログラムから操作できるから、GUI操作を含むE2Eテストを自動化できる。何度も同じ潜入を繰り返すのではなく、事前に計画された自動的な潜入で確実に目的を達成するイメージだ。
プライバシー保護の強化
自分のIPアドレスやブラウザのフィンガープリントを晒したくない場面もあるだろう。「ネコ」を使えば、君の本当の素性を隠し、まるで別人がアクセスしているかのように見せかけることができる。これは、ルパンがその姿をくらますのに長けているのと一緒だ。
遠隔でのデモンストレーション
開発中のウェブサービスを遠方のクライアントに見せたいとき、VPNや複雑な設定は避けたいもの。「ネコ」を使えば、ブラウザの画面を共有するだけで、どこからでもアクセス可能なデモ環境を提供できる。次元と五ェ門が連携して、離れた場所からでもルパンをサポートするかのようだね。
導入は驚くほど簡単だ。まるで、ルパンが最新の金庫を破るように、数行のコマンドで完了する。
まずは、Dockerが君のサーバーにインストールされていることを確認してくれ。Dockerがなければ、話にならない。まだなら、公式ドキュメントを参考にしてインストールしておこう。
君のターミナルを開き、以下の呪文を唱えるだけだ。
docker run -d \
--name neko \
--shm-size=2gb \
-p 8080:8080 \
-e NEKO_SCREEN="1920x1080@30" \
-e NEKO_PASSWORD="your_super_secret_password" \
m1k1o/neko:latest
一つずつ解説しよう。
docker run -d
「ネコ」をバックグラウンドで起動する、という意味だ。これで君は他の作業に集中できる。
--name neko
コンテナに「neko」という名前をつける。ルパン一味がアジトに名前をつけるようなもんだ。
--shm-size=2gb
ブラウザがスムーズに動作するために、共有メモリを2GB確保する。
-p 8080:8080
君のサーバーの8080番ポートを、「ネコ」の8080番ポートに接続する。これが、外界からアジトにアクセスするための入り口だ。
-e NEKO_SCREEN="1920x1080@30"
仮想ブラウザの解像度を1920x1080ピクセル、フレームレートを30fpsに設定する。ここはお好みに合わせて調整してくれ。
-e NEKO_PASSWORD="your_super_secret_password"
「ネコ」にアクセスするためのパスワードだ。絶対に君だけの秘密のパスワードを設定してくれ! ルパンが隠し金庫のパスワードを教えないのと同じだよ。
m1k1o/neko:latest
「ネコ」の最新版イメージを使う、という指定だ。
このコマンドを実行したら、ブラウザで http://君のサーバーのIPアドレス:8080 にアクセスしてみな。先ほど設定したパスワードを入力すれば、もう君は「ネコ」の世界に足を踏み入れている!
さて、ただブラウザを動かすだけなら、普通のブラウザと変わらない。ここからが「ネコ」の真骨頂だ。君のプログラムから「ネコ」を操る方法をいくつか紹介しよう。
「ネコ」はWebRTCを使ってブラウザの画面をストリーミングし、操作するためのWebSocket APIを提供している。これにより、様々な言語から操作が可能になる。ここではGo言語を使った簡単な例を示すが、原理は他の言語でも応用できるはずだ。
これは、君のプログラムが「ネコ」に接続し、特定のウェブページを開いてスクリーンショットを撮る例だ。
package main
import (
"context"
"fmt"
"log"
"time"
"github.com/go-rod/rod" // RodはHeadless Chromeを操作するためのGoライブラリ
)
func main() {
// 「ネコ」のURLに接続 (環境に合わせて適宜変更してください)
browser := rod.New().ControlURL("ws://localhost:8080/webrtc").MustConnect()
defer browser.MustClose() // 終了時にブラウザを閉じる
// 新しいページを開く
page := browser.MustPage("https://www.google.com").MustWaitLoad()
// 5秒待機 (ページが完全にロードされるのを待つため)
time.Sleep(5 * time.Second)
// スクリーンショットを撮影
if err := page.MustScreenshot("google_screenshot.png"); err != nil {
log.Fatalf("スクリーンショットの撮影に失敗しました: %v", err)
}
fmt.Println("スクリーンショットを撮影しました: google_screenshot.png")
}
このコードを実行するには、go-rod/rod ライブラリが必要だ。以下のコマンドでインストールできる。
go get github.com/go-rod/rod
解説
rod.New().ControlURL("ws://localhost:8080/webrtc").MustConnect()
ここがポイントだ。Rodライブラリを使って、「ネコ」のWebRTCエンドポイントにWebSocket接続している。これにより、Rodが通常のHeadless Chromeを操作するのと同じように、「ネコ」内のブラウザを操作できるんだ。
browser.MustPage("https://www.google.com").MustWaitLoad()
Googleのページを開き、完全にロードされるのを待っている。
page.MustScreenshot("google_screenshot.png")
開いたページのスクリーンショットをgoogle_screenshot.pngというファイル名で保存している。
これで君は、プログラムから「ネコ」の仮想ブラウザを操り、ウェブの情報を捕らえることができるようになったわけだ。
「ネコ」は、君のソフトウェア開発に新たな自由と可能性をもたらす、まさに切り札のようなツールだ。安全な環境での実験、自動化されたテスト、プライバシーを保護した情報収集など、その使い方は君の想像力次第で無限に広がる。