2011-08-23 10 views
7

मैं विकिपीडिया में प्रवेश करके मेरे उपयोगकर्ता पृष्ठ पर कुछ कार्रवाई करने, MediaWiki एपीआई का उपयोग कर के लिए एक सरल स्क्रिप्ट लिखने की कोशिश कर रहा हूँ। हालांकि, मैं कभी नहीं (: https://en.wikipedia.org/wiki/Wikipedia:Creating_a_bot#Logging_in इस पेज से) पहले लॉगिन अनुरोध पिछले पाने के लिए लग रहे हैं। मुझे नहीं लगता कि सत्र कुकी है कि मैं सेट भेजा जा रहा है है।अजगर urllib2 के साथ HTTP शीर्ष लेख में पारित सत्र कुकीज़?

import Cookie, urllib, urllib2, xml.etree.ElementTree 

url = 'https://en.wikipedia.org/w/api.php?action=login&format=xml' 
username = 'user' 
password = 'password' 

user_data = [('lgname', username), ('lgpassword', password)] 

#Login step 1 
#Make the POST request 
request = urllib2.Request(url) 
data = urllib.urlencode(user_data) 
login_raw_data1 = urllib2.urlopen(request, data).read() 

#Parse the XML for the login information 
login_data1 = xml.etree.ElementTree.fromstring(login_raw_data1) 
login_tag = login_data1.find('login') 
token = login_tag.attrib['token'] 
cookieprefix = login_tag.attrib['cookieprefix'] 
sessionid = login_tag.attrib['sessionid'] 

#Set the cookies 
cookie = Cookie.SimpleCookie() 
cookie[cookieprefix + '_session'] = sessionid 

#Login step 2 
request = urllib2.Request(url) 
session_cookie_header = cookieprefix+'_session='+sessionid+'; path=/; domain=.wikipedia.org; HttpOnly' 

request.add_header('Set-Cookie', session_cookie_header) 
user_data.append(('lgtoken', token)) 
data = urllib.urlencode(user_data) 

login_raw_data2 = urllib2.urlopen(request, data).read() 

मुझे लगता है कि समस्या request.add_header('Set-Cookie', session_cookie_header) लाइन में कहीं है, लेकिन मुझे यकीन है कि के लिए पता नहीं है: यह मेरा कोड अब तक है। मैं इन अजगर पुस्तकालयों का उपयोग कैसे हर अनुरोध (जो एपीआई कार्यों का एक बहुत कुछ के लिए आवश्यक है) के साथ शीर्ष लेख में कुकीज़ भेजने के लिए करते हैं।

उत्तर

14

requests के नवीनतम संस्करण sessions के लिए समर्थन (और साथ ही उपयोग करने के लिए वास्तव में सरल और आम तौर पर महान किया जा रहा है):

with requests.session() as s: 
    s.post(url, data=user_data) 
    r = s.get(url_2) 
+0

मैं उस के साथ जाना होगा। यह बहुत आसान है। धन्यवाद! –

संबंधित मुद्दे