2010-06-02 13 views
17

मैं एक समारोह के प्रपत्र डेटा पोस्ट और एक फ़ाइल में लौट आए कुकी जानकारी को बचाने ताकि अगली बार जब पृष्ठ को देखे जाने पर लिखने की कोशिश कर रहा हूँ, कुकी जानकारी है सर्वर को भेजा गया (यानी सामान्य ब्राउज़र व्यवहार)। कोई सफलता और अभी भी -अजगर रूप 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() फ़ंक्शन मैं बचाया है किसी भी कुकी जानकारी का उपयोग करने के संशोधित कर सकता है?

उत्तर

29

कोड है कि आप पोस्ट किया है के साथ काफी कुछ समस्याएं हैं। आम तौर पर आप एक कस्टम ओपनर बनाना चाहते हैं जो रीडायरेक्ट, https इत्यादि को संभाल सकता है अन्यथा आप परेशानी में भाग लेंगे। जहां तक ​​कुकीज़ खुद को हां, तो आप लोड फोन और अपने cookiejar पर तरीकों बचाने के लिए, और उपवर्गों में से एक, MozillaCookieJar जैसे या LWPCookieJar उपयोग करने की आवश्यकता के रूप में।

यहां कक्षा मैं फेसबुक के लिए लॉग इन करने के लिए, वापस लिखा था जब मैं मूर्ख वेब खेल खेल रहा था। मैंने इसे एक मेमोरी के बजाए फ़ाइल आधारित कुकीजर का उपयोग करने के लिए संशोधित किया है।

import cookielib 
import os 
import urllib 
import urllib2 

# set these to whatever your fb account is 
fb_username = "[email protected]" 
fb_password = "secretpassword" 

cookie_filename = "facebook.cookies" 

class WebGamePlayer(object): 

    def __init__(self, login, password): 
     """ Start up... """ 
     self.login = login 
     self.password = password 

     self.cj = cookielib.MozillaCookieJar(cookie_filename) 
     if os.access(cookie_filename, os.F_OK): 
      self.cj.load() 
     self.opener = urllib2.build_opener(
      urllib2.HTTPRedirectHandler(), 
      urllib2.HTTPHandler(debuglevel=0), 
      urllib2.HTTPSHandler(debuglevel=0), 
      urllib2.HTTPCookieProcessor(self.cj) 
     ) 
     self.opener.addheaders = [ 
      ('User-agent', ('Mozilla/4.0 (compatible; MSIE 6.0; ' 
          'Windows NT 5.2; .NET CLR 1.1.4322)')) 
     ] 

     # need this twice - once to set cookies, once to log in... 
     self.loginToFacebook() 
     self.loginToFacebook() 

     self.cj.save() 

    def loginToFacebook(self): 
     """ 
     Handle login. This should populate our cookie jar. 
     """ 
     login_data = urllib.urlencode({ 
      'email' : self.login, 
      'pass' : self.password, 
     }) 
     response = self.opener.open("https://login.facebook.com/login.php", login_data) 
     return ''.join(response.readlines()) 

test = WebGamePlayer(fb_username, fb_password) 

आप अपने यूज़रनेम और पासवर्ड सेट करने के बाद, आप इसे में अपनी कुकी के साथ एक फ़ाइल, facebook.cookies देखना चाहिए,। अभ्यास में आप शायद यह जांचने के लिए संशोधित करना चाहते हैं कि आपके पास एक सक्रिय कुकी है या इसका उपयोग करें, फिर एक्सेस अस्वीकार होने पर फिर से लॉग इन करें।

+0

कोड स्निपेट के लिए +1। आपका कोड मेरा से इतना साफ और साफ है (अच्छी तरह से मैं सिर्फ पाइथोनिस्टा बनना सीखना शुरू कर रहा हूं!)) मैंने आपकी पोस्ट को दोबारा पढ़ा है - दो चीजें हैं जो मुझे स्पष्ट नहीं हैं। 1)। मुझे समझ में नहीं आता कि आपको लॉगिन टॉफ़ेसबुक() दो बार क्यों कॉल करना है। ऐसा लगता है कि जब भी loginToFacebook() विधि आईडी लागू होती है तो कुकी सेट की जाएगी। कृपया क्या आप स्पष्टीकरण दे सकते हैं?। 2)। क्या आप एक सक्रिय कुकी मौजूद है या नहीं, यह जांचने के लिए दिशानिर्देश दे सकते हैं? – morpheous

+1

कुकी-आधारित लॉग इन के साथ, सर्वर पहले आपको एक कुकी निर्दिष्ट करता है, * फिर * आप लॉग इन करते हैं। अगर आप लॉग इन में से किसी एक को हटाने का प्रयास करते हैं, तो आप पाएंगे कि आप लॉग इन नहीं हैं - एफबी ने आपकी प्रतिक्रिया की जांच की है, देखा है कि आपके पास कुकी नहीं है और आपको वापस लॉगिन पृष्ठ पर रीडायरेक्ट किया गया है।एफबी फ्रंट पेज जैसे 'डीफ getFBCookie (self): self.opener.open (' https://www.facebook.com/ ')' ) के साथ पहली कॉल को बदलने के लिए एक स्पष्ट तरीका होगा। वहीं काम करें। और हाँ, यह बहुत साफ कोड है। इसमें थोड़ा और समय लगता है, लेकिन जब आपको बाद में इसे पढ़ने की आवश्यकता होती है, तो इसका भुगतान करता है :) –

2

आप काम करने के लिए अपने पोस्ट अनुरोध (जैसे मैं एक लॉगिन फार्म के साथ किया था) बनाने, यह निश्चित रूप से जल्दी से (फ़ायरफ़ॉक्स को लाइव HTTP हेडर विस्तार http://livehttpheaders.mozdev.org स्थापित करने के लिए भुगतान करता है एक कठिन समय हो रही है /index.html)। यह छोटा एक्सटेंशन, अन्य चीजों के साथ, आपको मैन्युअल रूप से लॉग इन करते समय भेजे गए सटीक पोस्ट डेटा दिखा सकता है।

मेरे मामले में, मैंने दीवार के खिलाफ अपने सिर को घंटों तक टक्कर लगी थी क्योंकि साइट ने अतिरिक्त क्षेत्र पर जोर दिया था 'action = login' (doh!) के साथ।

1

कुकी बचाने के दौरान कृपया ignore_discard और ignore_expires का उपयोग करके, मेरे मामले में यह ठीक से सहेजा गया।

self.cj.save(cookie_file, ignore_discard=True, ignore_expires=True) 
संबंधित मुद्दे