как войти в несколько учетных записей на сайте одновременно с Python - PullRequest
0 голосов
/ 16 февраля 2010

Я использую urllib2 и HTTPCookieProcessor для входа на сайт. Я хочу одновременно войти в несколько учетных записей и сохранить файлы cookie для последующего использования.

Можете ли вы порекомендовать подход или библиотеку для достижения этой цели?

Ответы [ 2 ]

1 голос
/ 17 февраля 2010

ОП пояснил, что это не проблема параллелизма. С учетом последовательной обработки это намного проще. Однажды я использовал что-то вроде следующего для обновления нескольких базовых станций SIP-телефонов (у них был веб-интерфейс, который можно было использовать для загрузки файлов VCard для телефонной книги). Обратите внимание, что я просто удалил немного дерьма и переименовал его, и в этом хакерском скрипте я не проверил его вообще. Его единственная цель - дать ОП понять, как он мог с этим справиться.

#!/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()
1 голос
/ 16 февраля 2010

Как этого добиться, действительно зависит от ваших потребностей: какой это логин? Дайджест аутентификации? Это веб-форма? Включен ли JavaScript (вы в значительной степени облажались, если это так)? Библиотека, подобная mechanize , может вам очень помочь с такими вещами: обработка форм, перенаправление, аутентификация, файлы cookie ... Однако вам придется самостоятельно позаботиться о параллелизме, создавая потоки / процессы. 1003 *

Другой подход, который прекрасно работает для параллелизма, - это использование Twisted . Однако с этим решением вам придется самостоятельно обрабатывать перенаправление, файлы cookie и т. Д., Хотя вы можете повторно использовать части, например ,. механизировать.

...