2011-08-23 28 views
7

Tôi đang cố gắng viết một kịch bản đơn giản để đăng nhập vào Wikipedia và thực hiện một số hành động trên trang người dùng của tôi, bằng cách sử dụng api Mediawiki. Tuy nhiên, tôi dường như không bao giờ vượt qua yêu cầu đăng nhập đầu tiên (từ trang này: https://en.wikipedia.org/wiki/Wikipedia:Creating_a_bot#Logging_in). Tôi không nghĩ rằng cookie phiên mà tôi đặt đang được gửi. Đây là mã của tôi cho đến thời điểm này:cookie phiên vượt qua trong tiêu đề http với pyll urllib2?

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

Tôi nghĩ rằng sự cố ở đâu đó trong dòng request.add_header('Set-Cookie', session_cookie_header), nhưng tôi không biết chắc chắn. Làm cách nào để sử dụng các thư viện python này để gửi cookie trong tiêu đề với mọi yêu cầu (cần thiết cho nhiều hàm API).

Trả lời

14

Phiên bản mới nhất của requests đã hỗ trợ cho sessions (cũng như là thực sự đơn giản để sử dụng và nói chung là rất lớn):

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

Tôi sẽ đi với điều đó. Nó dễ dàng hơn nhiều. Cảm ơn bạn! –

Các vấn đề liên quan