【问题标题】:Cookies with urllib2 and PyWebKitGtk带有 urllib2 和 PyWebKitGtk 的 Cookie
【发布时间】:2011-10-20 21:43:19
【问题描述】:

我正在尝试让 urllib2 与 PyWebKitGtk 一起支持 cookie。我认为它大部分都在工作,但 cookie 在会话之间不起作用。 cookies.txt 文件已保存,它看起来确实在请求中使用了 cookie(在 Wireshark 中检查),但我看到加载到浏览器窗口中的数据似乎并未使用 cookie。登录后,关闭应用程序,然后重新启动,我的登录会话就消失了。

我的代码

def load_uri_in_browser(self):
    self.cookiejar = LWPCookieJar(config_dir + "/cookies.txt")
    if os.path.isfile(self.cookiejar.filename):
        self.cookiejar.load(ignore_discard=True)

    #for testing, this does print cookies    
    for index, cookie in enumerate(self.cookiejar):
        print index, '  :  ', cookie        

    self.opener = urllib2.build_opener(
        urllib2.HTTPRedirectHandler(),
        urllib2.HTTPHandler(debuglevel=0),
        urllib2.HTTPSHandler(debuglevel=0),
        urllib2.HTTPCookieProcessor(self.cookiejar))
    self.opener.addheaders = [('User-Agent', 'Mozilla/5.0 (Windows; U; Windows NT 6.1; en-GB; rv:1.9.2.13) Gecko/20101203 Firefox/3.6.13')]

    self.view = webkit.WebView()        
    self.view.connect('navigation-policy-decision-requested', self.navigation_policy_decision_requested_cb)

    self.mainFrame = self.view.get_main_frame()
    self.mainFrame.load_uri("http://twitter.com")

    #gtk window loaded earlier
    self.window.add(self.view)
    self.window.show_all() 

    self.window.show()

def navigation_policy_decision_requested_cb(self, view, frame, net_req, nav_act, pol_dec):
    uri=net_req.get_uri()
    if uri.startswith('about:'):
        return False

    page = self.opener.open(uri)
    self.cookiejar.save(ignore_discard=True)
    view.load_string(page.read(),None,None,page.geturl())
    pol_dec.ignore()
    return True

【问题讨论】:

    标签: python webkit gtk urllib2


    【解决方案1】:

    我自己尝试了类似的方法,但无法正常工作。我不确定 LWPCookieJar,但您可以通过 pywebkitgtk “本地”获得持久 cookie 支持 - 查看我对 python webkit webview remember cookies?的回答

    【讨论】:

    • @AndrewR 你有机会试试这个吗?我已经使用 ctypes 和 libsoup 成功地工作了 cookie。如果你真的需要使用 Python cookiejar,我也想出了一个让两者交互的方式。
    • 谢谢!你在另一个问题上给出的答案正是我所需要的。 :)
    【解决方案2】:

    注意,这是一些伪代码,但代码可能会在 99% 的范围内工作 :) 我会尝试使用尽可能简单的代码:
    (我不确定 cj.save(...) 是否会在会话之间丢弃 cookie,所以我大部分时间都使用 pickle,而对于其他事情,我需要在会话之间“按原样”存储)

    import cookielib, urllib2, os, pickle
    
    if os.path.isFile('./cookies.txt'):
        cj = pickle.load(open('./cookies.txt', 'rb'))
    else:
        cj = cookielib.CookieJar()
    
    opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj))
    r = opener.open("http://example.com/")
    
    pickle.dump(cj, open("./cookies.txt", "wb"))
    

    其次,您确定您获得的 cookie 不仅仅是一个会话 cookie,它应该在一段时间后或您关闭连接时结束? 你知道,不是那些“记住我”的 cookie 之一吗?

    尝试在 Python 中设置您自己的“网络服务器”:

    import socket
    socket.bind(('', 80))
    socket.listen(5)
    ns, na = socket.accept()
    ns.recv(8192)
    ns.send("""\
    HTTP/1.1 200 OK\r\n
    Date: Wed, 26 Oct 2011 08:37:34 CET\r\n
    Server: Apache/1.3.3.7 (Unix) (Red-Hat/Linux)\r\n
    Last-Modified: Wed, 26 Oct 2011 08:37:34 CET\r\n
    Accept-Ranges: bytes\r\n
    Content-Length: 5\r\n
    Connection: close\r\n
    Set-Cookie: moo=wtf; path=/\r\n
    Content-Type: text/html; charset=UTF-8\r\n
    \r\n
    Hello""")
    
    ns.close()
    
    ns, na = socket.accept()
    ns.recv(8192)
    ns.close()
    

    以 HTTP 数据的实际形式查看您的输出? 拥有“之前”数据和“之后”数据总是很好的。这样你就会知道为什么它没有被存储/加载。

    【讨论】:

    • 我的想法搞砸了,无法让它发挥作用。我认为问题在于,当我尝试加载的任何站点的首页都将 cookie 传递给它时,内部 webkit 没有这些 cookie 的记录,因此任何其他文件或重定向或页面刷新都不会再次加载这些 cookie .我认为我的 navigation_policy_decision 事件应该已经处理了,但它显然没有捕获所有请求。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-29
    • 2010-11-29
    • 2012-12-07
    • 2012-02-20
    • 2013-05-12
    相关资源
    最近更新 更多