Печенье с urllib2 и PyWebKitGtk - PullRequest
       13

Печенье с urllib2 и PyWebKitGtk

5 голосов
/ 21 октября 2011

Я пытаюсь заставить urllib2 работать с PyWebKitGtk для поддержки файлов cookie. Я думаю, что это в основном работает, но куки не работают между сессиями. Файл cookies.txt сохраняется и выглядит так, как будто он использует куки в запросах (проверено в Wireshark), но данные, которые я вижу, загруженные в окно браузера, похоже, не используют куки. После того, как я войду в систему, закройте приложение, затем перезапустите его, мой сеанс входа в систему пропал.

Мой код

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 голосов
/ 10 января 2012

Я попробовал подобный подход сам и не смог заставить его работать. Я не уверен насчет LWPCookieJar, но вы можете получить постоянную поддержку файлов cookie с помощью pywebkitgtk «нативно» - посмотрите мой ответ на python webkit webview помнить куки?

0 голосов
/ 26 октября 2011

Обратите внимание, это то, что псевдо, но код, вероятно, будет работать до 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?Всегда приятно иметь данные «до» и «после» ... таким образом, вы будете знать, почему они не сохраняются / не загружаются.

...