我在PyObjC中实现了一个最小的浏览器。 首先,我在google上搜索了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共享cookies。我希望它独立于我的Safari.app. 因此,我再次上网,发现可以使用NSMutableURLRequest覆盖cookie处理方法。 第二个代码测试如下:
^{pr2}$这段代码显示了twitter的登录屏幕:-) 但是我不能用这个浏览器登录twitter。 我输入帐户名,密码,然后按回车键。然后浏览器会显示我经常使用的帐户的时间线Safari.app. 在
是的,我知道这是正确的结果。 我没有写任何关于处理饼干的东西。 我的问题就在这一点上。 我想知道:
谢谢。在
从最简单的部分开始:如果在Objective-C中可以做到这一点,那么PyObjC也应该是可能的。在
也就是说,我不清楚这是否可能。How can I have multiple instances of webkit without sharing cookies?似乎表明它不是,尽管您可以通过webkit委托执行某些操作。在
另一种选择是使用NSURLProtocol,注册一个自定义的NSURLProtocol类来处理http/https请求,并使用Python的urllib或urllib2实现它。PyDocURL example演示了如何做到这一点(该示例为pydoc://url注册了一个子类)。在
More information on NSURLConnection is on Apple's website.
更新了实施提示:
另一种方法可能是通过NSHTTPCookieStorage禁用cookie storaga(NSHTTPCookieStorage.sharedHTTPCookieStorage.setCookieAcceptPolicy_U(NSHTTPCookieAcceptPolicyNever))。然后使用webkit资源加载委托自行处理cookies:
维护自己的cookie存储(可能使用urllib2中的类)
在webView:资源:威尔斯ndRequest:重定向响应:fromDataSource:根据该存储中的信息添加cookie头
在webView:资源:迪德塞夫响应:来自数据源:检查“set cookie”头并更新您自己的cookie存储。
要做到这一点不难,我希望将此功能作为PyObjC网站上的示例(或者甚至作为PyObjC的WebKit绑定中的一个实用程序类)。在
相关问题 更多 >
编程相关推荐