Пример #1
0
def record(tid, succ, fail, timeout, elapse=None, sname=None, create_time=None):
    create_time = create_time or datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')
    if sname is None:
        statistics = Statistics(tid=tid, succ=succ, fail=fail, timeout=timeout, elapse=elapse, create_time=create_time)
        return Statistics.insert(statistics)
    else:
        log = Log(gsid=tid, sname=sname, succ=succ, fail=fail, timeout=timeout, create_time=create_time)
        Log.insert(log)
Пример #2
0
def log(ssid=None):
    user = request.user
    if ssid is None:
        tid = request.args.get('tid')
        skip = int(request.args.get('skip', 0))
        limit = int(request.args.get('limit', 10))
        condition = {'tid':baseorm.IdField.verify(tid)}
        total = Log.count(condition)
        log = list(Log.queryAll(condition, sort=[('create_time', -1), ], skip=skip, limit=limit))
        result = {"appname":g.appname, "user":user, "log":log, "total":total}
    else:
        snapshot = q.find_one({'_id':ssid}) or {'args':'', 'kwargs':''}
        log = Log.queryOne({'_id':ssid}) or {'desc':''}
        txt = snapshot['txt'].encode('utf-8')
        txt = pickle.loads(txt)
        args = str(txt['args'])
        kwargs = json.dumps(txt['kwargs'], ensure_ascii=False, sort_keys=True, indent=4).encode('utf8')
        result = {"appname":g.appname, "user":user, "log":{'args':args, 'kwargs':kwargs, 'exception':log['desc'], 'tid':snapshot['tid']}}
    return json.dumps({'code':1, 'desc':'success', 'res':result}, ensure_ascii=False, sort_keys=True, indent=4).encode('utf8')
 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 load_admins(self):

        try:

            with open("administrators.txt", 'r') as file:
                self.admins = json.load(file)

        except:
            Log().write_log_exception(level="error",
                                      message="An error occurred while loading the administrators database.",
                                      show=True, log=True)
Пример #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()
Пример #6
0
    def adjust_scrollable_region(self, for_keyboard=False):

        try:
            region = sum([int(elem[0].cget("height")) // 4.3 for elem in self.canvas_dict.values()])

            if for_keyboard:
                region += self.gui.touch_keyboard.height

            self.canvas.configure(scrollregion=(0, 0, 0, region))

        except:
            Log().write_log_exception()
Пример #7
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
    def load_database(self):

        try:

            with open("files/students.txt", 'r') as file:
                self.database = json.load(file)

        except:
            Log().write_log_exception(
                level="error",
                message=
                "An error occurred while loading the students database.",
                show=True,
                log=True)
    def load_assets(self):

        try:
            self.background_image = ResizableImage(
                path_to_image="assets/background.png")
            self.global_background_image = self.background_image.resize_to_tk(
                width=self.width, height=self.height)
            self.cm_logo_image = ResizableImage(
                path_to_image="assets/cm_logo.png")
            self.global_cm_logo_image = self.cm_logo_image.resize_to_tk(
                width=0.2 * self.width)
            self.registration_button_image = ResizableImage(
                path_to_image="assets/registration_button.png")
            self.registration_button_on_click_image = ResizableImage(
                path_to_image="assets/registration_button_on_click.png")
            self.schedule_button_image = ResizableImage(
                path_to_image="assets/schedule_button.png")
            self.schedule_button_on_click_image = ResizableImage(
                path_to_image="assets/schedule_button_on_click.png")
            self.parameters_button = ResizableImage(
                path_to_image="assets/parameters_button.png")
            self.parameters_button_on_click = ResizableImage(
                path_to_image="assets/parameters_button_on_click.png")
            self.return_button_image = ResizableImage(
                path_to_image="assets/return_button.png")
            self.return_button_on_click_image = ResizableImage(
                path_to_image="assets/return_button_on_click.png")
            self.modify_text_button_image = ResizableImage(
                path_to_image="assets/modify_text.png")
            self.validate_modification_button_image = ResizableImage(
                path_to_image="assets/validate_modification_button.png")
            self.cancel_modification_button_image = ResizableImage(
                path_to_image="assets/cancel_modification_button.png")

            for language in self.text_resources.keys():
                self.language_assets[language] = [
                    ResizableImage(
                        path_to_image=f"assets/{language}_button.png"),
                    ResizableImage(
                        path_to_image=f"assets/{language}_button_on_click.png")
                ]

        except:
            Log().write_log_exception(
                level="error",
                message=
                "Une erreur est survenue lors du chargement des éléments "
                "visuels.",
                show=True,
                log=True)
Пример #10
0
    def validation_button_command(self):

        encoded_username = sha256(self.gui.administrator_log_in.username_entry.get().encode("utf-8")).hexdigest()
        encoded_password = sha256(self.gui.administrator_log_in.password_entry.get().encode("utf-8")).hexdigest()

        if not self.gui.administrator_log_in.admin_registration:
            if encoded_username in self.gui.admins.keys() and encoded_password == self.gui.admins[encoded_username]:

                if self.gui.administrator_log_in.itemcget(self.gui.administrator_log_in.validation_error_message_id,
                                                          "state") \
                        == "normal":
                    self.gui.administrator_log_in.itemconfigure(
                        self.gui.administrator_log_in.validation_error_message_id,
                        state="hidden")

                self.gui.administrator_log_in.hide()
                self.gui.parameters_menu.display()

            else:
                self.gui.administrator_log_in.itemconfigure(self.gui.administrator_log_in.validation_error_message_id,
                                                            state="normal")

        elif self.gui.administrator_log_in.admin_registration:

            try:
                self.gui.admins[f"{encoded_username}"] = encoded_password
                self.gui.administrator_log_in.toggle_admin_registration()
                self.gui.administrator_log_in.hide()
                self.gui.parameters_menu.display()

            except:
                Log.write_log_exception()

            else:
                Log().write_log_info(message="Un compte administrateur pour l'utilisateur "
                                             f"{self.gui.administrator_log_in.username_entry.get()} a été créé.")
Пример #11
0
    def close_app(self):

        try:

            with open("students.txt", 'w') as file:
                json.dump(self.database, file, sort_keys=True, indent=4)

            with open("administrators.txt", 'w') as file:
                json.dump(self.admins, file, sort_keys=True, indent=4)

        except:
            Log().write_log_exception(level="error", message="The application didn't close properly.",
                                      show=False, log=True)

        finally:
            self.root.quit()
Пример #12
0
 def save(data):
     if data is not None:
         entity = Log(
             un=data['user_name'],
             th=data['target_host'],
             sh=data['source_host'],
             cdt=datetime.strptime(data['created_datetime'],
                                   '%Y-%m-%d %H:%M:%S'),
             au=data['api_url'],
         )
         db.session.add(entity)
         try:
             db.session.commit()
         except SQLAlchemyError:
             return None
         return entity
Пример #13
0
 def __init__(self,params):
     '''
     get application params
     '''
     self.number = params.number_of_files
     self.frequency = params.frequency
     self.epsilon = params.epsilon
     self.strategy = params.cache_strategy
     self.size = params.cache_size
     self.file_list = list()
     self.list_of_frequencies = params.list_of_frequencies
     self.timeslot = params.timeslot
     self.hits = params.hits
     self.log = Log(params)
     self.increase_epsilon = params.increase_epsilon
     self.decrease_epsilon = params.decrease_epsilon
     self.z = params.zipf_exponent
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
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
from model.log import Log
from view.gui import GUI

try:
    gui = GUI()

    gui.start_menu.display()

    gui.root.mainloop()

except:
    Log().write_log_exception(level="error",
                              message="Un problème est survenu lors de l'exécution de l'application.",
                              show=True,
                              log=False)

Пример #17
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("'", "")
def compare_logging_calls(head_commit_db, file_diff, logging_calls_in_parent, logging_calls_in_head):
    file_mapping_list = []
    file_added_logging_loc = 0
    file_deleted_logging_loc = 0
    file_updated_logging_loc = 0

    # Add index to make each call unique.
    logging_calls_str_parent = \
        [str(index) + '#' + etree.tostring(call).decode('utf-8') for index, call in
         enumerate(logging_calls_in_parent)]
    logging_calls_str_head = \
        [str(index) + '#' + etree.tostring(call).decode('utf-8') for index, call in
         enumerate(logging_calls_in_head)]

    for call_str_in_parent in logging_calls_str_parent:
        for call_str_in_head in logging_calls_str_head:
            distance_ratio = Levenshtein.ratio(xml_analyzer.transform_xml_str_to_code(call_str_in_parent),
                                               xml_analyzer.transform_xml_str_to_code(call_str_in_head))
            if distance_ratio > config.LEVENSHTEIN_RATIO_THRESHOLD:
                is_parent_in_mapping = False
                # Check mapping list
                for mapping in file_mapping_list:
                    call_mapping_parent = mapping[0]
                    mapping_ratio = mapping[2]
                    if call_str_in_parent == call_mapping_parent:
                        is_parent_in_mapping = True
                        if distance_ratio > mapping_ratio:
                            mapping[1] = call_str_in_head
                            mapping[2] = Levenshtein.ratio(_get_code_text_from_compare(call_str_in_parent),
                                                           _get_code_text_from_compare(call_str_in_head))
                if not is_parent_in_mapping:
                    is_head_in_mapping = False
                    for mapping in file_mapping_list:
                        call_mapping_head = mapping[1]
                        mapping_ratio = mapping[2]
                        if call_str_in_head == call_mapping_head:
                            is_head_in_mapping = True
                            if distance_ratio > mapping_ratio:
                                mapping[0] = call_str_in_parent
                                mapping[2] = Levenshtein.ratio(_get_code_text_from_compare(call_str_in_parent),
                                                               _get_code_text_from_compare(call_str_in_head))
                    if not is_head_in_mapping:
                        file_mapping_list.append([call_str_in_parent, call_str_in_head, distance_ratio])

    file_calls_mapping_in_parent = [mapping[0] for mapping in file_mapping_list]
    file_calls_mapping_in_head = [mapping[1] for mapping in file_mapping_list]

    deleted_logging_calls_str = list(set(logging_calls_str_parent) - set(file_calls_mapping_in_parent))
    added_logging_calls_str = list(set(logging_calls_str_head) - set(file_calls_mapping_in_head))

    file_deleted_logging_loc += len(deleted_logging_calls_str)
    file_added_logging_loc += len(added_logging_calls_str)

    if not head_commit_db.is_merge_commit:
        for call_str in deleted_logging_calls_str:
            call_xml = etree.fromstring(_get_code_xml_str_from_compare(call_str))
            model_operator.save_logs_of_method_xml_str_if_needed(head_commit_db, file_diff.a_path, None,
                                                                 LogChangeType.LOG_DELETED, call_xml, None)

        for call_str in added_logging_calls_str:
            call_xml = etree.fromstring(_get_code_xml_str_from_compare(call_str))
            model_operator.save_logs_of_method_xml_str_if_needed(head_commit_db, file_diff.a_path, None,
                                                                 LogChangeType.LOG_ADDED, call_xml, None)

    for mapping in file_mapping_list:
        change_from = _get_code_text_from_compare(mapping[0])
        change_to = _get_code_text_from_compare(mapping[1])
        if change_from != change_to:
            # True Update
            file_updated_logging_loc += 1
            if not head_commit_db.is_merge_commit:
                log = Log.create(commit=head_commit_db, file_path=file_diff.b_path, embed_method='NILL',
                                 change_type=LogChangeType.LOG_UPDATED, content=change_to,
                                 content_update_from=change_from)
                log.save()

    return file_added_logging_loc, file_deleted_logging_loc, file_updated_logging_loc
Пример #19
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
Пример #20
0
 def __init__(self, name, connector, delay):
     threading.Thread.__init__(self)
     self.name = name
     self.connector = connector
     self.log = Log()
     self.delay = delay
Пример #21
0
class Main(object):
    '''
    Principal controller of the application
    '''


    def __init__(self,params):
        '''
        get application params
        '''
        self.number = params.number_of_files
        self.frequency = params.frequency
        self.epsilon = params.epsilon
        self.strategy = params.cache_strategy
        self.size = params.cache_size
        self.file_list = list()
        self.list_of_frequencies = params.list_of_frequencies
        self.timeslot = params.timeslot
        self.hits = params.hits
        self.log = Log(params)
        self.increase_epsilon = params.increase_epsilon
        self.decrease_epsilon = params.decrease_epsilon
        self.z = params.zipf_exponent
        
    def run(self):
        cache = Cache(self.size,self.strategy)
        self.gen_frequencies()
        self.gen_file_list()

        for timeslot in range(self.timeslot):
            self.go_time()
            self.apply_epsilon()
            for hits in range(self.hits):
                choice = self.select_file()
                response = cache.append_item(choice)
                if(response):
                    self.log.insert_log(response,timeslot+1,'hit',cache.get_file_status())
                else:
                    self.log.insert_log(choice,timeslot+1,'miss',cache.get_file_status())
        self.log.end_write()

    def gen_frequencies(self):
        if not self.list_of_frequencies and self.frequency == 'PERSONAL':
            print "You need a list of preferences"
        elif self.frequency != 'PERSONAL' and not not self.list_of_frequencies:
            print "You need to set preference to PERSONAL"
        else:
            if not self.list_of_frequencies:
                freq = Frequency(self.number,self.frequency,self.z)
            else:
                freq = Frequency(self.number,self.frequency,self.z,self.list_of_frequencies)
            freq.gen_frequency()
            self.list_of_frequencies = freq.frequency_
            
   
    def gen_file_list(self):
        for i in range(self.number):
            self.file_list.append(File(i,self.list_of_frequencies[i]))
    
    def select_file(self):
        limit = uniform(0,1)
        acum = 0
        helper_list = deepcopy(self.file_list)
        while acum <= limit:
            item = choice(helper_list)
            acum = item.frequency + acum
            helper_list.remove(item)
        for file_ in self.file_list:
            if file_.name == item.name:
                return file_
    
    def go_time(self):
        
        for file_ in self.file_list:
            file_.usage = file_.usage + 1
    
    def apply_epsilon(self):
        if not not self.epsilon:
            if len(self.epsilon) > 1:
                if self.is_not_negative_list():
                    for i in range(len(self.file_list)):
                        self.file_list[i].frequency = self.file_list[i].frequency + self.epsilon[i]
                
            elif not not self.increase_epsilon and not not self.decrease_epsilon:
                if self.is_not_negative_increase():
                    for file_ in self.file_list:
                        if file_.name in self.increase_epsilon:
                            file_.frequency = file_.frequency + self.epsilon[0]
                        else:
                            file_.frequency = file_.frequency - self.epsilon[0]
        
            else:
                length = len(self.file_list)
                if length % 2 == 0:
                    if self.is_not_negative_dual(self.epsilon[0],self.epsilon[0],length/2):
                        for file_ in self.file_list[:length/2]:
                            file_.frequency = file_.frequency - self.epsilon[0]
                        for file_ in self.file_list[length/2:]:
                            file_.frequency = file_.frequency + self.epsilon[0]
                else:
                    majority = int(length / 2) + 1
                    minority = majority - 1
                    divided = (self.epsilon[0]*minority)/majority
                    if self.is_not_negative_dual(divided,self.epsilon[0],majority):
                        for file_ in self.file_list[:majority]:
                            file_.frequency = file_.frequency - divided
                        for file_ in self.file_list[majority:]:
                            file_.frequency = file_.frequency + self.epsilon[0]

    def is_not_negative_list(self):
        counter = 0
        for i in range(len(self.file_list)):
            counter = counter + self.file_list[i].frequency  + self.epsilon[i]
            if self.file_list[i].frequency + self.epsilon[i] < 0:
                return False
        if counter == 1:
            return True
        else:
            return False
    
    def is_not_negative_dual(self,minus,max_,cut):
        counter = 0
        for file_ in self.file_list[:cut]:
            counter = counter + file_.frequency - minus
            if file_.frequency - minus < 0:
                return False
        for file_ in self.file_list[cut:]:
            counter = counter + file_.frequency + max_
            if file_.frequency + max_ < 0:
                return False
        if counter == 1:
            return True
        else:
            return False
                                
    def is_not_negative_increase(self):
        counter = 0
        for file_ in self.file_list:
            if file_.name in self.increase_epsilon:
                counter = counter + file_.frequency + self.epsilon[0]
                if file_.frequency + self.epsilon[0] < 0:
                    return False
            else:
                counter = counter + file_.frequency - self.epsilon[0]
                if file_.frequency - self.epsilon[0] < 0:
                    return False
        if counter == 1:
            return True
        else:
            return False
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
Пример #23
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
Пример #24
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
class IntegrationController:
    def __init__(self):   
        self.trello = Trello()
        self.log = Log()    
        self.petitionsList = []
        self.petition = Petition()

    def pushPlipToTrelloBoard(self):
        log = Log()
        #recover date from last Sync and displays it before accually syncs
        lastSyncDate = self.log.recoverLastSync('TRELLO_SYNC')
        #for p in Petition.where(Petition.submitDate >= lastSyncDate).get():
        count = 0
        print("Last sync: " + str(lastSyncDate))

        for petition in Petition.select().where(Petition.submitDate >= lastSyncDate):
            print(petition.plip_name)
            count += self.trello.createCard(petition)
        print("Tototal of [" + str(count) +"] roposes pushed to Trello board")
            
        #if plip finishes now will create a log for it
        now = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
        log.motive = "TRELLO_SYNC"
        log.quantity = count
        log.sync_date = now
        self.log.createLogSyncPL(log.sync_date, log.quantity, log.motive)


    # downloads and store plips from google sheets on local repositoty
    def downloadPLIPFile(self):
        plipSheet = os.getenv("GOOGLE_SHEET_URL")
        fileName = 'plip.csv'
       
        #tries to create plip repo file in case not exists
        self.petition.createPlipRepo()
        print('Baixando PLIPs')

        filedata = urllib2.urlopen(plipSheet)  
        datatowrite = filedata.read()

        try:
            with open('plip-repo/plip.csv', 'wb') as f:  
                f.write(datatowrite)
            print("Arquivo baixado com sucesso!")
        except OSError as e:
            if e.errno != errno.EEXIST:
                raise
        
    # read lines from csv file
    # and transform then into petition's objects
    # then store each plip in the database
    # creates a log of when and how many plips were synced

    def store(self):
        petitionList = []
        with open('plip-repo/plip.csv', 'rb') as csvfile:
            plips = csv.reader(csvfile)
            #pt = Petition.select().where(Petition.submitDate > '2018-02-29 00:00:00').order_by(Petition.submitDate.desc()).limit(1)
            lastSync = self.log.recoverLastSync('PLIP_SYNC')
            #print(lastSync)
            #test = datetime.datetime.strptime(str(lastSync), '%Y-%m-%d %H:%M:%S')
            print("Last sync was in: ", lastSync)
            for row in plips:
                if(row[0] != 'status'):
                    timestamp = datetime.datetime.strptime(row[15],'%Y-%m-%d %H:%M:%S')
                    #print("debug timestamp:")
                    #print(type(timestamp))
                    #print("debug lastsync")
                    #print(type(lastSync))
                    if timestamp > lastSync:
                        print("última sincronização: "+ str(lastSync))
                        print("Timestamp de envio da petição:" + str(timestamp))
                        print("Timestamp de envio maior que a ultima sincronização.. salvando no banco:")
                        petition = Petition(
                            plip_status = row[0],
                            plip_template = row[1],
                            plip_fantasy_name = row[2],
                            plip_name = row[3],
                            plip_text = row[4],
                            plip_wide = row[5],
                            plip_state = row[6],
                            plip_municipality = row[7],
                            plip_video = row[8],
                            plip_references = row[9],
                            plip_links = row[10],
                            sender_name = row[11],
                            sender_email =row[12],
                            sender_telephone =row[13],
                            submitDate = row[15]
                        )
                        is_save = petition.save()
                        petitionList.append(is_save)
                    else:
                        print("Timestamp:")
                        print(timestamp)
                        print("petition send date lower then lastSync")
            print("Total of:[" + str(len(petitionList))+ "] was synced during this task.")
        #create a log of the last petition Date that was synced
        if 'petition' in locals():
            if hasattr(petition, 'submitDate'):
                self.log.createLogSyncPL(petition.submitDate,len(petitionList), "PLIP_SYNC")
        else:
            #logs in case there is any new petition
            self.log.createLogSyncPL(datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S"),len(petitionList), "PLIP_SYNC")
 def __init__(self):   
     self.trello = Trello()
     self.log = Log()    
     self.petitionsList = []
     self.petition = Petition()
Пример #27
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)
Пример #28
0
def run():
    log = Log()
    log.notify()
Пример #29
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