閲覧制限を回避するHTTP ProxyサーバとChrome拡張の作成方法

中国では色々なサイトが政府規制により閲覧できない。

また日本広告主協会Web広告研究会が2005年12月13日に発表した調査結果によると、社内PCから閲覧できるWebサイトを制限している企業が7割にのぼっている。

 

 

規制方法には「URLフィルタリング」や「キーワードによる規制」など色々とある。

見ようと思っているサイトが閲覧できないというのは非常にストレスだ。

だからといってスマホを取り出して閲覧するのは明らかに遊んでそうだしパソコンでみたいよね。

「URLフィルタリング」の場合の閲覧規制回避策は「大人のCGIスクリプト (ハッカージャパンBOOKS 3)」で学生時代に学習済。

具体的には規制の範囲外にあるHTTPのProxyサーバ経由でアクセスすることで、URLフィルタリングを回避するというもの。

これを使って閲覧規制のあるサイトは閲覧していたけど、CSSや画像が読み込めず20年ぐらい諦めていた。

今回、LLM様のおかげで画像やCGIも読み込み可能となり更にChrome extensionからの呼び出し対応を実現できたので、クリック一発で閲覧可能となった。

サーバーを使用するプロキシ方式をPHPで実現する

HTTPプロトコルは、リクエストとレスポンスのデータをストリーム(連続したデータの流れ)として扱うことができる。

これにより、サーバーは以下のような動作が可能になる。

  • ターゲットサーバーから受け取ったデータを、保存せずにそのままクライアントに転送
  • データの受信と送信を並行して行う(リアルタイムで中継する)

実際に作成されたWebページはこんな感じ。

ここでURLとリファラーを入れたらアクセス可能になる。

技術的なお話

プロキシを通じてHTMLを読み込む場合、リンク先のリソース(画像や他のページ)もプロキシ経由でアクセスする必要がある。

そこで次のような対応が必要だ。

  • CSSファイルの相対パスを絶対パスに変換
    convertRelativePaths関数を使用して、CSS内の相対パスを絶対パスに変換。

  • HTML内のリンクをプロキシ経由に変換
    preg_replace_callbackを使用して、srchref属性をプロキシ経由のURLに変換。

  • CSSファイルのMIMEタイプを設定
    Content-Type: text/cssを明示的に設定し、ブラウザがCSSとして認識できるようにする。

chrome 拡張機能を使ってクリック一発で閲覧できるようにする

長い間「Chrome拡張」を自作したいと思っていたが、そもそも用途やアイデアが浮かばなかったし他人の作った拡張機能が優秀過ぎて「Hello world」で終わっていた。

今回のような自作HTTPサーバを呼び出すChrome拡張なんて存在しないだろうし基本が身につくので実装してみた。

 

ファイル構成はこんな感じ。

Hello_Extensions/
├── manifest.json
├── background.js
├── popup.html
└── icon.png

 

popup.html

background.js

manifest.json

icon.png

128×128画素のPNG画像。Hello world作った時のサンプルの再利用。

Chrome拡張インストール手順

  • 1. Chromeの「拡張機能」ページを開く
  • 2. 「デベロッパーモード」をオンにする
  • 3. 「パッケージ化されていない拡張機能を読み込む」をクリックし、Hello_Extensionsフォルダを選択する

これでChrome拡張が表示されるようになる。

そして閲覧できなかったサイトでボタンを押すと閲覧可能。

技術的な説明

拡張機能を実装する際、最初に理解しなければならないのが、拡張機能が持つ3種類のプログラムとその(実行)コンテキスト、および互いのやり取り(メッセージング)の方法。

  • background scripts
    拡張機能固有の実行コンテキストで動作するプログラムで、特定のタブに依存せず、各タブを横断した制御を行うことができる。

  • content scripts
    Webサイトの実行コンテキストで動作するプログラム。URLやタイミングは、manifest.jsonやbackground scriptsで制御

  • popup html
    拡張機能のアイコンを押した際にポップアップ表示されるWebコンテンツで、独立したコンテキストを持っている

今回は popup.html を使用されていないため、削除しても動作に影響はない。

おわりに

LLMを使うと簡単に作れちゃう。

そもそもコード自体は100行前後の簡単なものだけど、これを調査しながら作るとすると大変。

 

人間に必要なのはアイデア。

アイデアが続く限り何かを作り続けたいと思っているけれど、最近はやりたい事は実現できるようになりネタが出なくなった。

タイトルとURLをコピーしました