Ejemplo n.º 1
0
 def __init__(self, payment, session=None, proxy={}):
     self.payment = payment
     self.session = session
     self.proxy = proxy
     self.config = Config()
     self.log = Log()
     self.code = GenerateCode()
     self.email_transport = EmailTransport()
     section_config = self.get_section_config()
     self.dashboard_url = section_config['dashboard_url']
     self.balance_url = section_config['balance_url']
     self.account_info_url = section_config['account_info_url']
     self.account_statement_url = section_config['account_statement_url']
     self.username = payment.get_username()
     self.password = payment.get_password()
     self.debug_mode = section_config['debug_mode']
     self.total_transactions = 0
     self.file = File()
Ejemplo n.º 2
0
 def __init__(self, payment, session=None, proxy={}):
     self.payment = payment
     self.session = session
     self.proxy = {}
     self.captcha = CaptchaResolver()
     self.config = Config()
     self.log = Log()
     self.history = History()
     self.code = GenerateCode()
     self.email_transport = EmailTransport()
     section_config = self.get_msb_config()
     self.username = payment.get_username()
     self.password = payment.get_password()
     self.home_url = section_config['home_url']
     self.login_url = section_config['login_url']
     self.account_list_url = section_config['account_list_url']
     self.account_info_url = section_config['account_info_url']
     self.debug_mode = section_config['debug_mode']
     self.total_transactions = 0
     self.max_attempt_login = 10
     self.max_validate_captcha = 10
     self.login_failed = 0
     self.captcha_failed = 0
Ejemplo n.º 3
0
 def __init__(self, payment, session=None, proxy={}):
     self.session = session
     self.proxy = proxy
     self.payment = payment
     self.config = Config()
     self.log = Log()
     techcombank = self.get_techcombank_config()
     self.email_transport = EmailTransport()
     self.login_url = techcombank['login_url']
     self.username = payment.get_username()
     self.password = payment.get_password()
     self.debug_mode = techcombank['debug_mode']
     self.total_transactions = 0
     self.history = History()
     self.code = GenerateCode()
 def __init__(self, payment, session=None, proxy={}):
     self.session = session
     self.proxy = proxy
     self.config = Config()
     self.log = Log()
     self.username = payment.get_username()
     self.password = payment.get_password()
     sacombank = self.get_config()
     self.email_transport = EmailTransport()
     self.corp_url = sacombank['corp_url']
     self.captcha = CaptchaResolver()
     self.debug_mode = sacombank['debug_mode']
     self.total_transactions = 0
     self.history = History()
     self.code = GenerateCode()
     self.max_attempt_login = 20
     self.login_failed = 0
     self.session = session
     self.proxy = proxy
     self.payment = payment
Ejemplo n.º 5
0
 def __init__(self, name=None, session=None, proxy={}):
     self.session = session
     self.proxy = proxy
     self.config = Config()
     self.log = Log()
     self.captcha = CaptchaResolver()
     section_config = self.get_section_config(name)
     self.email_transport = EmailTransport()
     self.home_url = section_config['home_url']
     self.login_url = section_config['login_url']
     self.username = section_config['username']
     self.password = section_config['password']
     self.debug_mode = section_config['debug_mode']
     self.total_transactions = 0
     self.max_attempt_login = 10
     self.max_validate_captcha = 10
     self.login_failed = 0
     self.captcha_failed = 0
     self.history = History()
     self.code = GenerateCode()
Ejemplo n.º 6
0
class Msb:
    def __init__(self, payment, session=None, proxy={}):
        self.payment = payment
        self.session = session
        self.proxy = {}
        self.captcha = CaptchaResolver()
        self.config = Config()
        self.log = Log()
        self.history = History()
        self.code = GenerateCode()
        self.email_transport = EmailTransport()
        section_config = self.get_msb_config()
        self.username = payment.get_username()
        self.password = payment.get_password()
        self.home_url = section_config['home_url']
        self.login_url = section_config['login_url']
        self.account_list_url = section_config['account_list_url']
        self.account_info_url = section_config['account_info_url']
        self.debug_mode = section_config['debug_mode']
        self.total_transactions = 0
        self.max_attempt_login = 10
        self.max_validate_captcha = 10
        self.login_failed = 0
        self.captcha_failed = 0

    def get_msb_config(self):
        msb = self.config.get_section_config('Msb')
        return msb

    def is_logged_in(self):
        session_requests = self.session
        token = session_requests.get_token()
        if token is None:
            return 0
        try:
            account_list_url = self.account_list_url
            payload = {
                'acctType': "'CA','SA','LN'",
                'status': "'ACTV','DORM','MATU'",
                'tokenNo': token,
                'lang': "vi_VN",
            }
            list_post = session_requests.post(account_list_url, payload)
            response = list_post.json()
            if response['status'] == '200':
                return 1
            return 0
        except Exception as e:
            if self.debug_mode == 'true':
                self.log.log(str(e), 'debug')
            return 0

    def is_debug(self):
        return self.debug_mode

    def perform_login(self):
        home_url = self.home_url
        login_url = self.login_url
        username = self.username
        password = self.password
        session_requests = self.session

        if self.is_logged_in() == 0:
            session_requests.set_tree(None)
            session_requests.init_session(self.proxy)
            session_requests.set_changing_proxy(1)
            result = session_requests.get(login_url)
            tree = html.fromstring(result.text)
            window_location = tree.xpath("//script/text()")[0]
            window_location = self.replace_all(window_location, {
                "window.location.href = '": "",
                "';": ""
            })
            login_redirect_url = str(home_url + window_location.strip())
            result = session_requests.get(login_redirect_url,
                                          dict(referer=login_redirect_url))
            tree = html.fromstring(result.text)
            window_location = tree.xpath("//script/text()")[0]
            window_location = self.replace_all(window_location, {
                "window.location.href = '": "",
                "';": ""
            })
            real_login_redirect_url = str(home_url + window_location.strip())
            result = session_requests.get(real_login_redirect_url,
                                          dict(referer=login_redirect_url))
            tree = html.fromstring(result.content)
            dse_session_id = tree.xpath(
                "//input[@name='dse_sessionId']/@value")[0]
            img_data = session_requests.get(
                home_url + '/IBSRetail/servlet/ImageServlet').content
            self.captcha.save_from_source(img_data)
            captcha_text = self.captcha.resolve(True)
            if self.validate_captcha(captcha_text) == 0:
                if self.captcha_failed < self.max_validate_captcha:
                    self.captcha_failed = self.captcha_failed + 1
                    return self.perform_login()
                else:
                    if self.debug_mode == 'true':
                        self.log.log(
                            'Can\'t validate captcha after ' +
                            str(self.captcha_failed) + ' times', 'debug')
                    self.captcha_failed = 0
                    return 0
            payload = {
                'dse_sessionId': dse_session_id,
                'dse_applicationId': -1,
                'dse_pageId': 2,
                'dse_operationName': 'retailUserLoginProc',
                'dse_errorPage': 'index.jsp',
                'dse_processorState': 'initial',
                'dse_nextEventName': 'start',
                'orderId': '',
                '_userNameEncode': username,
                '_userName': username,
                '_password': password,
                '_verifyCode': captcha_text
            }
            # Perform login
            login_post = session_requests.post(login_url + '/Request', payload)
            tree = html.fromstring(login_post.text)
            window_location = tree.xpath("//script/text()")[0]
            window_location = self.replace_all(window_location, {
                "window.location.href = '": "",
                "';": ""
            })
            redirect_url = str(home_url + window_location.strip())
            result = session_requests.get(redirect_url)
            tree = html.fromstring(result.content)
            username = tree.xpath("//p[@class='username']/text()")
            if len(username) > 0:
                token = self.get_token_from_string(str(result.content))
                session_requests.set_token(token)
                session_requests.set_changing_proxy(0)
                self.login_failed = 0
            else:
                self.login_failed = self.login_failed + 1
                if self.login_failed >= self.max_attempt_login:
                    if self.debug_mode == 'true':
                        self.log.log(
                            "Can not login Msb:" + self.payment.get_username +
                            " with " + str(self.max_attempt_login) +
                            " attempts", 'error')
                    return 0
                return self.perform_login()
        else:
            session_requests.set_changing_proxy(0)
            if self.debug_mode == 'true':
                self.log.log(
                    "Login Msb:" + self.payment.get_username +
                    " successfully by using old session", 'debug')
        token = session_requests.get_token()
        if token is None:
            return 0
        # with open('msb.html', 'w') as f:
        #     f.write(str(result.content))
        self.update_transactions(session_requests, token)

    def update_transactions(self, session_requests, token):
        account_list_url = self.account_list_url
        payload = {
            'acctType': "'CA','SA','LN'",
            'status': "'ACTV','DORM','MATU'",
            'tokenNo': token,
            'lang': "vi_VN",
        }
        list_post = session_requests.post(account_list_url, payload)
        try:
            response = list_post.json()
        except:
            response = {'status': 401}
        if response['status'] == '200':
            accounts = response['data']
            for account in accounts:
                account_name = account['acctName']
                account_number = account['acctNo']
                account_balance = account['availableBalance']
                msb_account = MsbAccount(account_name, account_number,
                                         self.payment.get_id())
                msb_account.set_balance(account_balance)
                msb_account.update_account()
                account_info_url = self.account_info_url
                current_date = self.history.get_current_update('maritimebank')
                payload = {
                    'acctNo': msb_account.get_number(),
                    'page': 1,
                    'tokenNo': token,
                    'lang': "vi_VN",
                    'fromDate': current_date.rstrip('\r\n'),
                    'toDate': time.strftime("%Y-%m-%d")
                }
                account_post = session_requests.post(account_info_url, payload)
                response = account_post.json()
                if response['status'] == '200':
                    histories = response['data']['history']
                    for history in histories:
                        self.save_transaction(msb_account, history)
        self.log.update_log('Maritimebank', self.username)
        self.history.set_current_update('maritimebank', "%Y-%m-%d")
        self.log.log(
            "Msb " + self.payment.get_type() + self.payment.get_username() +
            ": " + str(self.total_transactions) + ' transaction(s) created',
            'message')

    def save_transaction(self, account, history):
        trading_date = self.convert_trading_date(history['transferDate'])
        trading_time = history['transferTime']
        description = history['remark']
        if description is None:
            description = 'None'
        account_id = account.get_account_id()
        balance = float(history['amount'])
        if history['dcSign'] == 'D':
            balance = -balance
        reference_number = self.code.generate_code(description +
                                                   history['transferDate'])
        created_at = trading_date + ' ' + trading_time
        transaction = Transaction(account_id, reference_number, trading_date,
                                  balance, description, created_at)
        if transaction.save() == 1:
            self.total_transactions = self.total_transactions + 1
            self.email_transport.send_transaction_email(account, transaction)

    def replace_all(self, text, conditions):
        for i, j in conditions.items():
            text = text.replace(i, j)
        return text

    def validate_captcha(self, captcha):
        if re.match("^[a-zA-Z0-9]{4}$", captcha):
            return 1
        return 0

    def convert_trading_date(self, trading_date):
        date = datetime.strptime(trading_date, '%d/%m/%Y')
        return date.strftime('%Y-%m-%d')

    def get_token_from_string(self, string):
        token = re.search(
            "\'[a-zA-Z0-9]{8}-[a-zA-Z0-9]{4}-[a-zA-Z0-9]{4}-[a-zA-Z0-9]{4}-[a-zA-Z0-9]{12}",
            string)
        return token[0].replace("'", "")
Ejemplo n.º 7
0
class KlikbcaEnterprise:
    def __init__(self, payment, session=None, proxy={}):
        self.payment = payment
        self.session = session
        self.proxy = proxy
        self.config = Config()
        self.log = Log()
        self.code = GenerateCode()
        self.email_transport = EmailTransport()
        section_config = self.get_section_config()
        self.dashboard_url = section_config['dashboard_url']
        self.balance_url = section_config['balance_url']
        self.account_info_url = section_config['account_info_url']
        self.account_statement_url = section_config['account_statement_url']
        self.username = payment.get_username()
        self.password = payment.get_password()
        self.debug_mode = section_config['debug_mode']
        self.total_transactions = 0
        self.file = File()

    def get_section_config(self):
        section_config = self.config.get_section_config('KlikbcaEnterprise')
        return section_config

    def is_logged(self):
        session_requests = self.session
        account_info_url = self.account_info_url
        tree = session_requests.get_tree()
        if tree is None:
            return 0
        try:
            result = session_requests.get(account_info_url)
            tree = html.fromstring(result.content)
            account_info_text = tree.xpath(
                "//a[@href='menu_bar.htm']//b/text()")
            if "Account Information" in account_info_text:
                return 1
            return 0
        except:
            return 0

    def is_debug(self):
        return self.debug_mode

    def perform_login(self):
        dashboard_url = self.dashboard_url
        username = self.username
        password = self.password
        session_requests = self.session

        if self.is_logged() == 0:
            session_requests.set_tree(None)
            session_requests.init_session(self.proxy)
            session_requests.set_changing_proxy(1)
            payload = {
                'value(actions)': 'login',
                'value(user_id)': username,
                'value(user_ip)': self.proxy['ip'],
                'value(browser_info)': session_requests.get_user_agent(),
                'value(mobile)': 'false',
                'value(pswd)': password,
                'value(Submit)': 'LOGIN',
            }
            # Perform login
            try:
                login_post = session_requests.post(dashboard_url, payload)
                tree = html.fromstring(login_post.content)
                menu = tree.xpath("//frame[@name='menu']")
                if len(menu) > 0:
                    session_requests.set_tree(tree)
                    session_requests.set_changing_proxy(0)
            except:
                self.log.log(str(sys.exc_info()), 'debug')
                session_requests.set_changing_proxy(1)
        else:
            session_requests.set_changing_proxy(0)
            if self.debug_mode == 'true':
                self.log.log(
                    'Login ' + self.name +
                    ' successfully by using old session', 'debug')
        tree = session_requests.get_tree()
        if tree is None:
            return 0
        self.update_transactions(session_requests)

    def update_transactions(self, session_requests):
        balance_url = self.balance_url
        account_statement_url = self.account_statement_url
        current_date = self.get_current_update().split('/')
        now = datetime.now()
        payload = {
            'value(D1)': 0,
            'value(r1)': 1,
            'value(startDt)': str(current_date[0]),
            'value(startMt)': str(current_date[1]),
            'value(startYr)': str(current_date[2]),
            'value(endDt)': str(now.day),
            'value(endMt)': str(now.month),
            'value(endYr)': str(now.year),
            'value(fDt)': '',
            'value(tDt)': '',
            'value(submit1)': 'View Account Statement',
        }
        statement_post = session_requests.post(account_statement_url, payload)

        tree = html.fromstring(statement_post.content)
        account_number = None
        account_name = None
        account_number_row = \
            tree.xpath("//table[@bordercolor='#f0f0f0'][@width='90%']//tr[@bgcolor='#e0e0e0']/td/font/text()")

        if len(account_number_row) > 0:
            account_number = account_number_row[2]

        account_name_row = \
            tree.xpath("//table[@bordercolor='#f0f0f0'][@width='90%']//tr[@bgcolor='#f0f0f0']/td/font/text()")
        if len(account_name_row) > 0:
            account_name = account_name_row[2]

        account = KlikbcaAccount(account_name, account_number,
                                 self.payment.get_id())
        if account_number is not None and 'Period' not in account_number and 'Currency' not in account_name:
            balance_get = session_requests.post(
                balance_url, dict(referer=self.account_info_url))
            acc_tree = html.fromstring(balance_get.content)
            available_balance = acc_tree.xpath(
                "//table[@width='590']//tr/td/div[@align='right']/font/text()"
            )[0]
            available_balance = float(available_balance.strip().replace(
                ',', ''))
            account.set_balance(available_balance)
            account.update_account()
        transactions = tree.xpath(
            "//table[@bordercolor='#ffffff'][@width='100%']//tr")
        if len(transactions) > 0:
            del transactions[0]
        for row in transactions:
            columns = row.xpath("td")
            detail = []
            for column in columns:
                value = column.xpath("div/font")
                if len(value) > 0:
                    value = value[0]
                    value = value.text_content()
                    detail.append(value.strip())
            self.save_transaction(account, detail)
        self.set_current_update()
        self.log.update_log('Klikbca', self.username)
        self.log.log(
            str(self.total_transactions) + ' ' + self.name +
            ' transaction(s) created', 'message')

    def save_transaction(self, account, detail):
        now = datetime.now()
        year = str(now.year)
        if detail[0] == 'PEND':
            detail[0] = str(now.day) + '/' + str(now.month)
        trading_date = self.convert_trading_date(detail[0] + '/' + year)
        description = detail[1]
        account_id = account.get_account_id()
        if detail[4] == 'DB':
            balance = float('-' + detail[3].replace(',', ''))
        else:
            balance = float(detail[3].replace(',', ''))
        del detail[0]
        reference_number = self.code.generate_code('-'.join(detail))
        transaction = Transaction(account_id, reference_number, trading_date,
                                  balance, description)
        if transaction.save() == 1:
            self.total_transactions = self.total_transactions + 1
            self.email_transport.send_transaction_email(account, transaction)

    def convert_trading_date(self, trading_date):
        date = datetime.strptime(trading_date, '%d/%m/%Y')
        return date.strftime('%Y-%m-%d')

    def get_current_update(self):
        path = self.get_update_file()
        with open(path, 'r') as content_file:
            current_update = content_file.read()
        return current_update

    def set_current_update(self):
        path = self.get_update_file()
        current_date = time.strftime("%d/%m/%Y")
        date = datetime.strptime(current_date, "%d/%m/%Y")
        modified_date = date - timedelta(days=1)
        file = open(path, 'w')
        file.write(datetime.strftime(modified_date, "%d/%m/%Y"))
        file.close()

    def get_update_file(self):
        update_file = self.config.get_base_dir(
            'tmp') + 'klikbca_enterprise_update.txt'
        return update_file