与urllib2和PyWebKitGtk的Cookies

时间:2011-10-20 21:43:20

标签: python webkit gtk urllib2

我想让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

2 个答案:

答案 0 :(得分:0)

注意,这是一些伪的,但代码可能会工作到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吗? 你知道,不是那些“记住我”的饼干吗?

尝试在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数据的实际条款中是什么? 拥有“之前”数据和“之后”数据总是很好..这样你就会知道它为什么没有存储/加载。

答案 1 :(得分:0)

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

的回答