sakura

サンプルとなりそうなソースコードはこちらにある。 https://bitbucket.org/suma/squadron

モチベーション

艦隊これくしょんというブラウザ用のゲームが存在する。このゲームのパケットをキャプチャ・解析したいがために、ブラウザに対して自作のHTTPプロキシ通したいと思った(もちろん、不正なゲームのプレイはだめ、絶対)。しかし、OS XにおいてはHTTPプロキシの設定はグローバルな設定であり、アプリ単体でプロキシを指定することはできない。Xcode + CocoaによるWebkitフレームワークを使った自作ウェブアプリでも同様である。

そこで、Webkitを搭載しているQtで自分専用ブラウザを作ってしまえばOS Xシステム全体のプロキシを変更の必要がなく、都合がよいと考えた。

PyQt

PyQtというQtのPythonバインディングが存在する。Qtはご存じの方も多いだろうが、C++言語を使ったクロスプラットフォームのミドルウェアのことであり、UI開発のツールキットである。 近年はQtQuickと呼ばれるUI記述のためのフレームワークも存在するが、とにかく私はC++以外でGUIを書いてみたかった。 Go言語でも良かったが、Qtに対応していて安定して動きそうなのがPyQtなのであった。

PyQt5のOS Xへのインストールは以下の記事が詳しい。

[PyQt5 on Mac OSX A ruminative Unix guru](http://cookgetsitdone.wordpress.com/2014/03/27/pyqt5-on-mac-osx/)

夏草や兵どもが夢の跡

QtWebkit関連

Flashなどはプラグインを有効にする必要がある。

# Enable plugin/javascript/storage
webSetting = QtWebKit.QWebSettings.globalSettings()
webSetting.setAttribute(QtWebKit.QWebSettings.PluginsEnabled, True)
webSetting.setAttribute(QtWebKit.QWebSettings.DnsPrefetchEnabled, True)
webSetting.setAttribute(QtWebKit.QWebSettings.JavascriptEnabled, True)
webSetting.setAttribute(QtWebKit.QWebSettings.OfflineStorageDatabaseEnabled, True)
webSetting.setAttribute(QtWebKit.QWebSettings.LocalStorageEnabled, True)

Python ライブラリ

  • OSなどが提供するパスワードマネージャでパスワードを保存するために。
  • OS依存でかつユーザ固有の設定ファイルを保存するためのディレクトリの取得に。

PyQt 系ツール

  • pyuic5
    • QtのUIファイルからPythonのソースコードを生成する。C++でも似たようなことをやっていたが、PythonでもQtの伝統儀式をなぞる。
  • pyrcc5
    • Qtのリソースファイルを生成する。

どちらもPythonソースコードを生成し、Pythonスクリプトからはimportして利用する形態を取る。

配布/py2app

py2appというツールを使えば良いらしいが、私の場合は作成したアプリケーション(.app)の実行に失敗してしまった。豆知識、ご存じかもしれないがDropboxのアプリケーションはPython製であり、この手のツールを使っていると想像できる。

感想

PyQt はさくっと書ける。安定面は少し不安が残る。

ブラウザが動作するのに満足してしまい、結局HTTPプロキシの開発には着手していない。goproxyを使うのが筋が良さそうな感触ではある。

Big Sky :: プログラマブルなプロキシライブラリ goproxy