pass session cookies in http header with python urllib2?
Question: I'm trying to write a simple script to log into Wikipedia and perform some
actions on my user page, using the Mediawiki api. However, I never seem to get
past the first login request (from this page:
<https://secure.wikimedia.org/wikipedia/en/wiki/Wikipedia:Creating_a_bot#Logging_in>).
I don't think the session cookie that I set is being sent. This is my code so
far:

    
    
    import Cookie, urllib, urllib2, xml.etree.ElementTree
    
    url = 'https://secure.wikimedia.org/wikipedia/en/w/api.php?action=login&format=xml'
    username = 'user'
    password = 'password'
    
    user_data = [('lgname', username), ('lgpassword', password)]
    
    #Login step 1
    #Make the POST request
    request = urllib2.Request(url)
    data = urllib.urlencode(user_data)
    login_raw_data1 = urllib2.urlopen(request, data).read()
    
    #Parse the XML for the login information
    login_data1 = xml.etree.ElementTree.fromstring(login_raw_data1)
    login_tag = login_data1.find('login')
    token = login_tag.attrib['token']
    cookieprefix = login_tag.attrib['cookieprefix']
    sessionid = login_tag.attrib['sessionid']
    
    #Set the cookies
    cookie = Cookie.SimpleCookie()
    cookie[cookieprefix + '_session'] = sessionid
    
    #Login step 2
    request = urllib2.Request(url)
    session_cookie_header = cookieprefix+'_session='+sessionid+'; path=/; domain=.wikipedia.org; HttpOnly'
    
    request.add_header('Set-Cookie', session_cookie_header)
    user_data.append(('lgtoken', token))
    data = urllib.urlencode(user_data)
    
    login_raw_data2 = urllib2.urlopen(request, data).read()
    

I think the problem is somewhere in the `request.add_header('Set-Cookie',
session_cookie_header)` line, but I don't know for sure. How do I use these
python libraries to send cookies in the header with every request (which is
necessary for a lot of API functions).


Answer: The latest version of [`requests`](http://docs.python-
requests.org/en/latest/index.html) has support for
[sessions](http://docs.python-requests.org/en/latest/user/advanced/#session-
objects) (as well as being really simple to use and generally great):

    
    
    with requests.session() as s: 
        s.post(url, data=user_data)
        r = s.get(url_2)
    

