4
from flexget.plugin import PluginError, register_plugin
6
log = logging.getLogger('formlogin')
9
class FormLogin(object):
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')
24
def on_feed_start(self, feed, config):
26
from mechanize import Browser
28
raise PluginError('mechanize required (python module), please install it.', log)
30
userfield = config.get('userfield', 'username')
31
passfield = config.get('passfield', 'password')
34
username = config['username']
35
password = config['password']
38
br.set_handle_robots(False)
42
# TODO: improve error handling
43
raise PluginError('Unable to post login form', log)
45
#br.set_debug_redirects(True)
46
#br.set_debug_responses(True)
47
#br.set_debug_http(True)
49
for form in br.forms():
53
loginform[userfield] = username
54
loginform[passfield] = password
59
received = os.path.join(feed.manager.config_base, 'received')
60
if not os.path.isdir(received):
62
filename = os.path.join(received, '%s.formlogin.html' % feed.name)
63
f = open(filename, 'w')
64
f.write(br.response().get_data())
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)
73
cookiejar = br._ua_handlers["_cookies"].cookiejar
75
# Add cookiejar to our requests session
76
feed.requests.add_cookiejar(cookiejar)
77
# Add handler to urllib2 default opener for backwards compatibility
78
handler = urllib2.HTTPCookieProcessor(cookiejar)
80
log.debug('Adding HTTPCookieProcessor to default opener')
81
urllib2._opener.add_handler(handler)
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)
91
# Feed aborted, unhook the cookiejar
92
on_feed_abort = on_feed_exit
94
register_plugin(FormLogin, 'form', api_ver=2)