2011-08-23 3 views
7

위키피디아에 로그인하고 내 사용자 페이지에서 Mediawiki API를 사용하여 일부 작업을 수행하는 간단한 스크립트를 작성하려고합니다. 그러나, 나는 결코 첫 번째 로그인 요청 (이 페이지에서 : https://en.wikipedia.org/wiki/Wikipedia:Creating_a_bot#Logging_in)을 지나친 것처럼 보입니다. 내가 설정 한 세션 쿠키가 전송되고 있다고 생각하지 않습니다. 내가 문제가 어딘가에 request.add_header('Set-Cookie', session_cookie_header) 라인의 생각,하지만 난 확실히 모르는http 헤더에서 파이썬 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() 

이 지금까지 내 코드입니다. 이 파이썬 라이브러리를 사용하여 요청마다 헤더에서 쿠키를 보내려면 어떻게해야합니까? (이는 많은 API 함수에 필요합니다).

답변

14

requests의 최신 버전은 sessions에 대한 지원 (뿐만 아니라 사용하기 정말 간단하고 일반적으로 큰 것)이 있습니다

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

나는 그와 함께 갈 것입니다. 훨씬 쉽습니다. 고맙습니다! –

관련 문제