2012-04-20 31 views
7

Tôi đang cố gắng tạo chương trình python đăng nhập vào trang web của trường bằng cách sử dụng id và mật khẩu của tôi. Đây là trang chính thức để đăng nhập: https://webapp.pucrs.br/consulta/HTTP POST và GET với cookie để xác thực trong python

Như bạn có thể nhận thấy, hai trường được đặt tên là pr1 và pr2. Trang sử dụng POST để gửi dữ liệu. CSONG, có một cookie được tải xuống khi trang được tải, đó là một JSESSIONID có chứa một giá trị ngẫu nhiên, như tôi đã hiểu, bạn phải trả về tiêu đề của phương thức POST để xác thực đăng nhập.

Tôi đã viết mã sau đây, nhưng trang trả về trên phương thức GET cho biết "Phiên không được khởi tạo", có thể khiến cookie không được gửi lại đúng cách.

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

Tôi đặt cookie này ở đâu để thông tin đăng nhập được xác thực?

Trả lời

17

Tôi sẽ thử sử dụng thư viện requests. Các documentation là tuyệt vời, và mã kết thúc lên được sạch hơn nhiều so với urllib*

$ pip install requests 

Sử dụng một session (xem bình luận bởi Piotr) để xử lý các tập tin cookie trên riêng của mình, kết quả sẽ như thế này

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) 

Dường như hoạt động tốt, vì tôi nhận được thông báo "Usuario inexistente" cho pr1 123456789 và "Sehna inválida" với số người dùng của bạn.

+3

Bạn có thể sử dụng phiên để xử lý cookie tự động. Từ [docs] (http://docs.python-requests.org/en/latest/user/advanced/#session-objects): Đối tượng * Session cho phép bạn duy trì một số thông số nhất định trên các yêu cầu. Nó cũng tồn tại cookie trên tất cả các yêu cầu được thực hiện từ phiên Phiên. * –

+0

@PiotrDobrogost Thật tuyệt vời, cảm ơn bạn! Và mã trông thậm chí còn tốt hơn. – jorgeca

+0

Bây giờ, bạn có thể làm cho câu trả lời của bạn tốt hơn ... –

1

Tôi khuyên bạn nên sử dụng mechanize, nó sẽ tự động xử lý phiên/cookie/thông tin đăng nhập cho bạn, hơn nữa nó cung cấp API giống như urllib và ví dụ: điền vào biểu mẫu, vì vậy bạn không phải gây rối với yêu cầu POST phù hợp, vì nó được xây dựng bằng cách cơ giới hóa.

+0

Tôi đã cài đặt nhưng vẫn nói rằng không có mô-đun được cài đặt nào được gọi là cơ giới hóa. Loại kỳ lạ, nhưng tôi sẽ tiếp tục cố gắng. Nó cũng xử lý các cookie? Vì đó là vấn đề duy nhất của tôi. –

+0

Có, nó xử lý các tập tin cookie! Có thể bạn đã cài đặt nó cho phiên bản Python sai. – dav1d

7

Bạn phải sử dụng cùng một "trình mở" mà bạn đã tạo cho tất cả các yêu cầu của mình và nó sẽ tự xử lý tất cả các cookie.

đây là một trích cái gì đó tôi đã viết gần đây

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

Chuyển đổi trả lời MatthieuW để Python 3 cho.

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

urllib không tốt, yêu cầu sử dụng!

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) 
Các vấn đề liên quan