Example #1
0
def run():
    systemLog = Log()
    threads = []
    sessions = {}
    proxy = Proxy().random_proxy()
    while 1:
        payments = Payment().get_payments()
        for p in payments:
            payment = Payment()
            payment = payment.set_payment(p)
            name = payment.get_name()
            type = payment.get_type()
            if payment.get_status() == 0:
                continue
            connector_module = 'connector.http.' + name.lower()
            if type == 'enterprise':
                connector_module += '_enterprise'
                name += 'Enterprise'
            module = importlib.import_module(connector_module)
            class_ = getattr(module, name)
            sessions[name] = Session(proxy)
            connector = class_(payment, sessions[name], proxy)
            if sessions[name].is_changing_proxy() == 1:
                systemLog.log('Need to change ' + name + ' proxy!', 'debug')
                proxy = Proxy().random_proxy()
            thread_name = "Thread " + str(
                payment.get_id()) + " " + name + " " + type
            thread = ThreadConnector(thread_name.upper(), connector, 5)
            thread.start()
            threads.append(thread)
        for t in threads:
            t.join(60)
Example #2
0
class ThreadConnector(threading.Thread):
    def __init__(self, name, connector, delay):
        threading.Thread.__init__(self)
        self.name = name
        self.connector = connector
        self.log = Log()
        self.delay = delay

    def run(self):
        connector = self.connector
        print(self.get_current_time() + "STARTING: " + self.name)
        spinner = Spinner()
        spinner.start()
        # Get lock to synchronize threads
        threadLock = threading.Lock()
        threadLock.acquire()
        try:
            connector.perform_login()
        except:
            if connector.is_debug() == 'true':
                self.log.log(str(sys.exc_info()), 'debug')
                print(str(sys.exc_info()))
            threadLock.release()
            spinner.stop()
            print(self.get_current_time() + "ENDING: " + self.name)
            raise
        # Free lock to release next thread
        threadLock.release()
        spinner.stop()
        print(self.get_current_time() + "ENDING: " + self.name)
        time.sleep(self.delay)

    def get_current_time(self):
        return "[" + time.strftime("%Y-%m-%d %H:%M:%S") + "]"
class SacombankEnterprise:
    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

    def get_config(self):
        config = self.config.get_section_config('SacombankEnterprise')
        return config

    def perform_login(self):
        corp_url = self.corp_url
        username = self.username
        password = self.password
        selenium = Selenium()
        if self.session.get_driver() is None:
            if self.session.get_last_driver(
            ) is None or self.session.get_last_driver() is 'Firefox':
                driver = selenium.get_firefox_driver(self.proxy)
                self.session.set_last_driver('Chrome')
            else:
                driver = selenium.get_firefox_driver(self.proxy)
                self.session.set_last_driver('Firefox')

            self.session.set_driver(driver)

            try:
                while True:
                    driver.get(corp_url)
                    online_banking = WebDriverWait(driver, 10).until(
                        EC.presence_of_element_located(
                            (By.XPATH,
                             "//a[contains(@class,'btn-ebanking')]")))
                    online_banking.click()
                    time.sleep(5)
                    try:
                        # Click to ignore banner
                        element = WebDriverWait(driver, 10).until(
                            EC.presence_of_element_located(
                                (By.XPATH, '//div[@id="pbanner"]')))
                        element.click()
                    except:
                        print('Banner not found')
                    # Get username input element
                    element = WebDriverWait(driver, 10).until(
                        EC.presence_of_element_located((
                            By.XPATH,
                            '//input[@id="AuthenticationFG.USER_PRINCIPAL"]')))
                    element.send_keys(username, Keys.ARROW_DOWN)
                    # Get captcha input element
                    captcha = self.get_captcha(driver)
                    element = WebDriverWait(driver, 10).until(
                        EC.presence_of_element_located((
                            By.XPATH,
                            '//input[@name="AuthenticationFG.VERIFICATION_CODE"]'
                        )))
                    element.send_keys(captcha)
                    # element.send_keys(Keys.RETURN)
                    # Get submit button element
                    element = WebDriverWait(driver, 10).until(
                        EC.presence_of_element_located(
                            (By.XPATH,
                             '//input[@id="STU_VALIDATE_CREDENTIALS"]')))
                    element.click()
                    time.sleep(5)
                    try:
                        element = WebDriverWait(driver, 10).until(
                            EC.presence_of_element_located(
                                (By.XPATH,
                                 '//span[@id="LoginHDisplay.Ra4.C1"]')))
                        element.click()
                    except:
                        print('Can not login')
                        driver.close()
                        return self.perform_login()
                    # Get password input element
                    element = WebDriverWait(driver, 10).until(
                        EC.presence_of_element_located(
                            (By.XPATH,
                             '//input[@name="AuthenticationFG.ACCESS_CODE"]')))
                    element.send_keys(password)
                    element.send_keys(Keys.RETURN)
                    time.sleep(5)
                    # Update Account Information
                    WebDriverWait(driver, 10).until(
                        EC.visibility_of_element_located(
                            (By.XPATH,
                             "//table[@id='HWListTable10072682']//tr/td")))
                    account_info = driver.find_elements_by_xpath(
                        "//table[@id='HWListTable10072682']//tr/td")
                    account_number = account_info[0].text.strip()
                    account_name = self.payment.get_username()
                    account_balance = float(
                        account_info[2].text.strip().replace('\n', '').replace(
                            'VND', '').replace('.', ''))
                    account = self.update_account(account_name, account_number,
                                                  account_balance,
                                                  self.payment.get_id())
                    # click to transaction menu
                    action_link = WebDriverWait(driver, 10).until(
                        EC.element_to_be_clickable(
                            (By.XPATH, "//a[contains(@name,'HREF_Ti_khon')]")))
                    hover_action = ActionChains(driver).move_to_element(
                        action_link)
                    hover_action.perform()
                    acc_link = WebDriverWait(driver, 10).until(
                        EC.element_to_be_clickable(
                            (By.XPATH,
                             "//a[contains(@id,'Ti-khon_Tng-quan-ti-khon')]")))
                    hover_trans = ActionChains(driver).move_to_element(
                        acc_link)
                    hover_trans.perform()
                    acc_link.click()
                    # time.sleep(5)
                    trans_link = WebDriverWait(driver, 10).until(
                        EC.element_to_be_clickable((
                            By.XPATH,
                            "//a[contains(@id,'HREF_PageConfigurationMaster_CACCTSW__1:AccountSummaryFG')]"
                        )))
                    trans_link.click()
                    try:
                        time.sleep(5)
                        WebDriverWait(driver, 5).until(
                            EC.visibility_of_element_located((
                                By.XPATH,
                                "//a[contains(@id,'PageConfigurationMaster_CACCTSW__1:errorlink1')]"
                            )))
                        driver.close()
                        self.history.set_current_update(
                            'sacombank_enterprise', "%d/%m/%Y")
                        self.session.set_driver(None)
                        self.log.log(
                            self.payment.get_name() + '-' +
                            self.payment.get_type() + '-' +
                            self.payment.get_username() + ": " +
                            "No transactions today", 'message')
                        return False
                    except:
                        print('ok')
                        time.sleep(1)
                    try:
                        WebDriverWait(driver, 10).until(
                            EC.visibility_of_element_located(
                                (By.XPATH,
                                 "//table[contains(@id,'HWListTable')]//tbody"
                                 )))
                        transactions = driver.find_elements_by_xpath(
                            "//table[contains(@id,'HWListTable')]//tbody[position() >= 0 and position() <= 10]"
                        )
                        for row in transactions:
                            columns = row.find_elements_by_xpath(".//tr/td")
                            self.save_transaction(account, columns)
                        self.log.update_log('Sacombank', self.username)
                        self.log.log(
                            self.payment.get_name() + '-' +
                            self.payment.get_type() + '-' +
                            self.payment.get_username() + ": " +
                            str(self.total_transactions) +
                            ' transaction(s) created', 'message')
                        self.session.set_changing_proxy(0)
                    except:
                        self.log.log(
                            self.payment.get_name() + '-' +
                            self.payment.get_type() + '-' +
                            self.payment.get_username() + ": " +
                            "Cannot load transactions", 'error')
                        exc_type, exc_obj, exc_tb = sys.exc_info()
                        fname = os.path.split(
                            exc_tb.tb_frame.f_code.co_filename)[1]
                        self.log.log(
                            str(exc_type) + '-' + fname + '-' +
                            str(exc_tb.tb_lineno), 'error')
                        self.session.set_changing_proxy(1)
            except:
                exc_info = sys.exc_info()
                traceback.print_exception(*exc_info)
                self.log.log(
                    self.payment.get_name() + '-' + self.payment.get_type() +
                    '-' + self.payment.get_username() + ': ' +
                    str(sys.exc_info()), 'debug')

            driver.close()
            self.history.set_current_update('sacombank_enterprise', "%d/%m/%Y")
            self.session.set_driver(None)

    def save_transaction(self, account, detail):
        reference_number = detail[0].text
        trading_date = self.convert_trading_date(detail[2].text)
        account_id = account.get_account_id()
        description = detail[3].text
        if detail[6].text is not '':
            balance = -float(detail[6].text.replace(',', '').replace(
                ' ', '').replace('VND', ''))
        else:
            balance = float(detail[7].text.replace(',', '').replace(
                ' ', '').replace('VND', ''))
        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 get_captcha(self, driver):
        img_data = WebDriverWait(driver, 10).until(
            EC.presence_of_element_located(
                (By.XPATH, "//img[@id='IMAGECAPTCHA']")))
        img_file = img_data.screenshot_as_png
        self.captcha.save_from_source(img_file, 'png')
        captcha_text = self.captcha.resolve(True)
        if re.match("^[0-9]{4}$", captcha_text):
            return captcha_text
        reload_captcha = WebDriverWait(driver, 10).until(
            EC.visibility_of_element_located(
                (By.XPATH, "//img[@id='TEXTIMAGE']")))
        reload_captcha.click()
        return self.get_captcha(driver)

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

    def update_account(self, name, number, balance, payment_id):
        account = SacombankAccount(name, number, payment_id)
        account.set_balance(balance)
        account.update_account()
        return account

    def is_debug(self):
        return self.debug_mode
Example #4
0
class AcbEnterprise:
    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()
        acb = self.get_config()
        self.email_transport = EmailTransport()
        self.corp_url = acb['corp_url']
        self.captcha = CaptchaResolver()
        self.debug_mode = acb['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

    def get_config(self):
        config = self.config.get_section_config('AcbEnterprise')
        return config

    def perform_login(self):
        corp_url = self.corp_url
        username = self.username
        password = self.password
        selenium = Selenium()
        if self.session.get_driver() is None:
            if self.session.get_last_driver(
            ) is None or self.session.get_last_driver() is 'Firefox':
                driver = selenium.get_firefox_driver(self.proxy)
                self.session.set_last_driver('Chrome')
            else:
                driver = selenium.get_firefox_driver(self.proxy)
                self.session.set_last_driver('Firefox')

            self.session.set_driver(driver)

            try:
                driver.get(corp_url)
                online_banking = WebDriverWait(driver, 10).until(
                    EC.presence_of_element_located(
                        (By.XPATH, "//a[contains(@href,'obk/login.jsp')]")))
                online_banking.click()
                time.sleep(5)
                captcha = self.get_captcha(driver)
                # Get username input element
                element = WebDriverWait(driver, 10).until(
                    EC.presence_of_element_located(
                        (By.XPATH, '//input[@name="UserName"]')))
                element.send_keys(username, Keys.ARROW_DOWN)
                # Get password input element
                element = WebDriverWait(driver, 10).until(
                    EC.presence_of_element_located(
                        (By.XPATH, '//input[@name="PassWord"]')))
                driver.execute_script(
                    'arguments[0].style = ""; arguments[0].style.display = "block"; arguments[0].style.visibility = "visible";',
                    element)
                element.send_keys(password)
                # Get captcha input element
                element = WebDriverWait(driver, 10).until(
                    EC.presence_of_element_located(
                        (By.XPATH, '//input[@name="SecurityCode"]')))
                driver.execute_script(
                    'arguments[0].style = ""; arguments[0].style.display = "block"; arguments[0].style.visibility = "visible";',
                    element)
                element.send_keys(captcha)
                time.sleep(2)
                # Get submit button element
                element = WebDriverWait(driver, 10).until(
                    EC.presence_of_element_located(
                        (By.XPATH, '//a[@id="button-dangnhap"]')))
                element.click()
                time.sleep(3)
                try:
                    # Update Account Information
                    WebDriverWait(driver, 10).until(
                        EC.visibility_of_element_located(
                            (By.XPATH, "//table[@id='table']//tr/td")))
                    account_info = driver.find_elements_by_xpath(
                        "//table[@id='table']//tr/td")
                    account_number = account_info[0].text.strip()
                    account_name = self.payment.get_username()
                    account_balance = float(
                        account_info[2].text.strip().replace(' ', '').replace(
                            '(VND)', '').replace('.', ''))
                    account = self.update_account(account_name, account_number,
                                                  account_balance,
                                                  self.payment.get_id())
                except:
                    driver.close()
                    return self.perform_login()

                # click to transaction menu

                element = WebDriverWait(driver, 10).until(
                    EC.presence_of_element_located(
                        (By.XPATH, "//a[contains(@class,'acc_bold')]")))
                element.click()
                time.sleep(3)

                view_link = WebDriverWait(driver, 10).until(
                    EC.element_to_be_clickable(
                        (By.XPATH,
                         "//input[contains(@onclick,'OutPrintByDate')]")))
                view_link.click()
                try:
                    window_after = driver.window_handles[1]
                    driver.switch_to_window(window_after)
                    WebDriverWait(driver, 10).until(
                        EC.visibility_of_element_located(
                            (By.XPATH, "//table[@id='table1']//tbody")))
                    transactions = driver.find_elements_by_xpath(
                        "//table[@id='table1']//tbody/tr[position() >= 0 and position() <= 10]"
                    )
                    for row in transactions:
                        columns = row.find_elements_by_xpath("td")
                        self.save_transaction(account, columns)
                    self.log.update_log('Acb', self.username)
                    self.log.log(
                        self.payment.get_name() + '-' +
                        self.payment.get_type() + '-' +
                        self.payment.get_username() + ": " +
                        str(self.total_transactions) +
                        ' transaction(s) created', 'message')
                    self.session.set_changing_proxy(0)
                    driver.close()
                except:
                    self.log.log(
                        self.payment.get_name() + '-' +
                        self.payment.get_type() + '-' +
                        self.payment.get_username() + ": " +
                        "Cannot load transactions", 'error')
                    exc_type, exc_obj, exc_tb = sys.exc_info()
                    fname = os.path.split(
                        exc_tb.tb_frame.f_code.co_filename)[1]
                    self.log.log(
                        self.payment.get_name() + '-' +
                        self.payment.get_type() + '-' +
                        self.payment.get_username() + ': ' +
                        str(sys.exc_info()), 'debug')
                    self.log.log(
                        str(exc_type) + '-' + fname + '-' +
                        str(exc_tb.tb_lineno), 'error')
                    self.session.set_changing_proxy(1)
            except:
                exc_type, exc_obj, exc_tb = sys.exc_info()
                fname = os.path.split(exc_tb.tb_frame.f_code.co_filename)[1]
                self.log.log(
                    self.payment.get_name() + '-' + self.payment.get_type() +
                    '-' + self.payment.get_username() + ': ' +
                    str(sys.exc_info()), 'debug')
                self.log.log(
                    str(exc_type) + '-' + fname + '-' + str(exc_tb.tb_lineno),
                    'error')
                self.session.set_changing_proxy(1)
            driver.quit()
            self.history.set_current_update('acb_enterprise', "%d/%m/%Y")
            self.session.set_driver(None)

    def save_transaction(self, account, detail):
        if len(detail) < 4:
            return False
        trading_date = self.convert_trading_date(detail[0].text)
        reference_number = detail[1].text
        account_id = account.get_account_id()
        if detail[3].text.strip() is not '':
            balance = -float(detail[3].text.strip().replace('.', ''))
        else:
            balance = float(detail[4].text.strip().replace('.', ''))
        description = detail[2].text
        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 get_captcha(self, driver):
        img_data = WebDriverWait(driver, 10).until(
            EC.presence_of_element_located(
                (By.XPATH, "//img[@src='Captcha.jpg']")))
        img_file = img_data.screenshot_as_png
        self.captcha.save_from_source(img_file, 'png')
        captcha_text = self.captcha.resolve(True)
        if re.match("^[a-zA-Z0-9]{5}$", captcha_text):
            return captcha_text
        driver.refresh()
        return self.get_captcha(driver)

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

    def update_account(self, name, number, balance, payment_id):
        account = AcbAccount(name, number, payment_id)
        account.set_balance(balance)
        account.update_account()
        return account

    def is_debug(self):
        return self.debug_mode
Example #5
0
class Vietcombank:
    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()
        vietcombank = self.get_vietcombank_config()
        self.email_transport = EmailTransport()
        self.login_url = vietcombank['login_url']
        self.captcha = CaptchaResolver()
        self.debug_mode = vietcombank['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

    def get_vietcombank_config(self):
        vietcombank = self.config.get_section_config('Vietcombank')
        return vietcombank

    def perform_login(self):
        login_url = self.login_url
        username = self.username
        password = self.password
        selenium = Selenium()
        if self.session.get_driver() is None:
            if self.session.get_last_driver() is None or self.session.get_last_driver() is 'Firefox':
                driver = selenium.get_firefox_driver(self.proxy)
                self.session.set_last_driver('Chrome')
            else:
                driver = selenium.get_firefox_driver(self.proxy)
                self.session.set_last_driver('Firefox')

            self.session.set_driver(driver)

            try:
                driver.get(login_url)
                # Get username input element
                element = WebDriverWait(driver, 10).until(
                    EC.presence_of_element_located(
                        (By.XPATH, '//input[@name="username"]'))
                )
                element.send_keys(username)
                # Get password input element
                element = WebDriverWait(driver, 10).until(
                    EC.presence_of_element_located(
                        (By.XPATH, '//input[@name="pass"]'))
                )
                element.send_keys(password)
                while True:
                    captcha = self.get_captcha(driver)
                    # Get captcha input element
                    element = WebDriverWait(driver, 10).until(
                        EC.presence_of_element_located(
                            (By.XPATH, '//input[@name="captcha"]'))
                    )
                    element.send_keys(captcha)
                    # element.send_keys(Keys.RETURN)
                    # Get submit button element
                    element = WebDriverWait(driver, 10).until(
                        EC.presence_of_element_located(
                            (By.XPATH, '//button[@id="btnLogin"]'))
                    )
                    element.click()
                    time.sleep(5)
                    # click to account menu
                    try:
                        account_link = WebDriverWait(driver, 10).until(
                            EC.element_to_be_clickable(
                                (By.XPATH,
                                 "//a[contains(@class,'has-link-arrow tk')]//div[contains(@class,'item-link-arrow')]"))
                        )
                        account_link.click()
                        time.sleep(5)
                        self.login_failed = 0
                        break
                    except:
                        self.login_failed += 1
                        if self.login_failed > self.max_attempt_login:
                            driver.close()
                            self.history.set_current_update('vietcombank', "%d/%m/%Y")
                            self.session.set_driver(None)

                # Update account information
                try:
                    driver.execute_script("window.scrollTo(0, 800);")
                    time.sleep(5)
                    search_button = WebDriverWait(driver, 10).until(
                        EC.element_to_be_clickable(
                            (By.XPATH,
                             "//a[contains(@class,'ubtn ubg-primary ubtn-md ripple')]/span[contains(text(),'Tìm kiếm')]"))
                    )
                    search_button.click()
                    WebDriverWait(driver, 15).until(
                        EC.visibility_of_element_located(
                            (By.XPATH, "//form[@id='ChiTietTaiKhoan']"))
                    )
                    info = driver.find_element_by_xpath(
                        "//div[@class='list-info']")
                    number = info.find_element_by_xpath("//select/option").get_attribute('value')
                    name = info.find_elements_by_xpath(
                        "//div[contains(@class,'list-info-txt-main')]")[1].text
                    balance = float(info.find_elements_by_xpath(
                        "//div[contains(@class,'list-info-txt-main')]")[2].text.replace(
                        ',', '').replace(' VND', ''))
                    account = self.update_account(name, number, balance, self.payment.get_id())
                    transactions = driver.find_elements_by_xpath(
                        "//div[@id='toanbo']//div[contains(@class,'list-info-item')]")
                    for row in transactions:
                        columns = row.find_elements_by_xpath(".//div[contains(@class,'td-xs')]")
                        self.save_transaction(account, columns)
                    self.log.update_log('Vietcombank', self.username)
                    self.log.log("Vcb " + self.payment.get_type() + self.payment.get_username() + ": " + str(
                        self.total_transactions) + ' transaction(s) created', 'message')
                    self.session.set_changing_proxy(0)
                except:
                    self.log.log(
                        "Vcb " + self.payment.get_type() + self.payment.get_username() + ": " + "Cannot load transactions",
                        'error')
                    self.log.log(str(sys.exc_info()), 'error')
                    self.session.set_changing_proxy(1)


            except:
                exc_info = sys.exc_info()
                traceback.print_exception(*exc_info)
                self.log.log(str(sys.exc_info()), 'debug')

            driver.close()
            self.history.set_current_update('vietcombank', "%d/%m/%Y")
            self.session.set_driver(None)

    def save_transaction(self, account, detail):
        trading_date = self.convert_trading_date(
            detail[0].find_element_by_xpath("div[contains(@class,'list-info-txt-sub')]").text)
        description = detail[0].find_element_by_xpath("div[contains(@class,'list-info-txt-main')]").text
        account_id = account.get_account_id()
        reference_number = detail[1].find_element_by_xpath("div[contains(@class,'list-info-txt-sub')]").text.replace(
            'Số tham chiếu: ', '')
        balance = float(
            detail[1].find_element_by_xpath("div[contains(@class,'list-info-txt-main')]").text.replace(',', '').replace(
                ' ', ''))
        transaction = Transaction(account_id, reference_number, trading_date, balance, description)
        print(reference_number)
        if transaction.save() == 1:
            self.total_transactions = self.total_transactions + 1
            self.email_transport.send_transaction_email(account, transaction)

    def get_captcha(self, driver):
        img_data = WebDriverWait(driver, 10).until(
            EC.presence_of_element_located(
                (By.XPATH, "//div[contains(@class,'captcha')]//img"))
        )
        img_file = img_data.screenshot_as_png
        self.captcha.save_from_source(img_file, 'png')
        captcha_text = self.captcha.resolve(True)
        if re.match("^[a-zA-Z0-9]{5}$", captcha_text):
            return captcha_text

        ic_reload = WebDriverWait(driver, 10).until(
            EC.presence_of_element_located(
                (By.XPATH, "//img[contains(@src,'ic_reload')]"))
        )
        ic_reload.click()
        return self.get_captcha(driver)

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

    def update_account(self, name, number, balance, payment_id):
        account = VietcombankAccount(name, number, payment_id)
        account.set_balance(balance)
        account.update_account()
        return account

    def get_config(self, name=None):
        if name is None:
            name = 'Vietcombank'
        vietcombank = self.config.get_section_config(name)
        return vietcombank

    def is_debug(self):
        return self.debug_mode
class TechcombankEnterprise:
    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()
        self.max_attempt_login = 20
        self.login_failed = 0

    def perform_login(self):
        login_url = self.login_url
        username = self.username
        password = self.password
        selenium = Selenium()
        if self.session.get_driver() is None:
            if self.session.get_last_driver(
            ) is None or self.session.get_last_driver() is 'Firefox':
                driver = selenium.get_firefox_driver(self.proxy)
                self.session.set_last_driver('Chrome')
            else:
                driver = selenium.get_firefox_driver(self.proxy)
                self.session.set_last_driver('Firefox')

            self.session.set_driver(driver)

            try:
                while 1:
                    driver.get(login_url)
                    window_before = driver.window_handles[0]
                    # Get username input element
                    element = WebDriverWait(driver, 10).until(
                        EC.presence_of_element_located(
                            (By.XPATH, '//input[@name="signOnName"]')))
                    element.send_keys(username)
                    time.sleep(2)
                    # element.send_keys(Keys.RETURN)
                    element = WebDriverWait(driver, 10).until(
                        EC.presence_of_element_located(
                            (By.XPATH, '//input[@name="password"]')))
                    # Get password input element
                    element.send_keys(password)
                    time.sleep(2)
                    # element.send_keys(Keys.RETURN)
                    # Get submit button element
                    element = WebDriverWait(driver, 10).until(
                        EC.presence_of_element_located(
                            (By.XPATH, '//input[@type="submit"]')))
                    element.click()
                    try:
                        WebDriverWait(driver, 10).until(
                            EC.visibility_of_element_located(
                                (By.XPATH,
                                 "//div[contains(@id,'pane__FRAME')]")))
                        self.login_failed = 0
                        break
                    except:
                        self.login_failed += 1
                        if self.login_failed > self.max_attempt_login:
                            driver.close()
                            self.history.set_current_update(
                                'techcombank_enterprise', "%d/%m/%Y")
                            self.session.set_driver(None)

                # Update account information
                try:
                    search = WebDriverWait(driver, 30).until(
                        EC.visibility_of_element_located(
                            (By.XPATH,
                             "//img[contains(@src,'drilldown/View.png')]")))
                    info = driver.find_elements_by_xpath(
                        "//table[contains(@id,'datadisplay_ACCOUNT')]//tr/td")
                    number = info[0].text.split('-')[0].strip()
                    name = info[1].text
                    balance = float(info[3].text.replace(',', ''))
                    account = self.update_account(name, number, balance,
                                                  self.payment.get_id())
                    search.click()
                    window_after = driver.window_handles[1]
                    driver.switch_to_window(window_after)
                    WebDriverWait(driver, 60).until(
                        EC.visibility_of_element_located(
                            (By.XPATH,
                             "//table[contains(@id,'datadisplay_DATA')]")))
                    transactions = driver.find_elements_by_xpath(
                        "//table[contains(@id,'datadisplay_DATA')]//tr")
                    for row in transactions:
                        columns = row.find_elements_by_xpath("td")
                        self.save_transaction(account, columns)
                    self.log.update_log('Techcombank', self.username)
                    self.log.log(
                        self.payment.get_name() + '-' +
                        self.payment.get_type() + '-' +
                        self.payment.get_username() + ": " +
                        str(self.total_transactions) +
                        ' transaction(s) created', 'message')
                    self.session.set_changing_proxy(0)
                except:
                    self.log.log(
                        self.payment.get_name() + '-' +
                        self.payment.get_type() + '-' +
                        self.payment.get_username() + ": " +
                        "Cannot load transactions", 'error')
                    exc_type, exc_obj, exc_tb = sys.exc_info()
                    fname = os.path.split(
                        exc_tb.tb_frame.f_code.co_filename)[1]
                    self.log.log(
                        str(exc_type) + '-' + fname + '-' +
                        str(exc_tb.tb_lineno), 'error')
                    self.session.set_changing_proxy(1)

            except:
                exc_info = sys.exc_info()
                traceback.print_exception(*exc_info)
                self.log.log(str(sys.exc_info()), 'debug')
            driver.quit()
            self.history.set_current_update('techcombank_enterprise',
                                            "%d/%m/%Y")
            self.session.set_driver(None)

    def save_transaction(self, account, detail):
        trading_date = self.convert_trading_date(detail[0].text)
        reference_number = detail[1].text
        description = detail[3].text
        account_id = account.get_account_id()

        if detail[4].text is not '':
            balance = float(detail[4].text.replace(',', '').replace(' ', ''))
        else:
            balance = float(detail[5].text.replace(',', '').replace(' ', ''))
        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 update_account(self, name, number, balance, payment_id):
        account = TechcombankAccount(name, number, payment_id)
        account.set_balance(balance)
        account.update_account()
        return account

    def get_techcombank_config(self):

        techcombank = self.config.get_section_config('TechcombankEnterprise')
        return techcombank

    def is_debug(self):
        return self.debug_mode
Example #7
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("'", "")
Example #8
0
class Msb:
    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()

    def is_debug(self):
        return self.debug_mode

    def get_section_config(self, name=None):
        if name is None:
            name = 'Msb'
        section_config = self.config.get_section_config(name)
        return section_config

    def perform_login(self):
        login_url = self.login_url
        username = self.username
        password = self.password
        selenium = Selenium()
        if self.session.get_driver() is None:
            if self.session.get_last_driver() is None or self.session.get_last_driver() is 'Chrome':
                driver = selenium.get_firefox_driver(self.proxy)
                self.session.set_last_driver('Firefox')
            else:
                driver = selenium.get_chrome_driver(self.proxy)
                self.session.set_last_driver('Chrome')

            self.session.set_driver(driver)
            try:
                driver.get(login_url)
                # Get username input element
                element = WebDriverWait(driver, 10).until(
                    EC.presence_of_element_located(
                        (By.XPATH, '//input[@name="_userName"]'))
                )
                element.send_keys(username)

                # Get password input element
                element = WebDriverWait(driver, 10).until(
                    EC.presence_of_element_located(
                        (By.XPATH, '//input[@name="_passwordS"]'))
                )

                element.send_keys(password)

                captcha = self.get_captcha(driver)
                print(captcha)
                exit(111111)
                # Get captcha input element
                element = WebDriverWait(driver, 10).until(
                    EC.presence_of_element_located(
                        (By.XPATH, '//input[@name="_verifyCode"]'))
                )
                element.send_keys(captcha)

                # element.send_keys(Keys.RETURN)
                # Get submit button element
                element = WebDriverWait(driver, 10).until(
                    EC.presence_of_element_located(
                        (By.XPATH, '//button[@id="loginBtn"]'))
                )
                element.click()
                # click to account menu
                time.sleep(5)
                account_link = WebDriverWait(driver, 10).until(
                    EC.visibility_of_element_located(
                        (By.XPATH, '//a[@name="AI.QCK.ACCOUNT"]'))
                )
                retry_account = 0

                while retry_account < 3:
                    try:
                        account_link.click()
                        # Click to view last 10 transactions
                        time.sleep(5)
                        current_date = self.history.get_current_update('techcombank')
                        from_date = driver.find_elements_by_xpath(
                            "//input[@id='fieldName:START.DATE']")[0]
                        from_date.send_keys(current_date, Keys.ENTER)
                        time.sleep(5)
                        to_date = driver.find_elements_by_xpath(
                            "//input[@id='fieldName:END.DATE']")[0]
                        to_date.send_keys(current_date)
                        time.sleep(5)
                        button = driver.find_elements_by_xpath(
                            '//a[@title="Xem giao dịch"]')[1]
                        button.click()
                        time.sleep(5)
                        button = driver.find_elements_by_xpath(
                            '//a[@title="Xem giao dịch"]')[1]
                        button.click()
                        break
                    except:
                        self.log.log("Techcombank: Re-click to account", 'debug')
                        self.log.log(str(sys.exc_info()), 'debug')
                        retry_account = retry_account + 1

                # Update account information
                try:
                    WebDriverWait(driver, 15).until(
                        EC.visibility_of_element_located(
                            (By.XPATH, "//table[@id='enqheader']//tr[position()>1 and position()<4]"))
                    )
                    info = driver.find_elements_by_xpath(
                        "//table[@id='enqheader']//tr[position()>1 and position()<4]")
                    number = info[0].find_elements_by_xpath("td")[1].text
                    balance = float(info[0].find_elements_by_xpath("td")[3].text.replace(',', ''))
                    name = info[1].find_elements_by_xpath("td")[1].text
                    account = self.update_account(name, number, balance)
                    transactions = driver.find_elements_by_xpath(
                        "//table[starts-with(@id,'datadisplay_MainBody')]//tr")
                    for row in transactions:
                        columns = row.find_elements_by_xpath("td")
                        self.save_transaction(account, columns)
                    self.log.update_log('Techcombank', self.username)
                    self.log.log(str(self.total_transactions) + ' Tcb transaction(s) created', 'message')
                    self.session.set_changing_proxy(0)
                except:
                    self.log.log("Techcombank: Cannot load transactions", 'error')
                    self.log.log(str(sys.exc_info()), 'error')
                    self.session.set_changing_proxy(1)


            except:
                exc_info = sys.exc_info()
                traceback.print_exception(*exc_info)
                self.log.log(str(sys.exc_info()), 'debug')

        driver.close()
        self.history.set_current_update('techcombank', "%d/%m/%Y")
        self.session.set_driver(None)

    def get_captcha(self, driver):
        img_data = driver.find_element_by_id('safecode').screenshot_as_png
        self.captcha.save_from_source(img_data)
        captcha_text = self.captcha.resolve(True)
        if re.match("^[a-zA-Z0-9]{4}$", captcha_text):
            return captcha_text
        return self.get_captcha(driver)
Example #9
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
class VietcombankEnterprise:
    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()
        vietcombank = self.get_vietcombank_config()
        self.email_transport = EmailTransport()
        self.login_url = vietcombank['login_url']
        self.captcha = CaptchaResolver()
        self.debug_mode = vietcombank['debug_mode']
        self.total_transactions = 0
        self.history = History()
        self.code = GenerateCode()
        self.max_attempt_login = 5
        self.login_failed = 0
        self.session = session
        self.proxy = proxy
        self.payment = payment

    def get_vietcombank_config(self):
        vietcombank = self.config.get_section_config('VietcombankEnterprise')
        return vietcombank

    def perform_login(self):
        login_url = self.login_url
        selenium = Selenium()
        if self.session.get_driver() is None:
            if self.session.get_last_driver(
            ) is None or self.session.get_last_driver() is 'Firefox':
                driver = selenium.get_firefox_driver(self.proxy)
                self.session.set_last_driver('Chrome')
            else:
                driver = selenium.get_firefox_driver(self.proxy)
                self.session.set_last_driver('Firefox')

            self.session.set_driver(driver)

            try:
                driver.get(login_url)
                if self.solve_captcha(driver) is False:
                    driver.close()
                    return False
                time.sleep(5)
                # Update account information
                try:
                    # driver.execute_script("window.scrollTo(0, 800);")
                    WebDriverWait(driver, 10).until(
                        EC.visibility_of_element_located(
                            (By.XPATH, "//tbody[@id='dstkdd-tbody']")))
                    account_info = driver.find_elements_by_xpath(
                        "//tbody[@id='dstkdd-tbody']/tr/td")
                    account_name = self.payment.get_username()
                    account_number = account_info[0].text.strip()
                    account_balance = float(
                        account_info[3].text.strip().replace(' VND',
                                                             '').replace(
                                                                 ',', ''))
                    account = self.update_account(account_name, account_number,
                                                  account_balance,
                                                  self.payment.get_id())
                    WebDriverWait(driver, 10).until(
                        EC.presence_of_element_located((
                            By.XPATH,
                            "//a[contains(@href,'/IbankingCorp/Accounts/TransactionDetail.aspx')]"
                        )))
                    reference_links = driver.find_elements_by_xpath(
                        "//a[contains(@href,'/IbankingCorp/Accounts/TransactionDetail.aspx')]"
                    )
                    reference_links[2].click()
                    #view_link = WebDriverWait(driver, 10).until(
                    #    EC.presence_of_element_located(
                    #        (By.XPATH, "//a[contains(@id,'bdsdList-tab')]"))
                    #)
                    #driver.execute_script("arguments[0].scrollIntoView();", view_link)
                    #time.sleep(5)
                    #view_link.click()
                    tran_by_date = WebDriverWait(driver, 10).until(
                        EC.element_to_be_clickable(
                            (By.XPATH, "//a[contains(@id,'TransByDate')]")))
                    #tran_by_date.click()
                    driver.execute_script("arguments[0].click();",
                                          tran_by_date)
                    time.sleep(5)
                    WebDriverWait(driver, 10).until(
                        EC.presence_of_element_located(
                            (By.XPATH, "//table[@id='tbTranHis']")))
                    trans_foot = WebDriverWait(driver, 10).until(
                        EC.presence_of_element_located(
                            (By.XPATH, "//div[@id='tbTranHis-footer']")))
                    driver.execute_script("arguments[0].scrollIntoView();",
                                          trans_foot)
                    transactions = driver.find_elements_by_xpath(
                        "//table[@id='tbTranHis']//tbody/tr[position() >= 0 and position() <= 25]"
                    )
                    for row in transactions:
                        columns = row.find_elements_by_xpath("td")
                        self.save_transaction(account, columns)
                    self.log.update_log('Vietcombank', self.username)
                    self.log.log(
                        self.payment.get_name() + '-' +
                        self.payment.get_type() + '-' +
                        self.payment.get_username() + ": " +
                        str(self.total_transactions) +
                        ' transaction(s) created', 'message')
                    self.session.set_changing_proxy(0)
                except:
                    self.log.log(
                        self.payment.get_name() + '-' +
                        self.payment.get_type() + '-' +
                        self.payment.get_username() + ": " +
                        "Cannot load transactions", 'error')
                    exc_type, exc_obj, exc_tb = sys.exc_info()
                    fname = os.path.split(
                        exc_tb.tb_frame.f_code.co_filename)[1]
                    self.log.log(
                        str(exc_type) + '-' + fname + '-' +
                        str(exc_tb.tb_lineno), 'error')
                    self.session.set_changing_proxy(1)

            except:
                exc_info = sys.exc_info()
                traceback.print_exception(*exc_info)
                self.log.log(
                    self.payment.get_name() + '-' + self.payment.get_type() +
                    '-' + self.payment.get_username() + ': ' +
                    str(sys.exc_info()), 'debug')
            driver.close()
            self.history.set_current_update('vietcombank_enterprise',
                                            "%d/%m/%Y")
            self.session.set_driver(None)

    def save_transaction(self, account, detail):
        trading_date = self.convert_trading_date(detail[0].text)
        reference_number = detail[1].text.replace('Số tham chiếu: ', '')
        account_id = account.get_account_id()

        if detail[2].text is not '':
            balance = -float(detail[2].text.replace(',', '').replace(
                ' ', '').replace('VND', ''))
        else:
            balance = float(detail[3].text.replace(',', '').replace(
                ' ', '').replace('VND', ''))

        description = detail[4].text

        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 solve_captcha(self, driver):
        img_data = WebDriverWait(driver, 10).until(
            EC.presence_of_element_located(
                (By.XPATH,
                 "//img[@id='ctl00_Content_Login_Captcha_Captcha']")))
        img_file = img_data.screenshot_as_png
        self.captcha.save_from_source(img_file, 'png')
        captcha_text = self.captcha.resolve(True)
        if re.match("^[a-zA-Z0-9]{6}$", captcha_text):
            captcha = captcha_text
            username = self.username
            password = self.password
            # Get username input element
            element = WebDriverWait(driver, 10).until(
                EC.presence_of_element_located(
                    (By.XPATH, '//input[@name="ctl00$Content$Login$TenTC"]')))
            element.send_keys(username)
            # Get password input element
            element = WebDriverWait(driver, 10).until(
                EC.presence_of_element_located(
                    (By.XPATH, '//input[@name="ctl00$Content$Login$MatKH"]')))
            element.send_keys(password)
            # Get captcha input element
            element = WebDriverWait(driver, 10).until(
                EC.presence_of_element_located(
                    (By.XPATH, '//input[@name="ctl00$Content$Login$ImgStr"]')))
            element.send_keys(captcha)
            # element.send_keys(Keys.RETURN)
            # Get submit button element
            element = WebDriverWait(driver, 10).until(
                EC.presence_of_element_located(
                    (By.XPATH, '//input[@id="ctl00_Content_Login_LoginBtn"]')))
            element.click()
            # click to account menu
            try:
                list_account = WebDriverWait(driver, 5).until(
                    EC.presence_of_element_located(
                        (By.XPATH,
                         "//a[contains(@href,'Accounts/ListAccounts.aspx')]")))
                time.sleep(5)
                list_account.click()
                self.login_failed = 0
                return True
            except:
                self.login_failed += 1
                if self.login_failed > self.max_attempt_login:
                    self.history.set_current_update('vietcombank_enterprise',
                                                    "%d/%m/%Y")
                    self.session.set_driver(None)
                    return False
                driver.back()
                return self.solve_captcha(driver)
        driver.refresh()
        return self.solve_captcha(driver)

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

    def update_account(self, name, number, balance, payment_id):
        account = VietcombankAccount(name, number, payment_id)
        account.set_balance(balance)
        account.update_account()
        return account

    def get_config(self, name=None):
        if name is None:
            name = 'Vietcombank'
        techcombank = self.config.get_section_config(name)
        return techcombank

    def is_debug(self):
        return self.debug_mode
Example #11
0
class Techcombank:
    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 perform_login(self):
        login_url = self.login_url
        username = self.username
        password = self.password
        selenium = Selenium()
        if self.session.get_driver() is None:
            if self.session.get_last_driver(
            ) is None or self.session.get_last_driver() is 'Firefox':
                driver = selenium.get_firefox_driver(self.proxy)
                self.session.set_last_driver('Chrome')
            else:
                driver = selenium.get_firefox_driver(self.proxy)
                self.session.set_last_driver('Firefox')

            self.session.set_driver(driver)

            try:
                driver.get(login_url)
                # Get username input element
                element = WebDriverWait(driver, 60).until(
                    EC.presence_of_element_located(
                        (By.XPATH, '//input[@name="signOnName"]')))
                element.send_keys(username)
                # element.send_keys(Keys.RETURN)
                element = WebDriverWait(driver, 60).until(
                    EC.presence_of_element_located(
                        (By.XPATH, '//input[@name="password"]')))
                # Get password input element
                element.send_keys(password)
                # element.send_keys(Keys.RETURN)
                # Get submit button element
                element = WebDriverWait(driver, 60).until(
                    EC.presence_of_element_located(
                        (By.XPATH, '//input[@name="btn_login"]')))
                element.click()
                time.sleep(5)
                WebDriverWait(driver, 60).until(
                    EC.visibility_of_element_located(
                        (By.XPATH,
                         "//table[contains(@id,'datadisplay_AcctBalance')]")))
                sub_accounts = driver.find_elements_by_xpath(
                    "//table[contains(@id,'datadisplay_AcctBalance')]//tr")
                for i in range(0, len(sub_accounts)):
                    WebDriverWait(driver, 60).until(
                        EC.visibility_of_element_located(
                            (By.XPATH,
                             "//table[contains(@id,'datadisplay_AcctBalance')]"
                             )))
                    WebDriverWait(driver, 60).until(
                        EC.visibility_of_element_located((
                            By.XPATH,
                            "//table[contains(@id,'datadisplay_AcctBalance')]//a/img[contains(@src,'View.png')]"
                        )))
                    sub_account = driver.find_elements_by_xpath(
                        "//table[contains(@id,'datadisplay_AcctBalance')]//tr"
                    )[i]
                    search_btn = sub_account.find_element_by_xpath(
                        ".//a/img[contains(@src,'View.png')]")
                    search_btn.click()
                    # Update account information
                    try:
                        WebDriverWait(driver, 120).until(
                            EC.visibility_of_element_located(
                                (By.XPATH, "//table[@id='enqheader']//tr")))
                        info = driver.find_elements_by_xpath(
                            "//table[@id='enqheader']//tr")
                        number = info[2].find_elements_by_xpath("td")[1].text
                        try:
                            balance = float(info[2].find_elements_by_xpath(
                                "td")[3].text.replace(',', ''))
                        except:
                            balance = float(0)
                        name = info[3].find_elements_by_xpath("td")[1].text
                        account = self.update_account(name, number, balance,
                                                      self.payment.get_id())
                        transactions = driver.find_elements_by_xpath(
                            "//table[starts-with(@id,'datadisplay_MainBody')]//tr"
                        )
                        count = 0
                        for row in transactions:
                            count += 1
                            # Get first 10 records
                            if count > 10:
                                break
                            columns = row.find_elements_by_xpath("td")
                            self.save_transaction(account, columns)
                        self.log.update_log('Techcombank', self.username)
                        self.log.log(
                            "Tcb " + self.payment.get_type() +
                            self.payment.get_username() + ": " +
                            str(self.total_transactions) +
                            ' transaction(s) created', 'message')
                        self.session.set_changing_proxy(0)
                    except:
                        self.log.log(
                            "Tcb " + self.payment.get_type() +
                            self.payment.get_username() + ": " +
                            "Cannot load transactions", 'error')
                        self.log.log(str(sys.exc_info()), 'error')
                        self.session.set_changing_proxy(1)
                    home_btn = driver.find_element_by_xpath(
                        '//a[@name="AI.QCK.HOME"]')
                    home_btn.click()
            except:
                exc_info = sys.exc_info()
                traceback.print_exception(*exc_info)
                self.log.log(str(sys.exc_info()), 'debug')

            driver.close()
            self.history.set_current_update('techcombank', "%d/%m/%Y")
            self.session.set_driver(None)

    def save_transaction(self, account, detail):
        trading_date = self.convert_trading_date(detail[0].text)
        if trading_date is None:
            return 0
        description = detail[1].text
        account_id = account.get_account_id()
        balance = float(detail[2].text.replace(',', ''))
        reference_number = self.convert_reference_number(description)
        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_reference_number(self, description):
        description_array = description.split('/')
        reference_number = description_array[len(description_array) -
                                             1].strip()
        return reference_number

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

    def update_account(self, name, number, balance, payment_id):
        account = TechcombankAccount(name, number, payment_id)
        account.set_balance(balance)
        account.update_account()
        return account

    def get_techcombank_config(self):

        techcombank = self.config.get_section_config('Techcombank')
        return techcombank

    def is_debug(self):
        return self.debug_mode