webkit2png で(HTTPがブロックされる)ATS をコントロールする方法

webkit2png とは、Webkitを使ってコマンドラインからスクリーンショットを取得するプログラムです。
つまり、コマンドラインで、(Webkitをレンダリングエンジンとして)Webページをレンダリングした結果を画像ファイルにします。



Homebrew でインストールできます。

$ brew update
$ brew search webkit2png
$ brew install webkit2png

一番シンプルなSyntaxは…
$webkit2png [URL]
なので…

とやると…

... done

問題なく、カレントディレクトリにディフォルト通りの3つのファイルが出来ます。(HTTPS)

ところが、普通の http:// なURLだと…

$ webkit2png http://bison.jp/

Fetching http://bison.jp/ ...
2016-05-06 19:30:26.899 Python[88221:5471219] App Transport Security has blocked a cleartext HTTP (http://) resource load since it is insecure. Temporary exceptions can be configured via your app's Info.plist file.
... something went wrong: The resource could not be loaded because the App Transport Security policy requires the use of a secure connection.

叱られます。

「HTTP はセキュアじゃないから、App Transport Security がブロックしたよ」
「そのアプリの Info.plist に例外設定を記述するヨロシ」
とか言われてもねぇ。

そもそも App Transport Security(ATS)って何さ…な情報は↓





曰く…
"App Transport Security (以降、ATS と呼びます) は iOS 9.0 または OS X 10.11 以上で有効な機能であり、アプリとウェブサービスとの間のセキュアな接続のために利用できます。
ATS が有効の場合、HTTP での通信はできません。また、Apple が推奨する必要条件を満たさない接続は強制的に接続失敗扱いになります。例えば、Apple 推奨の要件を満たさない Web ページを WKWebView で開こうとした場合、ページのロードは失敗します。"

…(・◇・)なるほど

"Info.plist にキーと値を追加することで ATS の基本動作の例外を設定したり、ATS をオフにしたりできます。"

…(・◇・)なるほど x 2

  • 画一的に、せっかくの ATSを無効にするのは非推奨
  • Allow but Deny も Deny but Allow も指定可能

ネットを掘っても「iOS 9 と El Capitan に特有な縛りで、細かい設定は、当該アプリの Info.plist でいぢりなさい」な情報しか見つからない。


英語面倒だけれど、GitHub を掘ってみた。





/usr/local/Cellar/webkit2png/0.7/bin/webkit2png
の実行ファイルをエディタで開いて、

# Hide the dock icon (needs to run before NSApplication.sharedApplication)
AppKit.NSBundle.mainBundle().infoDictionary()['LSBackgroundOnly'] = '1'

の下に…

# Handles ATS HTTPS requirement introduced in El Cap
if options.ignore_ssl_check:
AppKit.NSBundle.mainBundle().infoDictionary()['NSAppTransportSecurity'] = dict(NSAllowsArbitraryLoads = True)

を挿入して…
-------------------------------------
※ このとき、
# Handles ATS HTTPS requirement introduced in El Cap
if options.ignore_ssl_check:
AppKit.NSBundle.mainBundle().infoDictionary()['NSAppTransportSecurity'] = dict(NSAllowsArbitraryLoads = True)

のように AppKet.NSBundle.mainBundle()〜 の文頭にちゃんとインデント(この場合、半角スペース4つ)がないと、

IndentationError: expected an indented block



とか叱られるよー。
Python の インデントは飾りじゃないからねー。
-------------------------------------

--ignore-ssl-checkオプション付きで実行すればOK。

$ webkit2png --ignore-ssl-check http://example.com/

しかしコノ解決法だと、webkit2png が Update される度に、仕掛け直しなのよねきっと…orz。

その他参考


comments powered by Disqus