2010-02-16 5 views

답변

1

OP는 동시성 문제가 아니라고 분명히했습니다. 순차 처리를 염두에두면 훨씬 간단합니다. 한 번 SIP Phone 기지국을 업데이트하기 위해 다음과 같은 것을 사용했습니다 (전화 번호부에 VCard 파일을 업로드하는 데 사용할 수있는 웹 프런트 엔드가있었습니다). 난 그냥 쓰레기를 잘라 버리고 이름을 바꿨다.이 해킹 스크립트에서는 이 아니고이 전혀 테스트되지 않았다. 그것의 유일한 목적은 그가 이것을 처리 할 수있는 방법에 대해 OP에게 아이디어를주는 것입니다.

#!/usr/bin/python 
# -*- coding:utf-8 -*- 

from optparse import OptionParser 
import sys 
from mechanize import Browser, CookieJar, Request, urlopen 


accounts = [ 
    {'ipaddr': '127.0.0.1', 'user': 'joe', 'pass': 'foobar'}, 
    ] 


class WebsiteAccount(object): 

    def __init__(self, ipaddr, username, password, browser): 
     self.ipaddr = ipaddr 
     self.username = username 
     self.password = password 
     self.browser = browser 
     self.cookiejar = CookieJar() 
     self.browser.set_cookiejar(self.cookiejar) 

    def login(self): 
     self.browser.open('http://'+self.ipaddr+'/login.html') 
     self.browser.select_form(name='loginform') 
     self.browser.form.set_value(self.username, name='username') 
     self.browser.form.set_value(self.password, name='password') 
     resp = self.browser.submit() 
     print 'Logging into account %[email protected]%s ...' % (self.username, self.ipaddr), 
     if resp.geturl().endswith('/login.html'): 
      print 'FAILED!' 
      sys.exit(1) 
     print ' OK' 

    def logout(self): 
     print ('Logging out from account %[email protected]%s...' % (self.username, self.ipaddr), 
     self.browser.open('http://'+self.ipaddr+'/logout.html') 
     self.browser.close() 
     print 'OK' 


def main(): 
    parser = OptionParser() 
    parser.add_option('-d', '--debug', action='store_true', dest='debug', default=False) 
    parser.add_option('-v', '--verbose', action='store_true', dest='verbose', default=False) 
    (opts, args) = parser.parse_args() 
    for account in accounts: 
     browser = Browser() 
     browser.set_handle_referer(True) 
     browser.set_handle_redirect(True) 
     browser.set_handle_robots(False) 
     bs = WebsiteAccount(account['ipaddr'], 
          account['user'], 
          account['pass'], 
          browser) 
     # DEBUG 
     if opts.debug == True: 
      browser.set_debug_redirects(True) 
      browser.set_debug_responses(True) 
      browser.set_debug_http(True) 
     bs.login() 
     try: 
      # ... do some stuff 
      # save cookies here? 
      pass 
     finally: 
      # you shouldn't use this if you are interested in the login cookies 
      bs.logout() 


if __name__=='__main__': 
    main() 
+0

참고 : 이처럼 sys.exit을 사용하면 총체적입니다. 대신 예외를 사용하십시오. – paprika

+0

예. 쿠키 항아리가 따로있는 것 같아 세션을 독립적으로 유지해야합니다. – hoju

1

어떻게 이것을 달성하기 위해 정말 당신이 필요에 따라 달라집니다 : 어떤 종류의 로그인입니까? 다이제스트 인증? 웹 양식입니까? 자바 스크립트가 관련되어 있습니까? mechanize과 같은 라이브러리는 폼 처리, 리디렉션, 인증, 쿠키 등 많은 도움을 줄 수 있습니다. 그러나 스레드/프로세스를 생성하여 동시성을 관리해야합니다.

동시성에 대해 아름답게 작동하는 또 다른 방법은 Twisted입니다. 그런 솔루션을 사용하면 리디렉션과 쿠키 등을 직접 처리해야합니다. 예를 들어 일부를 재사용 할 수는 있지만. 기계화하다.

+0

쿠키를 기반으로하는 간단한 양식이며 단일 로그인으로 작동합니다. 스레딩은 여러 쿠키 세션을 처리하는 것만큼이나 문제가되지 않습니다. – hoju

+0

그러면 동시성과 관련이 없습니다 (태그를 제거해야합니다). 이 경우 모든 계정에 대해 새로운 cookiejar 클래스를 간단하게 인스턴스화 할 수 있습니다. – paprika

+0

여러 계정을 동시에 액세스하게되므로 동시성과 관련이 있습니다. 내가 말한 것은 실을 꿰는 것이 어려운 부분이 아니라는 것입니다. – hoju

관련 문제