【问题标题】:HTTP POST and GET with cookies for authentication in python带有cookie的HTTP POST和GET在python中进行身份验证
【发布时间】:2020-02-04 23:16:59
【问题描述】:

我正在尝试创建一个使用我的 ID 和密码登录到我大学网站的 python 程序。这是正式的登录页面:https://webapp.pucrs.br/consulta/

您可能注意到,这两个字段名为 pr1 和 pr2。该页面使用 POST 发送数据。另外,加载页面时会下载一个 cookie,它是一个包含随机值的 JSESSIONID,据我所知,您必须返回 POST 方法的标头以验证登录。

我写了以下代码,但是GET方法的返回页面显示“会话未初始化”,可能是cookie没有正确发送回。

from urllib2 import Request, build_opener, HTTPCookieProcessor, HTTPHandler
import httplib, urllib, cookielib, Cookie, os

conn = httplib.HTTPConnection('webapp.pucrs.br')

#COOKIE FINDER
cj = cookielib.CookieJar()
opener = build_opener(HTTPCookieProcessor(cj),HTTPHandler())
req = Request('http://webapp.pucrs.br/consulta/principal.jsp')
f = opener.open(req)
html = f.read()
for cookie in cj:
    c = cookie
#FIM COOKIE FINDER

params = urllib.urlencode ({'pr1':111049631, 'pr2':<pass>})
headers = {"Content-type":"text/html",
           "Set-Cookie" : "JSESSIONID=70E78D6970373C07A81302C7CF800349"}
            # I couldn't set the value automaticaly here, the cookie object can't be converted to string, so I change this value on every session to the new cookie's value. Any solutions?

conn.request ("POST", "/consulta/servlet/consulta.aluno.ValidaAluno",params, headers) # Validation page
resp = conn.getresponse()

temp = conn.request("GET","/consulta/servlet/consulta.aluno.Publicacoes") # desired content page
resp = conn.getresponse()

print resp.read()

我应该把这个 cookie 放在哪里以便验证登录?

【问题讨论】:

    标签: python http authentication post cookies


    【解决方案1】:

    我会尝试使用requests 库。 documentation 非常好,代码最终比 urllib* 干净得多

    $ pip install requests
    

    使用自行处理 cookie 的 session(参见 Piotr 的评论),结果如下所示

    import requests
    url_0 = "http://webapp.pucrs.br/consulta/principal.jsp"
    url = "https://webapp.pucrs.br/consulta/servlet/consulta.aluno.ValidaAluno"
    data = {"pr1": "123456789", "pr2": "1234"}
    
    s = requests.session()
    s.get(url_0)
    r = s.post(url, data)
    

    它似乎工作正常,因为我收到 pr1 123456789 的“Usuario inexistente”通知和带有您的用户号的“Sehna inválida”。

    【讨论】:

    • 您可以使用会话自动处理cookies。来自docsSession 对象允许您跨请求保留某些参数。它还在 Session 实例发出的所有请求中保留 cookie。
    • @PiotrDobrogost 太好了,谢谢!而且代码看起来更好。
    【解决方案2】:

    您必须使用为所有请求创建的相同“开启程序”,它会自行处理所有 cookie。

    这是我最近写的东西的摘录

    opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cookielib.CookieJar()))
    
    # then for all requests
    
    if postData:     
        pData =  urllib.urlencode(postData)
    else:
        pData = None
    
    httpReq = urllib2.Request(url, pData, self._headers)
    page =  opener.open(httpReq)
    

    【讨论】:

      【解决方案3】:

      将 MatthieuW 的答案转换为 Python 3 给出。

      import urllib, http.cookiejar
      
      opener = urllib.request.build_opener(urllib.request.HTTPCookieProcessor(http.cookiejar.CookieJar()))
      # then for all requests
      
      if postData:     
          pData =  urllib.parse.urlencode(postData)
      else:
          pData = None
      
      httpReq = urllib.request.Request(url, pData)
      page =  opener.open(httpReq)
      

      【讨论】:

        【解决方案4】:

        urllib 不行,用 requests!

        from requests import Request, Session
        
        url = "https://webapp.pucrs.br/consulta/principal.jsp"
        s = requests.Session()
        
        p = dict(pb1 = 'dd', pb2 = 'cc')
        r = s.get(url, params = p) 
        # use the cert=/path/to/certificate.pem if you need it
        # elsewhere use verify = False to bypass ssl verification
        
        c = r.cookies
        
        # Then send back a response using those same cookies
        
        r = requests.get(other_url, cookies = c, verify = False)
        

        【讨论】:

          【解决方案5】:

          我建议您使用mechanize,它会自动为您处理会话/cookies/登录,此外它还提供了一个类似 urllib 的 API,例如表单填写,因此您不必弄乱正确的 POST 请求,因为它是由 mechanize 构造的。

          【讨论】:

          • 我安装了它,但它一直说没有安装名为 mechanize 的模块。有点奇怪,但我会继续努力。它也处理cookies?因为这是我唯一的问题。
          • 是的,它会处理 cookie!也许你为错误的 Python 版本安装了它。
          猜你喜欢
          • 1970-01-01
          • 2015-04-25
          • 2011-09-01
          • 1970-01-01
          • 2012-04-20
          • 2021-11-10
          • 2017-10-17
          • 1970-01-01
          • 2021-10-13
          相关资源
          最近更新 更多