मैं एक समारोह के प्रपत्र डेटा पोस्ट और एक फ़ाइल में लौट आए कुकी जानकारी को बचाने ताकि अगली बार जब पृष्ठ को देखे जाने पर लिखने की कोशिश कर रहा हूँ, कुकी जानकारी है सर्वर को भेजा गया (यानी सामान्य ब्राउज़र व्यवहार)। कोई सफलता और अभी भी -अजगर रूप urllib2 का उपयोग कर पोस्ट (भी बचत पर सवाल/कुकीज़ का उपयोग कर)
मैं सी में अपेक्षाकृत आसानी से यह लिखा ++ curlib का उपयोग कर, लेकिन लगभग एक पूरा दिन बिताया है पायथन में यह लिखने की कोशिश कर, 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() विधि आईडी लागू होती है तो कुकी सेट की जाएगी। कृपया क्या आप स्पष्टीकरण दे सकते हैं?। 2)। क्या आप एक सक्रिय कुकी मौजूद है या नहीं, यह जांचने के लिए दिशानिर्देश दे सकते हैं? – morpheous
कुकी-आधारित लॉग इन के साथ, सर्वर पहले आपको एक कुकी निर्दिष्ट करता है, * फिर * आप लॉग इन करते हैं। अगर आप लॉग इन में से किसी एक को हटाने का प्रयास करते हैं, तो आप पाएंगे कि आप लॉग इन नहीं हैं - एफबी ने आपकी प्रतिक्रिया की जांच की है, देखा है कि आपके पास कुकी नहीं है और आपको वापस लॉगिन पृष्ठ पर रीडायरेक्ट किया गया है।एफबी फ्रंट पेज जैसे 'डीफ getFBCookie (self): self.opener.open (' https://www.facebook.com/ ')' ) के साथ पहली कॉल को बदलने के लिए एक स्पष्ट तरीका होगा। वहीं काम करें। और हाँ, यह बहुत साफ कोड है। इसमें थोड़ा और समय लगता है, लेकिन जब आपको बाद में इसे पढ़ने की आवश्यकता होती है, तो इसका भुगतान करता है :) –