2012-08-15 11 views
7

मैं अपने याहू खाते में एक यूबंटू सर्वर पर चल रहे स्क्रिप्ट से लॉगिन करना चाहता हूं। मैंने मैकेनाइजेशन के साथ अजगर का उपयोग करने की कोशिश की है, लेकिन मेरी योजना में एक दोष है।यूबंटू सर्वर से प्रोग्रामिंग रूप से लॉगिन करने के लिए कैसे करें

यह वह समय है जो मेरे पास है।

 loginurl = "https://login.yahoo.com/config/login" 
     br = mechanize.Browser() 
     cj = cookielib.LWPCookieJar() 
     br.set_cookiejar(cj) 
     br.set_handle_equiv(True) 
     br.set_handle_gzip(True) 
     br.set_handle_redirect(True) 
     br.set_handle_referer(True) 
     br.set_handle_robots(False) 
     br.set_handle_refresh(mechanize._http.HTTPRefreshProcessor(), max_time=1) 
     br.addheaders = [('User-agent', 'Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.1) Gecko/2008071615 Fedora/3.0.1-1.fc9 Firefox/3.0.1')] 
     r = br.open(loginurl) 
     html = r.read() 
     br.select_form(nr=0) 
     br.form['login']='[mylogin]' 
     br.form['passwd']='[mypassword]' 
     br.submit() 

     print br.response().read() 

मुझे प्राप्त प्रतिक्रिया बोल्ड लाल टेक्स्ट पढ़ने के साथ एक याहू लॉगिन पृष्ठ है। "जावास्क्रिप्ट को आपके ब्रोसर पर सक्षम होना चाहिए" या कुछ ऐसा ही है। मैकेनाइज डॉक्स पर एक अनुभाग है जो जेएस के साथ कुकीज़ बनाने वाले पृष्ठों का उल्लेख करता है, लेकिन सहायता पृष्ठ एक HTTP 400 (केवल मेरी किस्मत)

यह पता लगाने के लिए कि जावास्क्रिप्ट क्या करता है और फिर इसे मैन्युअल रूप से बहुत कुछ लगता है मुश्किल कार्य। मैं किसी भी उपकरण/भाषा पर स्विच करने के लिए काफी इच्छुक हूं, जब तक कि यह एक उबंटू सर्वर पर चल सके। भले ही इसका मतलब लॉगिन के लिए एक अलग टूल का उपयोग करना है और फिर लॉग इन कुकी को मेरी पायथन स्क्रिप्ट पर वापस लेना है। किसी भी मदद/सलाह की सराहना की।

अद्यतन:

  • मैं याहू एपीआई

  • मैं भी scrapy साथ की कोशिश की है का उपयोग नहीं करना चाहते हैं, लेकिन मैं एक ही समस्या इसलिए होती है

मेरे scrapy लगता है स्क्रिप्ट

class YahooSpider(BaseSpider): 
name = "yahoo" 
start_urls = [ 
    "https://login.yahoo.com/config/login?.intl=us&.lang=en-US&.partner=&.last=&.src=&.pd=_ver%3D0%26c%3D%26ivt%3D%26sg%3D&pkg=&stepid=&.done=http%3a//my.yahoo.com" 
] 

def parse(self, response): 
    x = HtmlXPathSelector(response) 
    print x.select("//input/@value").extract() 
    return [FormRequest.from_response(response, 
       formdata={'login': '[my username]', 'passwd': '[mypassword]'}, 
       callback=self.after_login)] 

def after_login(self, response): 
    # check login succeed before going on 
    if response.url == 'http://my.yahoo.com': 
     return Request("[where i want to go next]", 
        callback=self.next_page, errback=self.error, dont_filter=True) 
    else: 
     print response.url 
     self.log("Login failed.", level=log.CRITICAL) 

def next_page(sekf, response): 
    x = HtmlXPathSelector(response) 
    print x.select("//title/text()").extract() 

scrapy स्क्रिप्ट सिर्फ आउटपुट "https://login.yahoo.com/config/login" ...... बू

+0

क्या इस तरह की चीज़ के लिए याहू एपीआई नहीं हैं? –

+0

हाँ लेकिन इसकी सीमित कार्यक्षमता दुर्भाग्यवश – DrLazer

+0

मुझे आपकी स्क्रिप्ट का उपयोग करने में कोई समस्या नहीं है। – xbb

उत्तर

3

मैं हैरान हूं कि इस काम करता है:

Python 2.6.6 (r266:84292, Dec 26 2010, 22:31:48) 
[GCC 4.4.5] on linux2 
Type "help", "copyright", "credits" or "license" for more information. 
>>> from BeautifulSoup import BeautifulSoup as BS 
>>> import requests 
>>> r = requests.get('https://login.yahoo.com/') 
>>> soup = BS(r.text) 
>>> login_form = soup.find('form', attrs={'name':'login_form'}) 
>>> hiddens = login_form.findAll('input', attrs={'type':'hidden'}) 
>>> payload = {} 
>>> for h in hiddens: 
...  payload[str(h.get('name'))] = str(h.get('value')) 
... 
>>> payload['login'] = '[email protected]' 
>>> payload['passwd'] = '********' 
>>> post_url = str(login_form.get('action')) 
>>> r2 = requests.post(post_url, cookies=r.cookies, data=payload) 
>>> r3 = requests.get('http://my.yahoo.com', cookies=r2.cookies) 
>>> page = r3.text 
>>> pos = page.find('testtest481') 
>>> print page[ pos - 50 : pos + 300 ] 
    You are signed in as: <span class="yuhead-yid">testtest481</span>  </li> </ul></li><li id="yuhead-me-signout" class="yuhead-me"><a href=" 
http://login.yahoo.com/config/login?logout=1&.direct=2&.done=http://www.yahoo.com&amp;.src=my&amp;.intl=us&amp;.lang=en-US" target="_top" rel="nofoll 
ow">   Sign Out  </a><img width='0' h 
>>> 

कृपया इस दे एक प्रयास:

"""                   
ylogin.py - how-to-login-to-yahoo-programatically-from-an-ubuntu-server  

http://stackoverflow.com/questions/11974478/        
Test my.yahoo.com login using requests and BeautifulSoup.     
"""                   

from BeautifulSoup import BeautifulSoup as BS        
import requests                

CREDS = {'login': 'CHANGE ME',            
     'passwd': 'CHANGE ME'}            
URLS = {'login': 'https://login.yahoo.com/',        
     'post': 'https://login.yahoo.com/config/login?',     
     'home': 'http://my.yahoo.com/'}          

def test():                 
    cookies = get_logged_in_cookies()          
    req_with_logged_in_cookies = requests.get(URLS['home'], cookies=cookies)  
    assert 'You are signed in' in req_with_logged_in_cookies.text 
    print "If you can see this message you must be logged in." 

def get_logged_in_cookies():            
    req = requests.get(URLS['login'])          
    hidden_inputs = BS(req.text).find('form', attrs={'name':'login_form'})\ 
           .findAll('input', attrs={'type':'hidden'}) 
    data = dict(CREDS.items() + dict((h.get('name'), h.get('value')) \  
             for h in hidden_inputs).items()) 
    post_req = requests.post(URLS['post'], cookies=req.cookies, data=data) 
    return post_req.cookies             

test()                  

आवश्यकतानुसार त्रुटि प्रबंधन जोड़ें।

+0

मुझे आश्चर्य है कि यह भी काम करता है। मैंने आपके स्क्रिप्ट पत्र को पत्र के लिए कॉपी किया है, केवल आपके खाते को मेरे साथ बदल दिया है। मेरे लिए नतीजा कोई आउटपुट नहीं है ... क्योंकि "pos" -1 है और मैं अभी भी साइन इन पेज पर दिखाई देता हूं, केवल अंतर है कि मैं सोच सकता हूं कि मेरा पायथन संस्करण 2.7.2+ और [GCC 4.6 है। 1] linux2 – DrLazer

+0

पर मैंने कुछ चीजों को मसाला देने के लिए एक उपहार दिया है। – DrLazer

+0

देरी के लिए खेद है। बैंक छुट्टी सप्ताहांत के लिए दूर चला गया। ठीक है मैंने आपकी संशोधित स्क्रिप्ट (पोस्टिंग के लिए धन्यवाद) की कोशिश की है। – DrLazer

1

आपका Scrapy स्क्रिप्ट मेरे लिए काम करता है:

from scrapy.spider import BaseSpider 
from scrapy.http import FormRequest 
from scrapy.selector import HtmlXPathSelector 

class YahooSpider(BaseSpider): 
    name = "yahoo" 
    start_urls = [ 
     "https://login.yahoo.com/config/login?.intl=us&.lang=en-US&.partner=&.last=&.src=&.pd=_ver%3D0%26c%3D%26ivt%3D%26sg%3D&pkg=&stepid=&.done=http%3a//my.yahoo.com" 
    ] 

    def parse(self, response): 
     x = HtmlXPathSelector(response) 
     print x.select("//input/@value").extract() 
     return [FormRequest.from_response(response, 
        formdata={'login': '<username>', 'passwd': '<password>'}, 
        callback=self.after_login)] 

    def after_login(self, response): 
     self.log('Login successful: %s' % response.url) 

आउटपुट:

[email protected]:myproj$ scrapy crawl yahoo 
2012-08-22 20:55:31-0500 [scrapy] INFO: Scrapy 0.15.1 started (bot: drzyahoo) 
2012-08-22 20:55:31-0500 [scrapy] DEBUG: Enabled extensions: LogStats, TelnetConsole, CloseSpider, WebService, CoreStats, SpiderState 
2012-08-22 20:55:31-0500 [scrapy] DEBUG: Enabled downloader middlewares: HttpAuthMiddleware, DownloadTimeoutMiddleware, UserAgentMiddleware, RetryMiddleware, DefaultHeadersMiddleware, RedirectMiddleware, CookiesMiddleware, HttpCompressionMiddleware, ChunkedTransferMiddleware, DownloaderStats 
2012-08-22 20:55:31-0500 [scrapy] DEBUG: Enabled spider middlewares: HttpErrorMiddleware, OffsiteMiddleware, RefererMiddleware, UrlLengthMiddleware, DepthMiddleware 
2012-08-22 20:55:31-0500 [scrapy] DEBUG: Enabled item pipelines: 
2012-08-22 20:55:31-0500 [yahoo] INFO: Spider opened 
2012-08-22 20:55:31-0500 [yahoo] INFO: Crawled 0 pages (at 0 pages/min), scraped 0 items (at 0 items/min) 
2012-08-22 20:55:31-0500 [scrapy] DEBUG: Telnet console listening on 0.0.0.0:6023 
2012-08-22 20:55:31-0500 [scrapy] DEBUG: Web service listening on 0.0.0.0:6080 
2012-08-22 20:55:32-0500 [yahoo] DEBUG: Crawled (200) <GET https://login.yahoo.com/config/login?.intl=us&.lang=en-US&.partner=&.last=&.src=&.pd=_ver%3D0%26c%3D%26ivt%3D%26sg%3D&pkg=&stepid=&.done=http%3a//my.yahoo.com> (referer: None) 
[u'1', u'', u'', u'', u'', u'', u'', u'us', u'en-US', u'', u'', u'93s42g583b3cg', u'0', u'L0iOlEQ1EbZ24TfLRpA43s5offgQ', u'', u'', u'', u'', u'', u'0', u'Y', u'http://my.yahoo.com', u'_ver=0&c=&ivt=&sg=', u'0', u'0', u'0', u'5', u'5', u'', u'y'] 
2012-08-22 20:55:32-0500 [yahoo] DEBUG: Redirecting (meta refresh) to <GET http://my.yahoo.com> from <POST https://login.yahoo.com/config/login> 
2012-08-22 20:55:33-0500 [yahoo] DEBUG: Crawled (200) <GET http://my.yahoo.com> (referer: https://login.yahoo.com/config/login?.intl=us&.lang=en-US&.partner=&.last=&.src=&.pd=_ver%3D0%26c%3D%26ivt%3D%26sg%3D&pkg=&stepid=&.done=http%3a//my.yahoo.com) 
2012-08-22 20:55:33-0500 [yahoo] DEBUG: Login successful: http://my.yahoo.com 
2012-08-22 20:55:33-0500 [yahoo] INFO: Closing spider (finished) 
2012-08-22 20:55:33-0500 [yahoo] INFO: Dumping spider stats: 
    {'downloader/request_bytes': 2447, 
    'downloader/request_count': 3, 
    'downloader/request_method_count/GET': 2, 
    'downloader/request_method_count/POST': 1, 
    'downloader/response_bytes': 77766, 
    'downloader/response_count': 3, 
    'downloader/response_status_count/200': 3, 
    'finish_reason': 'finished', 
    'finish_time': datetime.datetime(2012, 8, 23, 1, 55, 33, 837619), 
    'request_depth_max': 1, 
    'scheduler/memory_enqueued': 3, 
    'start_time': datetime.datetime(2012, 8, 23, 1, 55, 31, 271262)} 

पर्यावरण:

[email protected]:myproj$ scrapy version -v 
Scrapy : 0.15.1 
lxml : 2.3.2.0 
libxml2 : 2.7.8 
Twisted : 11.1.0 
Python : 2.7.3 (default, Aug 1 2012, 05:14:39) - [GCC 4.6.3] 
Platform: Linux-3.2.0-29-generic-x86_64-with-Ubuntu-12.04-precise 
1

जब सक्षम js की जरूरत है, और कोई प्रदर्शन उपलब्ध है, phantomjs है एक अच्छा समाधान, सोचा कि यह जेएस है, पायथन नहीं: $

2

यदि पृष्ठ जावास्क्रिप्ट का उपयोग कर रहा है तो आप अनुरोध या मशीनीकरण के बजाय ghost.py जैसे कुछ का उपयोग करने पर विचार कर सकते हैं। ghost.py एक वेबकिट क्लाइंट होस्ट करता है और कम से कम प्रयास के साथ इनकी मुश्किल परिस्थितियों को संभालने में सक्षम होना चाहिए।

+0

ओह, यह अच्छा है, पता नहीं था कि एक अजगर phantomjs के बराबर था :) – Tshirtman

0

आप जावास्क्रिप्ट एपीआई http://phantomjs.org/ के साथ एक हेडलेस वेबकिट फ़ैंटॉमजेएस को आजमा सकते हैं, यह प्रोग्रामैटिक जावास्क्रिप्ट-सक्षम ब्राउज़िंग का समर्थन करता है।

0

FancyURLOpener का उपयोग क्यों नहीं करें? यह मानक HTTP त्रुटियों को संभालता है और prompt_user_passwd() फ़ंक्शन है।लिंक से:

मूल प्रमाणीकरण करते समय, FancyURLopener इंस्टेंस इसकी prompt_user_passwd() विधि को कॉल करता है। डिफ़ॉल्ट कार्यान्वयन उपयोगकर्ताओं को नियंत्रण टर्मिनल पर आवश्यक जानकारी के लिए पूछता है। आवश्यकता होने पर अधिक उपयुक्त व्यवहार का समर्थन करने के लिए एक उप-वर्ग इस विधि को ओवरराइड कर सकता है।

संबंधित मुद्दे