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()
Note: en utilisant sys.exit comme ceci est grossier, utilisez plutôt des exceptions. – paprika
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