fidelity API documentation
Description: WARNING: This script requires that you pass your username, password and accountId. This script call...

# Module fidelity

WARNING: This script requires that you pass your username, password and accountId. This script calls cleartext only to the login form. Once logged in subsequent HTML calls are https. That said, you are passing this in clear text when running this from your shell, so your system must be secure and that is YOUR responsibility. Also, of course, do NOT store this information unencryted in a plain text file anywhere, ever.

A plugin that wraps logging into Fidelity.com and retrieving porfolio keys and attributes by by scraping the page displaying a portfolio for an account.

Based on a project with the license and credited contributors listed in the comment to this module, which is immediately after this.

Show source.

    """WARNING: This script requires that you pass your username, password
    and accountId. This script calls cleartext only to the login form.
    Once logged in subsequent HTML calls are https. That said, you are
    passing this in clear text when running this from your shell,
    so your system must be secure and that is YOUR responsibility. Also,
    of course, do NOT store this information unencryted in a plain text
    file anywhere, ever.

    A plugin that wraps logging into Fidelity.com and retrieving porfolio keys and attributes by
    by scraping the page displaying a portfolio for an account.

    Based on a project with the license and credited contributors listed in the comment to this
    module, which is immediately after this.
    """

    # www.fidelity.com account positions scraper

    # Copyright (c) 2009 Matthew J Ernisse <mernisse@ub3rgeek.net>
    # Copyright (c) 2009 John Morrissey <jwm@horde.net>
    # Copyright (c) 2014 Mark Weiss <marksweiss@yahoo.com>

    # Redistribution and use in source and binary forms,
    # with or without modification, are permitted provided
    # that the following conditions are met:
    #
    #    * Redistributions of source code must retain the
    #      above copyright notice, this list of conditions
    #      and the following disclaimer.
    #    * Redistributions in binary form must reproduce
    #      the above copyright notice, this list of conditions
    #      and the following disclaimer in the documentation
    #      and/or other materials provided with the distribution.
    #
    # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
    # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
    # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
    # FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
    # COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
    # INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
    # BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
    # OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
    # ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
    # TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
    # USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
    #
    # $Id$

    import logging
    import os
    import re
    import sys
    from urllib2 import HTTPError
    from optparse import OptionParser

    from bs4 import BeautifulSoup
    import mechanize

    from sofine.plugins import plugin_base as plugin_base

    HOST = 'www.fidelity.com'
    LOGIN_PAGE = 'https://login.fidelity.com/ftgw/Fidelity/RtlCust/Login/Init'
    LOGIN_FORM_ACTION = 'https://login.fidelity.com/ftgw/Fas/Fidelity/RtlCust/Login/Response'
    DEBUG = False
    PROXY = ''
    ACCOUNT_PAGE = 'https://oltx.fidelity.com/ftgw/fbc/ofpositions/brokerageAccountPositions?ACCOUNT=%s'

    def _get_fidelity_logged_in_browser_session(customer_id, pin, account_id, customer_email):
        # By default, store the RRD file in the same directory as this script.
        # RRD = '%s/fidelity-balance.rrd' % os.path.dirname(sys.argv[0])
        # Keep this many years of data in the RRD.
        # RRD_KEEP_LENGTH = 3

        # Set this to a filename if you want to write a tab file instead of
        # creating/updating an RRD. The file format is compatible with the
        # T. Rowe Price (trp) scraper by John Morrissey <jwm@horde.net>.
        # TAB = ''

        # Initialize mechanize settings
        br = mechanize.Browser()
        br.set_handle_robots(False)
        br.set_handle_refresh(True, 10, True)
        br.set_handle_redirect(True)
        # This e-mail address will be appended to the User-Agent header, so
        # the site can contact you about your scraping if they so desire.
        br.addheaders = [
            ('User-agent',
                'Mozilla/5.0 (X11; U; Linux i686; en-US; rv 1.0) %s' % customer_email),
        ]
        if PROXY:
            br.set_proxies({
                'http': PROXY,
                'https': PROXY,
            })

        if DEBUG:
            br.set_debug_http(True)
            br.set_debug_responses(True)
            br.set_debug_redirects(True)
            logger = logging.getLogger('mechanize')
            logger.addHandler(logging.StreamHandler(sys.stdout))
            logger.setLevel(logging.DEBUG)

        try:
            br.open(LOGIN_PAGE)
        except HTTPError, e:
            sys.exit('%d %s' % (e.code, e.msg))

        if not br.viewing_html():
            sys.exit('Unable to retrieve HTML for login page, has %s changed?' % HOST)
        try:
            br.select_form('Login')
        except mechanize.FormNotFoundError:
            sys.exit('Unable to locate login form, has %s changed?' % HOST)

        # The form action is set by some validation JavaScript, so we have to
        # blindly set it ourselves.
        br.form.action = LOGIN_FORM_ACTION
        br.form.set_all_readonly(False)
        br['SSN'] = customer_id
        br['PIN'] = pin

        try:
            r = br.submit()
        except HTTPError, e:
            sys.exit('%d %s' % (e.code, e.msg))

        return br

    def _get_fidelity_position_data(br, account_id):
        r = br.open(ACCOUNT_PAGE % account_id)
        strip_script = re.compile(r'<script\s+.*?</script>', re.I + re.S)
        soup = BeautifulSoup(strip_script.sub('', r.get_data()), "lxml")

        # This is the data structure we fill up with data about each position in the portfolio
        # Keyed to ticker for that security
        position_data = {}

        try:
            positions_div = soup.find(attrs={'class' : 'layout-open-positions-data-tables-region'})

        except:
            sys.exit('Unable to locate positions div')

        ticker_re = re.compile('^javascript:popWin\(\'https://fastquote.fidelity.com/webxpress/popup_frameset.phtml\?SID_VALUE_ID=')
        for posn in positions_div.find_all('tbody'):
            ticker = ''
            description = ''
            quantity = ''
            change_since_purchase = ''
            change_since_purchase_pct = ''

            posn_list = list(posn.find_all('td'))
            if len(posn_list) > 1:
                quantity = posn_list[2].contents[0].strip()

                cspl = posn_list[8].contents
                if len(cspl) > 1:
                    change_since_purchase = cspl[1].string.strip()

                csppl = posn_list[9].contents
                if len(csppl) > 1:
                    change_since_purchase_pct = csppl[1].string.strip()

            for elem in posn.find_all('td'):
                # First cell in the row has the ticker
                ticker_elem = elem.find(attrs={'href' : ticker_re})
                # ticker_elem = elem.find(attrs={'id' : 'anchor_{0}_DrillDown'.format(account_id)})
                if ticker_elem:
                    ticker_str = ticker_elem.string
                    if ticker_str:
                        ticker_str = ticker_str.strip()
                        if ticker_str != 'News':
                            ticker = ticker_str
                # Second cell in the row has the short and full description
                desc_elem = elem.find(attrs={'id' : 'fullDesc'})
                if desc_elem and len(desc_elem.contents):
                    desc_str = None
                    # Sometimes this has an anchor tag etc., but only if it's a row
                    #  with cash or something else that doesn't have a ticket
                    # So try to get string and we will be able to if there is a ticker
                    try:
                        desc_str = desc_elem.contents[0].string
                    except:
                        pass
                    if desc_str:
                        description = desc_str

            if ticker:
                position_data[ticker] = \
                    {
                        'description' : description,
                        'quantity' : quantity,
                        'change_since_purchase' : change_since_purchase,
                        'change_since_purchase_pct' : change_since_purchase_pct
                    }

        return position_data

    class FidelityPortfolioScraper(plugin_base.PluginBase):

        def __init__(self):
            """
    * `self.name = 'fidelity'`
    * `self.group = 'example'`
    * `self.schema = ['change_since_purchase', 'description',
                      'change_since_purchase_pct', 'quantity']`
    * `self.adds_keys = True`
    """
            self.name = 'fidelity'
            self.group = 'example'
            self.schema = ['change_since_purchase', 'description',
                           'change_since_purchase_pct', 'quantity']
            self.adds_keys = True

        def get_data(self, keys, args):
            """
    * `keys` - `list`. The list of keys to process.
    * `args` - `'list`. Must include, in order the users `customer_id`, `pin`,
    `account_id`, `customer_email`.

    Retrieves data for the portfolio identified by the args passed in.
    """
            customer_id, pin, account_id, customer_email = args
            br = _get_fidelity_logged_in_browser_session(customer_id, pin, account_id, customer_email)
            data = _get_fidelity_position_data(br, account_id)
            return data

        def parse_args(self, argv):
            """
    WARNING: This script requires that you pass your username, password
    and accountId. This script calls cleartext only to the login form.
    Once logged in subsequent HTML calls are https. That said, you are
    passing this in clear text when running this from your shell,
    so your system must be secure and that is YOUR responsibility. Also,
    of course, do NOT store this information unencryted in a plain text
    file anywhere, ever.

    * `[-c|--customer-id]` - Customer Id. Required.
    * `[-p|--pin]` - Customer PIN number or password. Required.
    * `[-a|--account-id]` - Customer account from which to retrieve position information. Required.
    * `[-e|--customer-email]` - Customer email. Required.
    """

            usage = """
    WARNING: This script requires that you pass your username, password
    and accountId. This script calls cleartext only to the login form.
    Once logged in subsequent HTML calls are https. That said, you are
    passing this in clear text when running this from your shell,
    so your system must be secure and that is YOUR responsibility. Also,
    of course, do NOT store this information unencryted in a plain text
    file anywhere, ever.

    [-c|--customer-id] - Customer Id. Required.
    [-p|--pin] - Customer PIN number or password. Required.
    [-a|--account-id] - Customer account from which to retrieve position information. Required.
    [-e|--customer-email] - Customer email. Required.
    """
            parser = OptionParser(usage=usage)

            parser.add_option("-c", "--customer-id",
                            action="store", dest="customer_id",
                            help="Customer Id of the customer to retrieve position data for. Required.")

            parser.add_option("-p", "--pin",
                            action="store", dest="pin",
                            help="Customer pin number. Required.")

            parser.add_option("-a", "--account-id",
                            action="store", dest="account_id",
                            help="Customer account from which to retrieve position information. Required.")

            parser.add_option("-e", "--customer-email",
                            action="store", dest="customer_email",
                            help="Customer account from which to retrieve position information. Required.")

            (opts, args) = parser.parse_args(argv)

            is_valid = True
            if not (opts.customer_id and \
                    opts.pin and \
                    opts.account_id and \
                    opts.customer_email):
                print "Invalid argument error."
                print """
    Your args:
      customer_id {0}
      pin {1}
      account_id {2}
      customer_email {3}""".format(opts.customer_id, opts.pin, opts.account_id, opts.customer_email)
                print usage
                is_valid = False

            # NOTE: the protocol for parse_args is to pass the returned args in a list
            return is_valid, [opts.customer_id, opts.pin, opts.account_id, opts.customer_email]

    plugin = FidelityPortfolioScraper

## Module variables

var ACCOUNT_PAGE

var DEBUG

var HOST

var LOGIN_FORM_ACTION

var LOGIN_PAGE

var PROXY

## Classes

class FidelityPortfolioScraper

Show source.

    class FidelityPortfolioScraper(plugin_base.PluginBase):

        def __init__(self):
            """
    * `self.name = 'fidelity'`
    * `self.group = 'example'`
    * `self.schema = ['change_since_purchase', 'description',
                      'change_since_purchase_pct', 'quantity']`
    * `self.adds_keys = True`
    """
            self.name = 'fidelity'
            self.group = 'example'
            self.schema = ['change_since_purchase', 'description',
                           'change_since_purchase_pct', 'quantity']
            self.adds_keys = True

        def get_data(self, keys, args):
            """
    * `keys` - `list`. The list of keys to process.
    * `args` - `'list`. Must include, in order the users `customer_id`, `pin`,
    `account_id`, `customer_email`.

    Retrieves data for the portfolio identified by the args passed in.
    """
            customer_id, pin, account_id, customer_email = args
            br = _get_fidelity_logged_in_browser_session(customer_id, pin, account_id, customer_email)
            data = _get_fidelity_position_data(br, account_id)
            return data

        def parse_args(self, argv):
            """
    WARNING: This script requires that you pass your username, password
    and accountId. This script calls cleartext only to the login form.
    Once logged in subsequent HTML calls are https. That said, you are
    passing this in clear text when running this from your shell,
    so your system must be secure and that is YOUR responsibility. Also,
    of course, do NOT store this information unencryted in a plain text
    file anywhere, ever.

    * `[-c|--customer-id]` - Customer Id. Required.
    * `[-p|--pin]` - Customer PIN number or password. Required.
    * `[-a|--account-id]` - Customer account from which to retrieve position information. Required.
    * `[-e|--customer-email]` - Customer email. Required.
    """

            usage = """
    WARNING: This script requires that you pass your username, password
    and accountId. This script calls cleartext only to the login form.
    Once logged in subsequent HTML calls are https. That said, you are
    passing this in clear text when running this from your shell,
    so your system must be secure and that is YOUR responsibility. Also,
    of course, do NOT store this information unencryted in a plain text
    file anywhere, ever.

    [-c|--customer-id] - Customer Id. Required.
    [-p|--pin] - Customer PIN number or password. Required.
    [-a|--account-id] - Customer account from which to retrieve position information. Required.
    [-e|--customer-email] - Customer email. Required.
    """
            parser = OptionParser(usage=usage)

            parser.add_option("-c", "--customer-id",
                            action="store", dest="customer_id",
                            help="Customer Id of the customer to retrieve position data for. Required.")

            parser.add_option("-p", "--pin",
                            action="store", dest="pin",
                            help="Customer pin number. Required.")

            parser.add_option("-a", "--account-id",
                            action="store", dest="account_id",
                            help="Customer account from which to retrieve position information. Required.")

            parser.add_option("-e", "--customer-email",
                            action="store", dest="customer_email",
                            help="Customer account from which to retrieve position information. Required.")

            (opts, args) = parser.parse_args(argv)

            is_valid = True
            if not (opts.customer_id and \
                    opts.pin and \
                    opts.account_id and \
                    opts.customer_email):
                print "Invalid argument error."
                print """
    Your args:
      customer_id {0}
      pin {1}
      account_id {2}
      customer_email {3}""".format(opts.customer_id, opts.pin, opts.account_id, opts.customer_email)
                print usage
                is_valid = False

            # NOTE: the protocol for parse_args is to pass the returned args in a list
            return is_valid, [opts.customer_id, opts.pin, opts.account_id, opts.customer_email]

#### Instance variables

var adds_keys

var group

var name

var schema

#### Methods

def __init__(

self)

- `self.name = 'fidelity'`
- `self.group = 'example'`
- `self.schema = ['change_since_purchase', 'description', 'change_since_purchase_pct', 'quantity']`
- `self.adds_keys = True`

Show source.

    def __init__(self):
        """
    elf.name = 'fidelity'`
    elf.group = 'example'`
    elf.schema = ['change_since_purchase', 'description',
                  'change_since_purchase_pct', 'quantity']`
    elf.adds_keys = True`
        self.name = 'fidelity'
        self.group = 'example'
        self.schema = ['change_since_purchase', 'description',
                       'change_since_purchase_pct', 'quantity']
        self.adds_keys = True

def get_data(

self, keys, args)

- `keys` - `list`. The list of keys to process.
- `args` - `'list`. Must include, in order the users `customer_id`, `pin`, `account_id`, `customer_email`.

Retrieves data for the portfolio identified by the args passed in.

Show source.

    def get_data(self, keys, args):
        """
    eys` - `list`. The list of keys to process.
    rgs` - `'list`. Must include, in order the users `customer_id`, `pin`,
    ount_id`, `customer_email`.
    ieves data for the portfolio identified by the args passed in.
        customer_id, pin, account_id, customer_email = args
        br = _get_fidelity_logged_in_browser_session(customer_id, pin, account_id, customer_email)
        data = _get_fidelity_position_data(br, account_id)
        return data

def parse_args(

self, argv)

WARNING: This script requires that you pass your username, password and accountId. This script calls cleartext only to the login form. Once logged in subsequent HTML calls are https. That said, you are passing this in clear text when running this from your shell, so your system must be secure and that is YOUR responsibility. Also, of course, do NOT store this information unencryted in a plain text file anywhere, ever.

- `[-c|--customer-id]` - Customer Id. Required.
- `[-p|--pin]` - Customer PIN number or password. Required.
- `[-a|--account-id]` - Customer account from which to retrieve position information. Required.
- `[-e|--customer-email]` - Customer email. Required.

Show source.

    def parse_args(self, argv):
        """
    ING: This script requires that you pass your username, password
    accountId. This script calls cleartext only to the login form.
     logged in subsequent HTML calls are https. That said, you are
    ing this in clear text when running this from your shell,
    our system must be secure and that is YOUR responsibility. Also,
    ourse, do NOT store this information unencryted in a plain text
     anywhere, ever.
    -c|--customer-id]` - Customer Id. Required.
    -p|--pin]` - Customer PIN number or password. Required.
    -a|--account-id]` - Customer account from which to retrieve position information. Required.
    -e|--customer-email]` - Customer email. Required.
        usage = """
    ING: This script requires that you pass your username, password
    accountId. This script calls cleartext only to the login form.
     logged in subsequent HTML calls are https. That said, you are
    ing this in clear text when running this from your shell,
    our system must be secure and that is YOUR responsibility. Also,
    ourse, do NOT store this information unencryted in a plain text
     anywhere, ever.
    --customer-id] - Customer Id. Required.
    --pin] - Customer PIN number or password. Required.
    --account-id] - Customer account from which to retrieve position information. Required.
    --customer-email] - Customer email. Required.
        parser = OptionParser(usage=usage)
        parser.add_option("-c", "--customer-id",
                        action="store", dest="customer_id",
                        help="Customer Id of the customer to retrieve position data for. Required.")
        parser.add_option("-p", "--pin",
                        action="store", dest="pin",
                        help="Customer pin number. Required.")
        parser.add_option("-a", "--account-id",
                        action="store", dest="account_id",
                        help="Customer account from which to retrieve position information. Required.")

        parser.add_option("-e", "--customer-email",
                        action="store", dest="customer_email",
                        help="Customer account from which to retrieve position information. Required.")
        (opts, args) = parser.parse_args(argv)

        is_valid = True
        if not (opts.customer_id and \
                opts.pin and \
                opts.account_id and \
                opts.customer_email):
            print "Invalid argument error."
            print """
     args:
    stomer_id {0}
    n {1}
    count_id {2}
    stomer_email {3}""".format(opts.customer_id, opts.pin, opts.account_id, opts.customer_email)
            print usage
            is_valid = False

        # NOTE: the protocol for parse_args is to pass the returned args in a list
        return is_valid, [opts.customer_id, opts.pin, opts.account_id, opts.customer_email]

class plugin

Show source.

    class FidelityPortfolioScraper(plugin_base.PluginBase):

        def __init__(self):
            """
    * `self.name = 'fidelity'`
    * `self.group = 'example'`
    * `self.schema = ['change_since_purchase', 'description',
                      'change_since_purchase_pct', 'quantity']`
    * `self.adds_keys = True`
    """
            self.name = 'fidelity'
            self.group = 'example'
            self.schema = ['change_since_purchase', 'description',
                           'change_since_purchase_pct', 'quantity']
            self.adds_keys = True

        def get_data(self, keys, args):
            """
    * `keys` - `list`. The list of keys to process.
    * `args` - `'list`. Must include, in order the users `customer_id`, `pin`,
    `account_id`, `customer_email`.

    Retrieves data for the portfolio identified by the args passed in.
    """
            customer_id, pin, account_id, customer_email = args
            br = _get_fidelity_logged_in_browser_session(customer_id, pin, account_id, customer_email)
            data = _get_fidelity_position_data(br, account_id)
            return data

        def parse_args(self, argv):
            """
    WARNING: This script requires that you pass your username, password
    and accountId. This script calls cleartext only to the login form.
    Once logged in subsequent HTML calls are https. That said, you are
    passing this in clear text when running this from your shell,
    so your system must be secure and that is YOUR responsibility. Also,
    of course, do NOT store this information unencryted in a plain text
    file anywhere, ever.

    * `[-c|--customer-id]` - Customer Id. Required.
    * `[-p|--pin]` - Customer PIN number or password. Required.
    * `[-a|--account-id]` - Customer account from which to retrieve position information. Required.
    * `[-e|--customer-email]` - Customer email. Required.
    """

            usage = """
    WARNING: This script requires that you pass your username, password
    and accountId. This script calls cleartext only to the login form.
    Once logged in subsequent HTML calls are https. That said, you are
    passing this in clear text when running this from your shell,
    so your system must be secure and that is YOUR responsibility. Also,
    of course, do NOT store this information unencryted in a plain text
    file anywhere, ever.

    [-c|--customer-id] - Customer Id. Required.
    [-p|--pin] - Customer PIN number or password. Required.
    [-a|--account-id] - Customer account from which to retrieve position information. Required.
    [-e|--customer-email] - Customer email. Required.
    """
            parser = OptionParser(usage=usage)

            parser.add_option("-c", "--customer-id",
                            action="store", dest="customer_id",
                            help="Customer Id of the customer to retrieve position data for. Required.")

            parser.add_option("-p", "--pin",
                            action="store", dest="pin",
                            help="Customer pin number. Required.")

            parser.add_option("-a", "--account-id",
                            action="store", dest="account_id",
                            help="Customer account from which to retrieve position information. Required.")

            parser.add_option("-e", "--customer-email",
                            action="store", dest="customer_email",
                            help="Customer account from which to retrieve position information. Required.")

            (opts, args) = parser.parse_args(argv)

            is_valid = True
            if not (opts.customer_id and \
                    opts.pin and \
                    opts.account_id and \
                    opts.customer_email):
                print "Invalid argument error."
                print """
    Your args:
      customer_id {0}
      pin {1}
      account_id {2}
      customer_email {3}""".format(opts.customer_id, opts.pin, opts.account_id, opts.customer_email)
                print usage
                is_valid = False

            # NOTE: the protocol for parse_args is to pass the returned args in a list
            return is_valid, [opts.customer_id, opts.pin, opts.account_id, opts.customer_email]

#### Instance variables

var adds_keys

Inheritance: `plugin`.`adds_keys`

var group

Inheritance: `plugin`.`group`

var name

Inheritance: `plugin`.`name`

var schema

Inheritance: `plugin`.`schema`

#### Methods

def __init__(

self)

Inheritance: `plugin`.`__init__`

- `self.name = 'fidelity'`
- `self.group = 'example'`
- `self.schema = ['change_since_purchase', 'description', 'change_since_purchase_pct', 'quantity']`
- `self.adds_keys = True`

Show source.

    def __init__(self):
        """
    elf.name = 'fidelity'`
    elf.group = 'example'`
    elf.schema = ['change_since_purchase', 'description',
                  'change_since_purchase_pct', 'quantity']`
    elf.adds_keys = True`
        self.name = 'fidelity'
        self.group = 'example'
        self.schema = ['change_since_purchase', 'description',
                       'change_since_purchase_pct', 'quantity']
        self.adds_keys = True

def get_data(

self, keys, args)

Inheritance: `plugin`.`get_data`

- `keys` - `list`. The list of keys to process.
- `args` - `'list`. Must include, in order the users `customer_id`, `pin`, `account_id`, `customer_email`.

Retrieves data for the portfolio identified by the args passed in.

Show source.

    def get_data(self, keys, args):
        """
    eys` - `list`. The list of keys to process.
    rgs` - `'list`. Must include, in order the users `customer_id`, `pin`,
    ount_id`, `customer_email`.
    ieves data for the portfolio identified by the args passed in.
        customer_id, pin, account_id, customer_email = args
        br = _get_fidelity_logged_in_browser_session(customer_id, pin, account_id, customer_email)
        data = _get_fidelity_position_data(br, account_id)
        return data

def parse_args(

self, argv)

Inheritance: `plugin`.`parse_args`

WARNING: This script requires that you pass your username, password and accountId. This script calls cleartext only to the login form. Once logged in subsequent HTML calls are https. That said, you are passing this in clear text when running this from your shell, so your system must be secure and that is YOUR responsibility. Also, of course, do NOT store this information unencryted in a plain text file anywhere, ever.

- `[-c|--customer-id]` - Customer Id. Required.
- `[-p|--pin]` - Customer PIN number or password. Required.
- `[-a|--account-id]` - Customer account from which to retrieve position information. Required.
- `[-e|--customer-email]` - Customer email. Required.

Show source.

    def parse_args(self, argv):
        """
    ING: This script requires that you pass your username, password
    accountId. This script calls cleartext only to the login form.
     logged in subsequent HTML calls are https. That said, you are
    ing this in clear text when running this from your shell,
    our system must be secure and that is YOUR responsibility. Also,
    ourse, do NOT store this information unencryted in a plain text
     anywhere, ever.
    -c|--customer-id]` - Customer Id. Required.
    -p|--pin]` - Customer PIN number or password. Required.
    -a|--account-id]` - Customer account from which to retrieve position information. Required.
    -e|--customer-email]` - Customer email. Required.
        usage = """
    ING: This script requires that you pass your username, password
    accountId. This script calls cleartext only to the login form.
     logged in subsequent HTML calls are https. That said, you are
    ing this in clear text when running this from your shell,
    our system must be secure and that is YOUR responsibility. Also,
    ourse, do NOT store this information unencryted in a plain text
     anywhere, ever.
    --customer-id] - Customer Id. Required.
    --pin] - Customer PIN number or password. Required.
    --account-id] - Customer account from which to retrieve position information. Required.
    --customer-email] - Customer email. Required.
        parser = OptionParser(usage=usage)
        parser.add_option("-c", "--customer-id",
                        action="store", dest="customer_id",
                        help="Customer Id of the customer to retrieve position data for. Required.")
        parser.add_option("-p", "--pin",
                        action="store", dest="pin",
                        help="Customer pin number. Required.")
        parser.add_option("-a", "--account-id",
                        action="store", dest="account_id",
                        help="Customer account from which to retrieve position information. Required.")

        parser.add_option("-e", "--customer-email",
                        action="store", dest="customer_email",
                        help="Customer account from which to retrieve position information. Required.")
        (opts, args) = parser.parse_args(argv)

        is_valid = True
        if not (opts.customer_id and \
                opts.pin and \
                opts.account_id and \
                opts.customer_email):
            print "Invalid argument error."
            print """
     args:
    stomer_id {0}
    n {1}
    count_id {2}
    stomer_email {3}""".format(opts.customer_id, opts.pin, opts.account_id, opts.customer_email)
            print usage
            is_valid = False

        # NOTE: the protocol for parse_args is to pass the returned args in a list
        return is_valid, [opts.customer_id, opts.pin, opts.account_id, opts.customer_email]

Documentation generated by `pdoc` 0.2.4. pdoc is in the public domain with the UNLICENSE.