Python form POST using urllib2 (also question on saving/using cookies)

前端 未结 3 1653
无人及你
无人及你 2020-12-07 17:51

I am trying to write a function to post form data and save returned cookie info in a file so that the next time the page is visited, the cookie information is sent to the se

相关标签:
3条回答
  • 2020-12-07 18:30

    Please using ignore_discard and ignore_expires while save cookie, in mine case it saved OK.

    self.cj.save(cookie_file, ignore_discard=True, ignore_expires=True)
    
    0 讨论(0)
  • 2020-12-07 18:38

    If you are having a hard time making your POST requests to work (like I had with a login form), it definitely pays to quickly install the Live HTTP headers extension to Firefox (http://livehttpheaders.mozdev.org/index.html). This small extension can, among other things, show you the exact POST data that are sent when you manually log in.

    In my case, I had banged my head against the wall for hours because the site insisted on an extra field with 'action=login' (doh!).

    0 讨论(0)
  • 2020-12-07 18:45

    There are quite a few problems with the code that you've posted. Typically you'll want to build a custom opener which can handle redirects, https, etc. otherwise you'll run into trouble. As far as the cookies themselves so, you need to call the load and save methods on your cookiejar, and use one of subclasses, such as MozillaCookieJar or LWPCookieJar.

    Here's a class I wrote to login to Facebook, back when I was playing silly web games. I just modified it to use a file based cookiejar, rather than an in-memory one.

    import cookielib
    import os
    import urllib
    import urllib2
    
    # set these to whatever your fb account is
    fb_username = "your@facebook.login"
    fb_password = "secretpassword"
    
    cookie_filename = "facebook.cookies"
    
    class WebGamePlayer(object):
    
        def __init__(self, login, password):
            """ Start up... """
            self.login = login
            self.password = password
    
            self.cj = cookielib.MozillaCookieJar(cookie_filename)
            if os.access(cookie_filename, os.F_OK):
                self.cj.load()
            self.opener = urllib2.build_opener(
                urllib2.HTTPRedirectHandler(),
                urllib2.HTTPHandler(debuglevel=0),
                urllib2.HTTPSHandler(debuglevel=0),
                urllib2.HTTPCookieProcessor(self.cj)
            )
            self.opener.addheaders = [
                ('User-agent', ('Mozilla/4.0 (compatible; MSIE 6.0; '
                               'Windows NT 5.2; .NET CLR 1.1.4322)'))
            ]
    
            # need this twice - once to set cookies, once to log in...
            self.loginToFacebook()
            self.loginToFacebook()
    
            self.cj.save()
    
        def loginToFacebook(self):
            """
            Handle login. This should populate our cookie jar.
            """
            login_data = urllib.urlencode({
                'email' : self.login,
                'pass' : self.password,
            })
            response = self.opener.open("https://login.facebook.com/login.php", login_data)
            return ''.join(response.readlines())
    
    test = WebGamePlayer(fb_username, fb_password)
    

    After you've set your username and password, you should see a file, facebook.cookies, with your cookies in it. In practice you'll probably want to modify it to check whether you have an active cookie and use that, then log in again if access is denied.

    0 讨论(0)
提交回复
热议问题