NJUHOBBY
NJUHOBBY

Reputation: 850

Python post requests and read cookies in the response

I am writing a python program which will send a post request with a password, if the password is correct, the server will return a special cookie "BDCLND".

I did this in Postman first. You can see the url, headers, the password I used and the response cookies in the snapshots below.

enter image description here

enter image description here

The response cookie didn't have the "BDCLND" cookie because the password 'ssss' was wrong. However, the server did send a 'BAIDUID' cookie back, now, if I sent another post request with the 'BAIDUID' cookie and the correct password 'v0vb', the "BDCLND" cookie would show up in the response. Like this: enter image description here

Then I wrote the python program like this:

import requests
import string
import re
import sys

def main():
    url = "https://pan.baidu.com/share/verify?surl=pK753kf&t=1508812575130&bdstoken=null&channel=chunlei&clienttype=0&web=1&app_id=250528&logid=MTUwODgxMjU3NTEzMTAuMzM2MTI4Njk5ODczMDUxNw=="
    headers = {
        "Content-Type":"application/x-www-form-urlencoded; charset=UTF-8",
        "Referer":"https://pan.baidu.com/share/init?surl=pK753kf"    
    }
    password={'pwd': 'v0vb'}
    response = requests.post(url=url, data=password, headers=headers)
    cookieJar = response.cookies
    for cookie in cookieJar:
        print(cookie.name)

    response = requests.post(url=url, data=password, headers=headers, cookies=cookieJar)
    cookieJar = response.cookies
    for cookie in cookieJar:
        print(cookie.name)
main()

When I run this, the first forloop did print up "BAIDUID", so that part is good, However, the second forloop printed nothing, it turned out the second cookiejar was just empty. I am not sure what I did wrong here. Please help.

Upvotes: 3

Views: 15487

Answers (1)

t.m.adam
t.m.adam

Reputation: 15376

Your second response has no cookies because you set the request cookies manually in the cookies parameter, so the server won't send a 'Set-Cookie' header.

Passing cookies across requests with the cookies parameter is not a good idea, use a Session object instead.

import requests

def main():
    ses = requests.Session()
    ses.headers['User-Agent'] = 'Mozilla/5'
    url = "https://pan.baidu.com/share/verify?surl=pK753kf&t=1508812575130&bdstoken=null&channel=chunlei&clienttype=0&web=1&app_id=250528&logid=MTUwODgxMjU3NTEzMTAuMzM2MTI4Njk5ODczMDUxNw=="
    ref = "https://pan.baidu.com/share/init?surl=pK753kf"
    headers = {"Referer":ref}
    password={'pwd': 'v0vb'}

    response = ses.get(ref)
    cookieJar = ses.cookies
    for cookie in cookieJar:
        print(cookie.name)

    response = ses.post(url, data=password, headers=headers)
    cookieJar = ses.cookies
    for cookie in cookieJar:
        print(cookie.name)

main()

Upvotes: 4

Related Questions