다음에 페이지를 방문 할 때 쿠키 정보가 반환되도록 양식 데이터를 게시하고 반환 된 쿠키 정보를 저장하는 함수를 작성하려고합니다. 서버에 전송됩니다 (예 : 일반적인 브라우저 동작).urllib2를 사용하는 Python 양식 POST (쿠키 저장/사용에 관한 질문)
필자는 curlib를 사용하여 C++에서 이것을 비교적 쉽게 작성했지만, urllib2를 사용하여 파이썬으로 작성하려고 거의 하루 종일을 보냈다. 내가 로그인 할 때
import urllib, urllib2
import logging
# the path and filename to save your cookies in
COOKIEFILE = 'cookies.lwp'
cj = None
ClientCookie = None
cookielib = None
logger = logging.getLogger(__name__)
# Let's see if cookielib is available
try:
import cookielib
except ImportError:
logger.debug('importing cookielib failed. Trying ClientCookie')
try:
import ClientCookie
except ImportError:
logger.debug('ClientCookie isn\'t available either')
urlopen = urllib2.urlopen
Request = urllib2.Request
else:
logger.debug('imported ClientCookie succesfully')
urlopen = ClientCookie.urlopen
Request = ClientCookie.Request
cj = ClientCookie.LWPCookieJar()
else:
logger.debug('Successfully imported cookielib')
urlopen = urllib2.urlopen
Request = urllib2.Request
# This is a subclass of FileCookieJar
# that has useful load and save methods
cj = cookielib.LWPCookieJar()
login_params = {'name': 'anon', 'password': 'pass' }
def login(theurl, login_params):
init_cookies();
data = urllib.urlencode(login_params)
txheaders = {'User-agent' : 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'}
try:
# create a request object
req = Request(theurl, data, txheaders)
# and open it to return a handle on the url
handle = urlopen(req)
except IOError, e:
log.debug('Failed to open "%s".' % theurl)
if hasattr(e, 'code'):
log.debug('Failed with error code - %s.' % e.code)
elif hasattr(e, 'reason'):
log.debug("The error object has the following 'reason' attribute :"+e.reason)
sys.exit()
else:
if cj is None:
log.debug('We don\'t have a cookie library available - sorry.')
else:
print 'These are the cookies we have received so far :'
for index, cookie in enumerate(cj):
print index, ' : ', cookie
# save the cookies again
cj.save(COOKIEFILE)
#return the data
return handle.read()
# FIXME: I need to fix this so that it takes into account any cookie data we may have stored
def get_page(*args, **query):
if len(args) != 1:
raise ValueError(
"post_page() takes exactly 1 argument (%d given)" % len(args)
)
url = args[0]
query = urllib.urlencode(list(query.iteritems()))
if not url.endswith('/') and query:
url += '/'
if query:
url += "?" + query
resource = urllib.urlopen(url)
logger.debug('GET url "%s" => "%s", code %d' % (url,
resource.url,
resource.code))
return resource.read()
, 내가 올바른 사용자 이름과 비밀번호가 ,.을 통과 :
이것은 내가 지금까지 무엇을 가지고 로그인이 실패하고 쿠키 데이터가 저장되지 않습니다.
내 두 가지 질문은 다음과 같습니다
- 는 사람이 무슨 잘못 로그인() 함수를 볼 수 있습니다, 어떻게 고칠 수 있을까요?
- 저장 한 쿠키 정보를 사용하기 위해 get_page() 함수를 어떻게 수정할 수 있습니까?
+1 코드 스 니펫의 경우. 코드가 너무 깔끔하고 깨끗합니다. (글쎄 파이썬 스타가되는 법을 배우기 시작했습니다.) 나는 당신의 게시물을 다시 읽었습니다. 분명하지 않은 두 가지가 있습니다. 1). 왜 loginToFacebook()을 두 번 호출해야하는지 이해가 안됩니다. loginToFacebook() 메소드 ID가 호출 될 때마다 쿠키가 설정되는 것처럼 보입니다. 분명히 해줄 수 있니?. 2). ACTIVE 쿠키가 있는지 확인하는 방법에 대한 지침을 줄 수 있습니까? – morpheous
쿠키 기반 로그인을 사용하면 서버가 먼저 쿠키를 할당하고 * 다음 * 로그인합니다. 로그인 중 하나를 제거하면 로그인하지 않은 것입니다. FB가 사용자의 응답을 확인했는지 확인했습니다 쿠키가 없으며 로그인 페이지로 다시 리디렉션되었습니다.더 명확한 방법은 첫 번째 호출을 FB 프론트 페이지를 'def getFBCookie (self) : self.opener.open ('https://www.facebook.com/ ')' 과 같이 바꾸는 것입니다. 똑같은 일을하십시오. 그리고 예, 그것은 꽤 산뜻한 코드입니다. 그건 좀 더 시간이 좀 걸리지 만 나중에 읽거나 재사용 할 필요가있을 때 돈을 지불합니다 :) –