私は研究のために PyObjC に最小限のブラウザーを実装しています。まず、pyobjc から webkit を使用する方法についてググって、次のようなコードを書きました。
#coding: utf-8
import Foundation
import WebKit
import AppKit
import objc
def main():
app = AppKit.NSApplication.sharedApplication()
rect = Foundation.NSMakeRect(100,350,600,800)
win = AppKit.NSWindow.alloc()
win.initWithContentRect_styleMask_backing_defer_(
rect,
AppKit.NSTitledWindowMask |
AppKit.NSClosableWindowMask |
AppKit.NSResizableWindowMask |
AppKit.NSMiniaturizableWindowMask,
AppKit.NSBackingStoreBuffered,
False)
win.display()
win.orderFrontRegardless()
webview = WebKit.WebView.alloc()
webview.initWithFrame_(rect)
pageurl = Foundation.NSURL.URLWithString_("http://twitter.com")
req = Foundation.NSURLRequest.requestWithURL_(pageurl)
webview.mainFrame().loadRequest_(req)
win.setContentView_(webview)
app.run()
if __name__ == '__main__':
main()
うまくいきました。しかし、このブラウザは Safari と Cookie を共有していることに気付きました。Safari.app から独立させたい。それで、もう一度グーグルで調べたところ、 NSMutableURLRequestを使用して cookie-handling-methods をオーバーライドできることがわかりました。以下は、私がテストした2番目のコードです。
#coding: utf-8
import Foundation
import WebKit
import AppKit
import objc
def main():
app = AppKit.NSApplication.sharedApplication()
rect = Foundation.NSMakeRect(100,350,600,800)
win = AppKit.NSWindow.alloc()
win.initWithContentRect_styleMask_backing_defer_(
rect,
AppKit.NSTitledWindowMask |
AppKit.NSClosableWindowMask |
AppKit.NSResizableWindowMask |
AppKit.NSMiniaturizableWindowMask,
AppKit.NSBackingStoreBuffered,
False)
win.display()
win.orderFrontRegardless()
webview = WebKit.WebView.alloc()
webview.initWithFrame_(rect)
pageurl = Foundation.NSURL.URLWithString_("http://twitter.com")
req = Foundation.NSMutableURLRequest.requestWithURL_(pageurl)
Foundation.NSMutableURLRequest.setHTTPShouldHandleCookies_(req, False)
webview.mainFrame().loadRequest_(req)
win.setContentView_(webview)
app.run()
if __name__ == '__main__':
main()
このコードは twitter のログイン画面を表示します :-) しかし、このブラウザでは twitter にログインできませんでした。アカウント名、パスワードを入力してエンターキーを押しました。すると、Safari.app でいつも使っているアカウントのタイムラインがブラウザに表示されます。
はい、私はそれが正しい結果であることを知っています。クッキーの取り扱いについては何も書いていません。そして私の質問はこの点についてです。私はそれを知りたい:
- NSHTTPCookieStorageのようなものを実装して使用するにはどうすればよいですか?
- pythonで書けますか?
ありがとうございました。