Source code for mwapi.cli
"""
Command-line Interface (cli)
============================
This module provides utilities for interacting with a user from the
command-line.
.. autofunction:: mwapi.cli.do_login
"""
import getpass
import sys
from .errors import ClientInteractionRequest
[docs]def do_login(session, for_what):
"""
Performs a login handshake with a user on the command-line. This method
will handle all of the follow-up requests (e.g. capcha or two-factor). A
login that requires two-factor looks like this::
>>> import mwapi.cli
>>> import mwapi
>>> mwapi.cli.do_login(mwapi.Session("https://en.wikipedia.org"), "English Wikipedia")
Log into English Wikipedia
Username: Halfak (WMF)
Passord:
Please enter verification code from your mobile app
Token(OATHToken): 234567
:Parameters:
session : :class:`mwapi.Session`
A session object to use for login
for_what : `str`
A name to display to the use (for what they are logging into)
""" # noqa
username, password = request_username_password(for_what)
try:
session.login(username, password)
except ClientInteractionRequest as cir:
params = request_interaction(cir)
session.continue_login(cir.login_token, **params)
def request_interaction(cir):
sys.stderr.write("{0}\n".format(cir.message))
params = {}
for req_doc in cir.requests:
# sys.stderr.write("id: {0}\n".format(req_doc['id']))
for name, field in req_doc['fields'].items():
prefix = "{0}({1}): ".format(field['label'], name)
if field.get('sensitive', False):
value = getpass.getpass(prefix)
else:
sys.stderr.write(prefix)
sys.stderr.flush()
value = open('/dev/tty').readline().strip()
params[name] = value
return params
def request_username_password(for_what):
sys.stderr.write("Log into " + for_what + "\n")
sys.stderr.write("Username: ")
sys.stderr.flush()
return open('/dev/tty').readline().strip(), getpass.getpass("Password: ")