【问题标题】:How to make a POST with previous cookies with Python Requests library or PyCurl?如何使用 Python Requests 库或 PyCurl 使用以前的 cookie 进行 POST?
【发布时间】:2017-05-01 09:02:04
【问题描述】:

我正在尝试使用一些数据和之前使用 GET 收到的 cookie 进行 POST。 我有一个带有PyCurl 的代码可以正常工作,但我需要使用Requests。但是,尽管我正在执行相同的步骤,但 using Request 不起作用。 PyCurl 上的工作代码是:

import time
import urllib
import pycurl

curl = pycurl.Curl()
curl.setopt(pycurl.URL, 'https://www.myURL.com/header?time='+str(int(time.time())))
curl.setopt(pycurl.COOKIEJAR, 'cookie_1.txt')
curl.perform()
curl.close()

curl = pycurl.Curl()
curl.setopt(pycurl.URL, 'https://www.myURL.com/login')
post_data = {'actualURL': 'http://www.myURL.com', 'user': 'myemail@gmail.com', 'pass': 'asdfqwerty'}
curl.setopt(pycurl.COOKIEFILE, 'cookie_1.txt')
curl.setopt(pycurl.POSTFIELDS, urllib.urlencode(post_data))
curl.setopt(pycurl.COOKIEJAR, 'cookie_2.txt')
curl.perform()
curl.close()

我在“cookie_2.txt”文件中收到了正确答案,其中包含有关 cookie 的新数据。 但是,如前所述,以下代码给了我错误 403 的响应

import time
import urllib
import requests

r1 = requests.get('https://www.myURL.com/header?time='+str(int(time.time())))
payload = {'actualURL': 'http://www.myURL.com', 'user': 'myemail@gmail.com', 'pass': 'asdfqwerty'}
r2 = requests.post('https://www.myURL.com/login', data=urllib.urlencode(payload), cookies=r1.cookies)

如您所见,我使用从之前的请求中收到的相同 cookie,如提到的 here。我检查了“r1.cookies”并且设置正确。 此外,由于 POST 数据有特殊字符,我使用了来自 urllib 的编码(没有这个 PyCurl 不起作用)。

我首先认为“Requests”上的问题来自 POST 数据上的特殊字符,但我尝试过编码,没有编码,作为 json 字符串,......但没有任何效果。 'r2.cookies' 为空

【问题讨论】:

    标签: python cookies python-requests httprequest


    【解决方案1】:

    如果你需要处理cookies,我推荐requests.Session(),例如:

    ses = requests.Session()  # use this object for all get / post requests #
    
    payload = {'actualURL': 'http://www.myURL.com', 'user': 'myemail@gmail.com', 'pass': 'asdfqwerty'}
    r1 = ses.get('https://www.myURL.com/header?time='+str(int(time.time())))
    r2 = ses.post('https://www.myURL.com/login', data=payload)
    
    print(ses.cookies.get_dict()) 
    

    您可以在这里找到更多信息:http://docs.python-requests.org/en/master/user/advanced/

    【讨论】:

    • cookies 仍然是空的。我尝试了不同的 POST 数据选项,但它不起作用。仅供参考,首先有必要进行 GET 以提取 JSESSION 并使用该 cookie 进行 POST,因此您的答案顺序会颠倒。
    • 通常您需要先发送您的凭据以进行身份​​验证,然后再继续,这就是我将 POST 放在首位的原因。我的代码只是一个示例,我不知道实际的网站如何处理身份验证和 cookie,但我猜它可能是另一个丢失的 HTTP 标头(用户代理、引用者等)。您需要检查网络流量并查看使用 Web 浏览器或 pycurl 成功获取 cookie 时发送的标头
    • 无论如何,我更新了代码以匹配您发送请求的顺序,再试一次。如果它仍然打印空 dict ,请尝试在 headers 中使用 'User-Agent',并确保您的凭据正确。除非我有实际的网址,否则我不能再帮你了。
    • 感谢您更新代码,因为它让我意识到我正在寻找 r2.cookies 而不是 ses.cookies。我已经检查过了,是的,它可以在没有 urlencode 的情况下工作,就像您在示例中所写的那样。谢谢!
    猜你喜欢
    • 2017-12-25
    • 1970-01-01
    • 2019-10-02
    • 2012-07-27
    • 1970-01-01
    • 1970-01-01
    • 2014-11-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多