Вопрос по authentication, post, http, cookies, python – HTTP POST и GET с куки для аутентификации в python

12

Я пытаюсь создать программу на Python, которая регистрируется на сайте моего университета с использованием моего идентификатора и пароля. Это официальная страница для входа в систему:https://webapp.pucrs.br/consulta/

Как вы можете заметить, эти два поля называются pr1 и pr2. Страница использует POST для отправки данных. ТАКЖЕ, есть cookie, который загружается при загрузке страницы, это JSESSIONID, содержащий случайное значение, которое, как я понял, вы должны вернуть в заголовке метода POST для аутентификации входа в систему.

Я написал следующий код, но на странице возврата метода GET написано «Сеанс не был инициализирован», возможно, из-за того, что файл cookie не был отправлен должным образом.

<code>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()
</code>

Куда я помещаю этот куки, чтобы авторизоваться?

Ваш Ответ

5   ответов
5

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)
7

ваших запросов, и он будет обрабатывать файлы 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)
1

механизироватьон автоматически обрабатывает сессии / файлы cookie / логины для вас, кроме того, он предоставляет API, подобный urllib, и, например, заполнение формы, так что вам не нужно связываться с правильным POST-запросом, поскольку он создается с помощью механизации.

Да, это обращается с печеньем! Может быть, вы установили его для неправильной версии Python.
Я установил его, но он постоянно говорит, что не установлен модуль, называемый mechanize. Довольно странно, но я буду продолжать пытаться. Это также обращается с печеньем? Потому что это моя единственная проблема. Lucas C. Feijo
20

Я бы попробовал использоватьrequests библиотека.документация отлично, и код оказывается намного чище, чем сurllib*

$ pip install requests

Используясессия (см. комментарий Петра), который обрабатывает куки самостоятельно, результат выглядит следующим образом

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 и "Sehna inv" # lida " с вашим номером пользователя.

Вы можете использовать сеанс для автоматической обработки файлов cookie. Отdocs:Session object allows you to persist certain parameters across requests. It also persists cookies across all requests made from the Session instance.
Это сработало! Благодарю вас! Lucas C. Feijo
@PiotrDobrogost Это круто, спасибо! И код выглядит еще лучше.
Теперь вы можете сделать свой ответ еще лучше ...
1

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)

Похожие вопросы