如何与Python同时登录多个网站帐户

时间:2010-02-16 05:32:58

标签: python cookies concurrency login urllib2

我正在使用urllib2和HTTPCookieProcessor登录网站。我想同时登录多个帐户并存储cookie以便以后重用。

您能推荐一种方法或库来实现这一目标吗?

2 个答案:

答案 0 :(得分:1)

如何实现这一点取决于您的需求:它是什么类型的登录?摘要认证?它是一个网络表单吗?是否涉及JavaScript(如果是这种情况,你几乎搞砸了)?像mechanize这样的库可以帮助你解决很多问题:处理表单,重定向,身份验证,cookie ......但是,你必须通过生成线程/进程来自己处理并发。

另一种适用于并发的方法是使用Twisted。然而,使用该解决方案,您必须自己处理重定向和cookie等 - 尽管您可能能够重用例如机械化。

答案 1 :(得分:1)

OP澄清说这不是并发问题。考虑到顺序处理,这要简单得多。我曾经使用类似下面的东西来更新一堆SIP电话基站(他们有一个网络前端,你可以使用它来上传电话簿的VCard文件)。请注意,我只是删除了一些废话并重命名了这个,在这个hacky脚本中,我做了测试它。它的唯一目的是让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 %s@%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 %s@%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()