PyQt5で自分専用ブラウザをさくっと作ってみよう
サンプルとなりそうなソースコードはこちらにある。 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)
- QtWebkitのクッキーの保存にはQNetworkCookieJarを用いる python - print cookies from QNetworkCookie, PyQt4 - Stack Overflow
- プロキシの設定も簡単: qt4 - How do I manage proxies with QT QWebView - Stack Overflow
- exampleのformextractorは必見。 フォームの内容をプログラム側から取得する。
- 第6回 Qt WebKit~WebコンテンツとQtの連携:Qt最新事情-QtでWebKitを使ってみよう|gihyo.jp … 技術評論社
- http://gihyo.jp/dev/feature/01/qt/0006
- パスワード保存・jQueryで既存の艦これブラウザのソースコードが参考になった。 さりげなくnode-webkitを使っていることに敬意を表したい。
Python ライブラリ
PyQt 系ツール
- pyuic5
- QtのUIファイルからPythonのソースコードを生成する。C++でも似たようなことをやっていたが、PythonでもQtの伝統儀式をなぞる。
- pyrcc5
- Qtのリソースファイルを生成する。
どちらもPythonソースコードを生成し、Pythonスクリプトからはimportして利用する形態を取る。
配布/py2app
py2appというツールを使えば良いらしいが、私の場合は作成したアプリケーション(.app)の実行に失敗してしまった。豆知識、ご存じかもしれないがDropboxのアプリケーションはPython製であり、この手のツールを使っていると想像できる。
- Aral Balkan: Historical Archive — How to make standalone OS X application bundles from PyQt apps using py2app
- Making Standalone Application for Mac OS X from PyQt app using py2app
感想
PyQt はさくっと書ける。安定面は少し不安が残る。
ブラウザが動作するのに満足してしまい、結局HTTPプロキシの開発には着手していない。goproxyを使うのが筋が良さそうな感触ではある。