2010-02-16 12 views

Répondre

1

L'OP a clarifié qu'il ne s'agit pas d'un problème de simultanéité. Avec un traitement séquentiel en tête, c'est beaucoup plus simple. Une fois, j'ai utilisé quelque chose comme ce qui suit pour mettre à jour un tas de stations de base de téléphone SIP (ils avaient une interface Web que vous pouvez utiliser pour télécharger des fichiers VCard pour le répertoire téléphonique). Notez que je viens de couper quelques merdes et renommé ceci et que dans ce script hacky, j'ai fait pas le tester du tout. Son seul but est de donner au PO une idée sur la façon dont il pourrait gérer cela.

#!/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

Note: en utilisant sys.exit comme ceci est grossier, utilisez plutôt des exceptions. – paprika

+0

ouais je suppose que quelque chose comme ça avec des pots de biscuits séparés est ce dont j'ai besoin pour garder les sessions indépendantes – hoju

1

Comment y parvenir dépend vraiment de vos besoins: quel type de connexion est-il? Digérer l'authentification? Est-ce un formulaire Web? JavaScript est-il impliqué (vous êtes plutôt foutu si c'est le cas)? Une bibliothèque comme mechanize peut vous aider beaucoup avec de telles choses: gestion de formulaires, redirection, authentification, cookies ... Cependant, vous devrez vous occuper de la concurrence en générant des threads/processus.

Une autre approche qui fonctionne admirablement pour la simultanéité utilise Twisted. Avec cette solution, vous devrez toutefois gérer vous-même les redirections, les cookies, etc., même si vous pourriez être en mesure de réutiliser des parties, par ex. mécaniser.

+0

C'est une forme simple basée sur des cookies et je l'ai pour une connexion unique. Threading n'est pas le problème autant que la gestion de plusieurs sessions de cookies. – hoju

+0

Ensuite, cela n'a rien à voir avec la concurrence (vous devriez supprimer cette balise). Dans ce cas, vous pouvez simplement instancier une nouvelle classe cookiejar pour chaque compte. – paprika

+0

J'accèderai simultanément à plusieurs comptes, donc il est lié à la concurrence. Ce que je voulais dire, c'est enfiler n'est pas la partie difficile. – hoju