我在 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 。下面是我测试的第二个代码:
#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 中使用的帐户的时间线。
是的,我知道这是正确的结果。我没有写任何关于处理 cookie 的内容。我的问题是关于这一点。我想知道:
- 如何实现和使用类似NSHTTPCookieStorage 的东西?
- 我可以用python写吗?
谢谢你。