Python 如何在PyObjC中自行处理cookies
为了我的研究,我正在PyObjC中实现一个最小的浏览器。 首先,我在谷歌上搜索了使用pyobjc的webkit的方法,并编写了如下代码:Python 如何在PyObjC中自行处理cookies,python,webkit,pyobjc,Python,Webkit,Pyobjc,为了我的研究,我正在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,60
#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处理方法。
下面是我测试的第二个代码:
#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中始终使用的帐户的时间线
是的,我知道这是正确的结果。
我没有写任何关于处理饼干的事。
我的问题是关于这一点。
我想知道:
谢谢。从简单的部分开始:如果在Objective-C中可以做到这一点,那么在PyObjC中也应该可以做到 也就是说,我不清楚这是否可能。虽然您可能可以通过webkit委托执行某些操作,但似乎表明并非如此 另一种选择是使用NSURLProtocol,注册一个自定义的NSURLProtocol类来处理http/https请求,并使用Python的urllib或urllib2实现该类。演示了如何执行此操作(该示例为pydoc://url注册了一个子类) 更新了一个实现提示: 另一种方法可能是通过NSHTTPCookieStorage(NSHTTPCookieStorage.sharedHTTPCookieStorage.setCookieAcceptPolicy(NSHTTPCookieAcceptPolicyNever))禁用cookie存储。然后使用webkit资源加载委托自己处理cookie:
- 维护您自己的cookie存储(可能使用urllib2中的类)
- 在webView中:resource:willSendRequest:redirectResponse:fromDataSource:根据存储中的信息添加cookie头
- 在webView中:resource:didReceiveResponse:fromDataSource:检查“set cookie”标题并更新您自己的cookie存储
做到这一点应该不会太难,我希望将此功能作为PyObjC网站上的示例(甚至作为PyObjC的WebKit绑定中的实用程序类)。首先,感谢您的回答。我知道有些浏览器是用Obj-C/Cocoa实现的,它们有自己的cookie。昨天,我发现了一篇博客文章,其中他解释了如何实现cookie管理,这与Safari.app不同。但我在pyobjc里找不到怎么做。我必须学习更多关于Cocoa和PyObjC的基础知识。你能给我发一篇关于这篇博客文章的参考资料吗?我也许能帮你(我是PyObjC的作者)解释一下如何处理cookie。它表示
-(NSURLRequest*)webView:(webView*)发送方资源:(id)标识符willSendRequest:(NSURLRequest*)请求重定向响应:(NSURLResponse*)来自数据源的重定向响应:(WebDataSource*)数据源
和-(void)webView:(webView*)发送方资源:(id)标识符didReceiverResponse:(nsurResponse*)来自数据源的响应:(WebDataSource*)数据源代码>是关键。我看不懂那篇文章,但它可能是在转移视线。这可能与我之前链接到的StackOverlow问题是一样的:你可以通过你提到的方法来实现这一点,但这将是一项艰巨的工作。我同意你的看法。这对我的技能来说可能太难了。我会把它作为一个长期的家庭作业。谢谢!