如何在PyObjC中自动处理cookies

2024-04-25 16:06:42 发布

您现在位置:Python中文网/ 问答频道 /正文

我在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. 在

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

  1. 如何实现和使用NSHTTPCookieStorage?在
  2. 我能用python写吗?在

谢谢。在


Tags: 方法代码rectimportappmain浏览器twitter
1条回答
网友
1楼 · 发布于 2024-04-25 16:06:42

从最简单的部分开始:如果在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绑定中的一个实用程序类)。在

相关问题 更多 >