optimize local db

This commit is contained in:
2022-06-08 21:39:45 +02:00
parent 80d362b174
commit 20c84b2a14
9 changed files with 95 additions and 56 deletions
+2 -5
View File
@@ -41,7 +41,7 @@ class ResultChecker:
device = random.choice(params.DEVICES) device = random.choice(params.DEVICES)
self.logger.info("模拟设备: " + device) self.logger.info("模拟设备: " + device)
pixel_2 = self.tls.playwright.devices[device] pixel_2 = self.tls.playwright.devices[device]
context = self.browser.new_context(**pixel_2, locale='en-GB') context = self.browser.new_context(**pixel_2, locale='fr-FR')
self.page = context.new_page() self.page = context.new_page()
# hide webdriver information # hide webdriver information
self.page.add_init_script("""() => { self.page.add_init_script("""() => {
@@ -66,9 +66,6 @@ class ResultChecker:
# url_to_check = url + "?lang=fr" # url_to_check = url + "?lang=fr"
print("url is " + url) print("url is " + url)
content = None content = None
random_id_number = str(phone_number)[1:len(str(phone_number))]
proxy_username = "panleicim-res-fr-" + random_id_number
print("proxy_username is " + proxy_username)
proxy = { proxy = {
"server": params.BRIGHT_DATA_PROXY_SERVER, "server": params.BRIGHT_DATA_PROXY_SERVER,
"username": params.BRIGHT_DATA_PROXY_USERNAME, "username": params.BRIGHT_DATA_PROXY_USERNAME,
@@ -123,7 +120,7 @@ if __name__ == '__main__':
reserve_pojo = ReserveResultPojo.from_firestore_dict(appointment.to_dict()) reserve_pojo = ReserveResultPojo.from_firestore_dict(appointment.to_dict())
result_list.append(reserve_pojo) result_list.append(reserve_pojo)
with ThreadPoolExecutor(max_workers=10) as executor: with ThreadPoolExecutor(max_workers=15) as executor:
for reserve in result_list: for reserve in result_list:
count = count + 1 count = count + 1
if reserve.accepted is None or ResultEnum.ACCEPTED.value == reserve.accepted: if reserve.accepted is None or ResultEnum.ACCEPTED.value == reserve.accepted:
+20 -2
View File
@@ -1,9 +1,14 @@
from builtins import list
import sqlalchemy import sqlalchemy
from sqlalchemy import MetaData, Column, String, Integer, DateTime, Table from sqlalchemy import MetaData, Column, String, Integer, DateTime, Table
from sqlalchemy.orm import Session from sqlalchemy.orm import Session
from sqlalchemy_utils import database_exists, create_database from sqlalchemy_utils import database_exists, create_database
from pojo.captcha_error_contact_pojo import ContactInErrorPojo import definitions
import params
from pojo.ReserveResultPojo import ReserveResultPojo
from pojo.captcha_error_contact_pojo import ContactInErrorPojo, ERROR_TYPE_CAPTCHA
class LocalDbManager: class LocalDbManager:
@@ -12,7 +17,7 @@ class LocalDbManager:
self.session = Session(self.init_db(path)) self.session = Session(self.init_db(path))
def init_db(self, path: str): def init_db(self, path: str):
uri_for_db = "sqlite:///{}/{}.db".format(path, "appointment") uri_for_db = "sqlite:///{}/{}.db?check_same_thread=false".format(path, "appointment")
print(uri_for_db) print(uri_for_db)
# 2.-Turn on database engine # 2.-Turn on database engine
db_engine = sqlalchemy.create_engine(uri_for_db) # ensure this is the correct path for the sqlite file. db_engine = sqlalchemy.create_engine(uri_for_db) # ensure this is the correct path for the sqlite file.
@@ -43,3 +48,16 @@ class LocalDbManager:
def insert_or_update(self, instance: ContactInErrorPojo): def insert_or_update(self, instance: ContactInErrorPojo):
self.session.merge(instance) self.session.merge(instance)
self.session.commit() self.session.commit()
def get_all_captcha_error_contacts(self) -> list:
return self.session.query(ContactInErrorPojo).filter(ContactInErrorPojo.error_type == ERROR_TYPE_CAPTCHA).all()
def handle_success(self, reservePojo: ReserveResultPojo):
# delete the contact from table
self.session.query(ContactInErrorPojo).filter(ContactInErrorPojo.mail == reservePojo.email).delete()
if __name__ == '__main__':
list = params.local_db_manager.get_all_captcha_error_contacts()
for item in list:
print(item.mail)
-4
View File
@@ -2,9 +2,6 @@ import configparser
import getpass import getpass
import os import os
from pathlib import Path from pathlib import Path
from db.local_db_manager import LocalDbManager
home = str(Path.home()) home = str(Path.home())
config = configparser.ConfigParser() config = configparser.ConfigParser()
print("home path: " + home) print("home path: " + home)
@@ -17,5 +14,4 @@ FIREBASE_CONFIG_FILE = config['DEFAULT']['firebase_config_file']
LOGS_DIR = config['DEFAULT']['LOGS_DIR'] LOGS_DIR = config['DEFAULT']['LOGS_DIR']
username = getpass.getuser() username = getpass.getuser()
LOG_SOURCE = username LOG_SOURCE = username
local_db_manager = LocalDbManager(home)
ROOT_DIR = os.path.dirname(os.path.abspath(__file__)) ROOT_DIR = os.path.dirname(os.path.abspath(__file__))
+19 -13
View File
@@ -5,6 +5,7 @@ from concurrent.futures import ThreadPoolExecutor
import params import params
from logs.AppLogging import init_logger from logs.AppLogging import init_logger
from pojo.ModeEnum import ModeEnum from pojo.ModeEnum import ModeEnum
from pojo.contact_pojo import ContactPojo
from utils.excel_reader import ExcelHelper from utils.excel_reader import ExcelHelper
from workers.commandor_page import CommandorPage from workers.commandor_page import CommandorPage
@@ -25,26 +26,31 @@ def start_book(start_number, end_number, store_choose_state=0, max_workers=10, p
logger.info(contacts) logger.info(contacts)
with ThreadPoolExecutor(max_workers=max_workers) as executor: with ThreadPoolExecutor(max_workers=max_workers) as executor:
for contact in contacts: for contact in contacts:
proxy = get_proxy(contact.phone, proxy_type) proxy = get_proxy(proxy_type)
# start the task in thread # start the task in thread
executor.submit( executor.submit(
CommandorPage(contact, store_type=store_choose_state, proxy_type=proxy_type, mode=mode).start_page, CommandorPage(contact, store_type=store_choose_state, proxy_type=proxy_type, mode=mode).start_page,
proxy) proxy)
def get_proxy(phone_number, proxy_type=0): def recheck_the_captcha_error_contacts(store_type=0, mode: ModeEnum = ModeEnum.MANUAL):
# random_id_number = str(phone_number)[1:len(str(phone_number))] # get all the contacts in captcha error
random_id_number = params.get_random_id_number_for_proxy() list = params.local_db_manager.get_all_captcha_error_contacts()
proxy_username = params.get_proxy_name_prefix(proxy_type) + random_id_number with ThreadPoolExecutor(max_workers=10) as executor:
logger.info("proxy_username is " + proxy_username) for errorContact in list:
proxy = { contact = ContactPojo.get_contact_from_error_contact(errorContact)
"server": params.BRIGHT_DATA_PROXY_SERVER, proxy = get_proxy()
"username": params.BRIGHT_DATA_PROXY_USERNAME, # start the task in thread
"password": params.BRIGHT_DATA_PROXY_PASSWORD executor.submit(
} CommandorPage(contact, store_type=store_type, mode=mode).start_page,
return proxy proxy)
def get_proxy(proxy_type=0):
return params.get_proxy(proxy_type)
if __name__ == '__main__': if __name__ == '__main__':
# 修改联系人行,结束联系人行 第三个参数store等于0的时候是随机,传入1的时候是总店 # 修改联系人行,结束联系人行 第三个参数store等于0的时候是随机,传入1的时候是总店
start_book(16, 16, store_choose_state=0, proxy_type=0) # start_book(16, 16, store_choose_state=0, proxy_type=0)
recheck_the_captcha_error_contacts(0, mode=ModeEnum.AUTOMATIC)
+22
View File
@@ -1,7 +1,9 @@
import random import random
import string import string
import definitions
from db.DbManager import DataManager from db.DbManager import DataManager
from db.local_db_manager import LocalDbManager
from logs.LogSender import LogSender from logs.LogSender import LogSender
firebase_store_manager = DataManager() firebase_store_manager = DataManager()
@@ -25,6 +27,24 @@ def get_proxy_name_prefix(proxy_type=0) -> str:
return PROXY_NAME_PREFIX_CC return PROXY_NAME_PREFIX_CC
def get_proxy(proxy_type=0):
if proxy_type == 0:
random_id_number = get_random_id_number_for_proxy()
proxy_username = get_proxy_name_prefix(proxy_type) + random_id_number
proxy = {
"server": PROXY_SERVER,
"username": proxy_username,
"password": PROXY_PASSWORD
}
else:
proxy = {
"server": BRIGHT_DATA_PROXY_SERVER,
"username": BRIGHT_DATA_PROXY_USERNAME,
"password": BRIGHT_DATA_PROXY_PASSWORD
}
return proxy
def get_random_id_number_for_proxy() -> str: def get_random_id_number_for_proxy() -> str:
S = 8 # number of characters in the string. S = 8 # number of characters in the string.
ran = ''.join(random.choices(string.digits, k=S)) ran = ''.join(random.choices(string.digits, k=S))
@@ -33,6 +53,8 @@ def get_random_id_number_for_proxy() -> str:
return id_number return id_number
local_db_manager = LocalDbManager(definitions.home)
DEVICES = ['iPad (gen 6)', 'iPad (gen 6) landscape', 'iPad (gen 7)', 'iPad (gen 7) landscape', 'iPad Mini', DEVICES = ['iPad (gen 6)', 'iPad (gen 6) landscape', 'iPad (gen 7)', 'iPad (gen 7) landscape', 'iPad Mini',
'iPad Mini landscape', 'iPad Pro 11', 'iPad Pro 11 landscape', 'iPhone 6', 'iPhone 6 landscape', 'iPad Mini landscape', 'iPad Pro 11', 'iPad Pro 11 landscape', 'iPhone 6', 'iPhone 6 landscape',
'iPhone 6 Plus', 'iPhone 6 Plus landscape', 'iPhone 7', 'iPhone 7 landscape', 'iPhone 7 Plus', 'iPhone 6 Plus', 'iPhone 6 Plus landscape', 'iPhone 7', 'iPhone 7 landscape', 'iPhone 7 Plus',
+1 -22
View File
@@ -1,8 +1,6 @@
from sqlalchemy import Column, String, Integer, DateTime, func from sqlalchemy import Column, String, Integer, DateTime, func
from sqlalchemy.orm import declarative_base from sqlalchemy.orm import declarative_base
import definitions
from pojo.contact_pojo import ContactPojo
Base = declarative_base() Base = declarative_base()
@@ -22,23 +20,4 @@ class ContactInErrorPojo(Base):
position: int = Column(Integer) position: int = Column(Integer)
error_type = Column(Integer) error_type = Column(Integer)
update_at = Column(DateTime, onupdate=func.now()) update_at = Column(DateTime, onupdate=func.now())
create_at = Column(DateTime, default=func.now()) create_at = Column(DateTime, default=func.now())
def get_captcha_error_contact_from_contact(contact: ContactPojo, error_type: int) -> ContactInErrorPojo:
captcha_error = ContactInErrorPojo()
captcha_error.mail = contact.mail
captcha_error.ccid = contact.ccid
captcha_error.phone = contact.phone
captcha_error.passport = contact.passport
captcha_error.first_name = contact.first_name
captcha_error.last_name = contact.last_name
captcha_error.position = contact.position
captcha_error.error_type = error_type
return captcha_error
if __name__ == '__main__':
contact = ContactPojo(mail="panleici3m@gmail.com", phone_number="649114592", ccid="", position=0,
passport_number="3322111", first_name="Lei", last_name="PAAaN")
definitions.local_db_manager.insert_or_update(get_captcha_error_contact_from_contact(contact, ERROR_TYPE_CAPTCHA))
+8
View File
@@ -1,5 +1,7 @@
from dataclasses import dataclass from dataclasses import dataclass
from pojo.captcha_error_contact_pojo import ContactInErrorPojo
@dataclass @dataclass
class ContactPojo: class ContactPojo:
@@ -35,6 +37,12 @@ class ContactPojo:
return dest return dest
@staticmethod
def get_contact_from_error_contact(errorContact: ContactInErrorPojo):
return ContactPojo(phone_number=errorContact.phone, mail=errorContact.mail, ccid=errorContact.ccid,
last_name=errorContact.last_name, first_name=errorContact.first_name,
position=errorContact.position, passport_number=errorContact.passport)
@staticmethod @staticmethod
def from_firestore_dict(source): def from_firestore_dict(source):
ccid = source['ccid'] ccid = source['ccid']
+15
View File
@@ -1,6 +1,9 @@
import random import random
import string import string
from pojo.captcha_error_contact_pojo import ContactInErrorPojo
from pojo.contact_pojo import ContactPojo
letters = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'J', 'K', 'P', 'Q', 'R', 'S', 'T', '1', '2', '3', '4', '5', '6', '7', letters = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'J', 'K', 'P', 'Q', 'R', 'S', 'T', '1', '2', '3', '4', '5', '6', '7',
'8', '9'] '8', '9']
@@ -19,6 +22,18 @@ def get_random_passport_id_number() -> str:
return id_number return id_number
def get_captcha_error_contact_from_contact(contact: ContactPojo, error_type: int) -> ContactInErrorPojo:
captcha_error = ContactInErrorPojo()
captcha_error.mail = contact.mail
captcha_error.ccid = contact.ccid
captcha_error.phone = contact.phone
captcha_error.passport = contact.passport
captcha_error.first_name = contact.first_name
captcha_error.last_name = contact.last_name
captcha_error.position = contact.position
captcha_error.error_type = error_type
return captcha_error
if __name__ == '__main__': if __name__ == '__main__':
# for i in range(1,200): # for i in range(1,200):
# print(get_random_id_number()) # print(get_random_id_number())
+8 -10
View File
@@ -12,9 +12,10 @@ import definitions
import params import params
from pojo.ModeEnum import ModeEnum from pojo.ModeEnum import ModeEnum
from pojo.ReserveResultPojo import ReserveResultPojo, PublishType from pojo.ReserveResultPojo import ReserveResultPojo, PublishType
from pojo.captcha_error_contact_pojo import get_captcha_error_contact_from_contact, ERROR_TYPE_CAPTCHA, \ from pojo.captcha_error_contact_pojo import ERROR_TYPE_CAPTCHA, \
TOO_MANY_REQUEST_ERROR TOO_MANY_REQUEST_ERROR
from pojo.contact_pojo import ContactPojo from pojo.contact_pojo import ContactPojo
from utils.generate_random_passport_id import get_captcha_error_contact_from_contact
from workers.SolveCaptch import SolveCaptcha from workers.SolveCaptch import SolveCaptcha
RDV_URL = "https://rendezvousparis.hermes.com/client/register" RDV_URL = "https://rendezvousparis.hermes.com/client/register"
@@ -32,7 +33,7 @@ CONFIRMED_MESSAGE_FR = "Votre demande de rendez-vous Maroquinerie a bien été e
DOUBLE_REQUEST_ERROR_MESSAGE = "A request with the same data has already been validated today." DOUBLE_REQUEST_ERROR_MESSAGE = "A request with the same data has already been validated today."
DOUBLE_REQUEST_ERROR_MESSAGE_FR = "Une demande avec les données saisies a déjà été validée aujourdhui." DOUBLE_REQUEST_ERROR_MESSAGE_FR = "Une demande avec les données saisies a déjà été validée aujourdhui."
TOO_MANY_REQUEST_ERROR_MESSAGE = "Due to a large number of requests" TOO_MANY_REQUEST_ERROR_MESSAGE = "Due to a large number of requests"
TOO_MANY_REQUEST_ERROR_MESSAGE_FR = "Suite à un trop grand nombre de demandes aujourdhui," TOO_MANY_REQUEST_ERROR_MESSAGE_FR = "Suite à un trop grand nombre de demandes"
CAPTCHA_ERROR_MESSAGE = "Error verifying captcha, please try again" CAPTCHA_ERROR_MESSAGE = "Error verifying captcha, please try again"
CAPTCHA_ERROR_MESSAGE_FR = "La vérification du captcha a échoué" CAPTCHA_ERROR_MESSAGE_FR = "La vérification du captcha a échoué"
TIME_OUT = 400000 TIME_OUT = 400000
@@ -98,11 +99,7 @@ class CommandorPage:
first_page = None first_page = None
while first_page is None: while first_page is None:
first_page = self.start_browser(proxy, self.tls.playwright, devices) first_page = self.start_browser(proxy, self.tls.playwright, devices)
proxy = { proxy = params.get_proxy(self.proxy_type)
"server": params.BRIGHT_DATA_PROXY_SERVER,
"username": params.BRIGHT_DATA_PROXY_USERNAME,
"password": params.BRIGHT_DATA_PROXY_PASSWORD
}
# wait for sms_code field # wait for sms_code field
# self.clickOnValidBtn() # self.clickOnValidBtn()
self.thread_event = e self.thread_event = e
@@ -132,7 +129,7 @@ class CommandorPage:
self.logger.info("填充信息: " + str(self.contact.phone)) self.logger.info("填充信息: " + str(self.contact.phone))
self._set_name(self.contact.last_name, self.contact.first_name) self._set_name(self.contact.last_name, self.contact.first_name)
self._setPhoneCountryAndStore() self._setPhoneCountryAndStore()
self._setPhoneNumber(self.contact.phone) self._setPhoneNumber("0" + str(self.contact.phone))
self._set_email(self.contact.mail) self._set_email(self.contact.mail)
self.setIdNumber(self.contact.passport) self.setIdNumber(self.contact.passport)
self._checkCgu() self._checkCgu()
@@ -255,7 +252,7 @@ class CommandorPage:
elif TOO_MANY_REQUEST_ERROR_MESSAGE in erro_content or TOO_MANY_REQUEST_ERROR_MESSAGE_FR in erro_content: elif TOO_MANY_REQUEST_ERROR_MESSAGE in erro_content or TOO_MANY_REQUEST_ERROR_MESSAGE_FR in erro_content:
# this email has been already used # this email has been already used
if not self.is_finished: if not self.is_finished:
definitions.local_db_manager.insert_or_update( params.local_db_manager.insert_or_update(
get_captcha_error_contact_from_contact(self.contact, TOO_MANY_REQUEST_ERROR)) get_captcha_error_contact_from_contact(self.contact, TOO_MANY_REQUEST_ERROR))
params.oracle_log_sender.send_too_many_error(self.contact) params.oracle_log_sender.send_too_many_error(self.contact)
self.is_finished = True self.is_finished = True
@@ -265,7 +262,7 @@ class CommandorPage:
self.is_captcha_in_error = True self.is_captcha_in_error = True
if not self.is_finished: if not self.is_finished:
# save the error to database with contact info # save the error to database with contact info
definitions.local_db_manager.insert_or_update( params.local_db_manager.insert_or_update(
get_captcha_error_contact_from_contact(self.contact, ERROR_TYPE_CAPTCHA)) get_captcha_error_contact_from_contact(self.contact, ERROR_TYPE_CAPTCHA))
params.oracle_log_sender.send_captcha_error(self.contact) params.oracle_log_sender.send_captcha_error(self.contact)
self.is_finished = True self.is_finished = True
@@ -331,6 +328,7 @@ class CommandorPage:
passport=contact.passport, ccid=contact.ccid) passport=contact.passport, ccid=contact.ccid)
result.id = id result.id = id
params.firebase_store_manager.save(result) params.firebase_store_manager.save(result)
params.local_db_manager.handle_success(result)
if status is PublishType.SUCCESS: if status is PublishType.SUCCESS:
self.on_success(result) self.on_success(result)
time.sleep(2) time.sleep(2)