Python 如何在PyObjC中自行处理cookies

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

为了我的研究,我正在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共享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中始终使用的帐户的时间线

是的,我知道这是正确的结果。 我没有写任何关于处理饼干的事。 我的问题是关于这一点。 我想知道:

  • 如何实现和使用类似于NSHTTPookieStorage的功能
  • 我能用python写吗

  • 谢谢。

    从简单的部分开始:如果在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问题是一样的:你可以通过你提到的方法来实现这一点,但这将是一项艰巨的工作。我同意你的看法。这对我的技能来说可能太难了。我会把它作为一个长期的家庭作业。谢谢!