flexget.plugins.plugin_formlogin
Covered: 24 lines
Missed: 45 lines
Skipped 26 lines
Percent: 34 %
 1
import logging
 2
import os
 3
import urllib2
 4
from flexget.plugin import PluginError, register_plugin
 6
log = logging.getLogger('formlogin')
 9
class FormLogin(object):
10
    """
11
    Login on form
12
    """
14
    def validator(self):
15
        from flexget import validator
16
        root = validator.factory('dict')
17
        root.accept('url', key='url', required=True)
18
        root.accept('text', key='username', required=True)
19
        root.accept('text', key='password', required=True)
20
        root.accept('text', key='userfield')
21
        root.accept('text', key='passfield')
22
        return root
24
    def on_feed_start(self, feed, config):
25
        try:
26
            from mechanize import Browser
27
        except ImportError:
28
            raise PluginError('mechanize required (python module), please install it.', log)
30
        userfield = config.get('userfield', 'username')
31
        passfield = config.get('passfield', 'password')
33
        url = config['url']
34
        username = config['username']
35
        password = config['password']
37
        br = Browser()
38
        br.set_handle_robots(False)
39
        try:
40
            br.open(url)
41
        except Exception, e:
43
            raise PluginError('Unable to post login form', log)
49
        for form in br.forms():
50
            loginform = form
52
            try:
53
                loginform[userfield] = username
54
                loginform[passfield] = password
55
                break
56
            except Exception, e:
57
                pass
58
        else:
59
            received = os.path.join(feed.manager.config_base, 'received')
60
            if not os.path.isdir(received):
61
                os.mkdir(received)
62
            filename = os.path.join(received, '%s.formlogin.html' % feed.name)
63
            f = open(filename, 'w')
64
            f.write(br.response().get_data())
65
            f.close()
66
            log.critical('I have saved the login page content to %s for you to view' % filename)
67
            raise PluginError('Unable to find login fields', log)
69
        br.form = loginform
71
        br.submit()
73
        cookiejar = br._ua_handlers["_cookies"].cookiejar
76
        feed.requests.add_cookiejar(cookiejar)
78
        handler = urllib2.HTTPCookieProcessor(cookiejar)
79
        if urllib2._opener:
80
            log.debug('Adding HTTPCookieProcessor to default opener')
81
            urllib2._opener.add_handler(handler)
82
        else:
83
            log.debug('Creating new opener and installing it')
84
            urllib2.install_opener(urllib2.build_opener(handler))
86
    def on_feed_exit(self, feed, config):
87
        """Feed exiting, remove cookiejar"""
88
        log.debug('Removing urllib2 opener')
89
        urllib2.install_opener(None)
92
    on_feed_abort = on_feed_exit
94
register_plugin(FormLogin, 'form', api_ver=2)