2012-04-20 14 views
7

में प्रमाणीकरण के लिए कुकीज़ के साथ प्राप्त करें मैं एक पाइथन प्रोग्राम बनाने की कोशिश कर रहा हूं जो मेरी आईडी और पासवर्ड का उपयोग कर मेरे विश्वविद्यालय की साइट पर लॉग इन करता है। लॉग इन करने के लिए यह औपचारिक पृष्ठ है: https://webapp.pucrs.br/consulta/HTTP पोस्ट और पाइथन

जैसा कि आप देख सकते हैं, दोनों फ़ील्ड pr1 और pr2 नामित हैं। पृष्ठ डेटा भेजने के लिए POST का उपयोग करता है। साथ ही, एक कुकी है जो पेज लोड होने पर डाउनलोड की जाती है, यह एक JSESSIONID है जिसमें यादृच्छिक मान होता है, जैसा कि मैंने समझा, आपको लॉगिन प्रमाणित करने के लिए POST विधि के शीर्षलेख पर वापस जाना होगा।

मैंने निम्नलिखित कोड लिखा है, लेकिन जीईटी विधि पर रिटर्न पेज कहता है, "सत्र प्रारंभ नहीं हुआ था", शायद कारण कुकी को ठीक से वापस नहीं भेजा गया था।

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

मैं इस कुकी को कहां रखूं ताकि लॉगिन प्रमाणित हो?

उत्तर

17

मैं requests लाइब्रेरी का उपयोग करने का प्रयास करूंगा। documentation उत्कृष्ट है, और कोड urllib*

$ pip install requests 

का उपयोग के साथ की तुलना में अधिक स्वच्छ किया जा रहा समाप्त होता है एक session (पायोत्र द्वारा टिप्पणी देखें) कि अपने दम पर कुकीज़ संभालती है, परिणाम यह

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 और "सहना inválida" के लिए आपके उपयोगकर्ता-नंबर के साथ "Usuario inexistente" नोटिस मिलता है।

+3

आप कुकीज को स्वचालित रूप से संभालने के लिए सत्र का उपयोग कर सकते हैं। [डॉक्स] से (http://docs.python-requests.org/en/latest/user/advanced/#session-objects): * सत्र ऑब्जेक्ट आपको अनुरोधों के कुछ पैरामीटर जारी रखने की अनुमति देता है। यह सत्र उदाहरण से किए गए सभी अनुरोधों में कुकीज़ भी जारी रखता है। * –

+0

@PiotrDobrogost यह अच्छा है, धन्यवाद! और कोड भी बेहतर दिखता है। – jorgeca

+0

अब, आप अपना उत्तर भी बेहतर बना सकते हैं ... –

1

मैं आपको mechanize का उपयोग करने की सलाह देता हूं, यह स्वचालित रूप से आपके लिए सत्र/कुकीज़/लॉगिन को संभालता है, इसके अलावा यह एक urllib- जैसी API प्रदान करता है और उदा। फॉर्म भरना, इसलिए आपको सही पोस्ट-अनुरोध के साथ गड़बड़ नहीं करना है, क्योंकि यह मशीनीकरण द्वारा निर्मित होता है।

+0

मैंने इसे स्थापित किया लेकिन यह कहता रहता है कि मशीनीकरण नामक कोई स्थापित मॉड्यूल नहीं है। अजीब तरह का, लेकिन मैं कोशिश करूँगा। यह कुकीज़ को भी संभालता है? क्योंकि यह मेरी एकमात्र समस्या है। –

+0

हां यह कुकीज़ को संभालता है! शायद आपने इसे गलत पायथन संस्करण के लिए स्थापित किया है। – dav1d

7

आपको अपने सभी अनुरोधों के लिए बनाए गए "ओपनर" का उपयोग करना होगा, और यह कुकीज़ को स्वयं ही संभाल लेगा।

यहाँ कुछ के एक उद्धरण मैं हाल ही में

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

लिखा अजगर 3 देता है MatthieuW के जवाब परिवर्तित है।

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 कोई अच्छा नहीं है, अनुरोधों का उपयोग करें!

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) 
संबंधित मुद्दे