diff --git a/appointment.py b/appointment.py index 9e07a1a..f573bee 100644 --- a/appointment.py +++ b/appointment.py @@ -3,14 +3,15 @@ import PySimpleGUI as sg # First the window layout in 2 columns from main import start_book from pojo.ModeEnum import ModeEnum +from proxy.proxy_type import ProxyType KEY_CHOOSE_STORE = "CHOOSE_STORE" KEY_START_NUMBER = "KEY_START_NUMBER" KEY_END_NUMBER = "KEY_END_NUMBER" KEY_MAX_WORKERS = "KEY_MAX_WORKERS" KEY_RANDOM = "KEY_RANDOM" -KEY_PROXY_RES = "KEY_PROXY_RES" -KEY_PROXY_CC = "KEY_PROXY_CC" +KEY_PROXY_BRIGHTDATA = "KEY_PROXY_BRIGHTDATA" +KEY_PROXY_NETNUT = "KEY_PROXY_NETNUT" KEY_FAUBOURG = "KEY_FAUBOURG" KEY_GEORGE = "KEY_GEORGE" KEY_SEVRES = "KEY_SEVRES" @@ -37,8 +38,8 @@ store_settings_column = [ ] proxy_settings_column = [ [sg.Text("代理ip池")], - [sg.Radio('res(速度)', group_id=GROUP_PROXY, key=KEY_PROXY_RES, default=True)], - [sg.Radio('cc(稳定)', group_id=GROUP_PROXY, key=KEY_PROXY_CC, default=False)], + [sg.Radio('亮数据', group_id=GROUP_PROXY, key=KEY_PROXY_BRIGHTDATA, default=True)], + [sg.Radio('Netnut', group_id=GROUP_PROXY, key=KEY_PROXY_NETNUT, default=False)], ] mode_settings_column = [ @@ -76,19 +77,16 @@ while True: elif values[KEY_SEVRES]: store_type = 3 - proxy_type = 0 - if values[KEY_PROXY_CC]: - proxy_type = 1 - elif values[KEY_PROXY_RES]: - proxy_type = 0 + proxy_type = ProxyType.BRIGHT_DATA + if values[KEY_PROXY_NETNUT]: + proxy_type = ProxyType.NETNUT + elif values[KEY_PROXY_BRIGHTDATA]: + proxy_type = ProxyType.BRIGHT_DATA if values[KEY_AUTOMATIC]: mode = ModeEnum.AUTOMATIC start_book(start_line, end_line, store_choose_state=store_type, max_workers=max_workers, proxy_type=proxy_type, mode=mode) - # except Exception as error: - # print("Not Integer: ") - # print(error) elif event == "Exit" or event == sg.WIN_CLOSED: break diff --git a/check_results.py b/check_results.py index c29c89b..ea5bbc4 100644 --- a/check_results.py +++ b/check_results.py @@ -8,8 +8,11 @@ from playwright.sync_api import sync_playwright import params from logs.LogSender import TYPE_EVENT_CHECK_RESULTS, LOG_SUBJECT_EVENT +from notification.AcceptedResultPojo import get_accepted_result_from +from notification.mailer import Mailer from pojo.ReserveResultPojo import ReserveResultPojo from pojo.ResultEnum import ResultEnum +from proxy.proxy_type import ProxyType SORRY_SENTENCE_FR = "nous sommes sincèrement désolés de n'avoir pu vous satisfaire cette fois-ci" SORRY_SENTENCE_EN = "we are extremely sorry that we were not able to fulfill" @@ -18,6 +21,7 @@ PENDING_SENTENCE = "Ce soir, entre 20:00 et 20:30, vous obtiendrez une réponse PENDING_SENTENCE_EN = "This evening between 20:00 and 20:30 you will receive a response by email." BLANK_URL = "about:blank" +mailer = Mailer() class TlsPlaywright(threading.local): def __init__(self) -> None: @@ -37,7 +41,7 @@ class ResultChecker: device = random.choice(params.DEVICES) self.logger.info("模拟设备: " + 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() # hide webdriver information self.page.add_init_script("""() => { @@ -57,29 +61,18 @@ class ResultChecker: def run(self, reserve_pojo: ReserveResultPojo, collection): print("Launched worker in ", threading.current_thread().name) url = reserve_pojo.url - phone_number = reserve_pojo.phone # url_to_check = url.replace("register/", "") # url_to_check = url + "?lang=fr" print("url is " + url) 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 = { - "server": params.PROXY_SERVER, - "username": proxy_username, - "password": params.PROXY_PASSWORD + "server": params.BRIGHT_DATA_PROXY_SERVER, + "username": params.BRIGHT_DATA_PROXY_USERNAME, + "password": params.BRIGHT_DATA_PROXY_PASSWORD } while content is None: content = self.load_page(self.tls.playwright, proxy, url) - random_id_number = params.get_random_id_number_for_proxy() - proxy_username = "panleicim-res-fr-" + random_id_number - print("proxy_username is " + proxy_username) - proxy = { - "server": params.PROXY_SERVER, - "username": proxy_username, - "password": params.PROXY_PASSWORD - } + proxy = params.get_proxy(ProxyType.NETNUT) print(content) self.browser.close() print("Stopped worker in ", threading.current_thread().name) @@ -101,6 +94,11 @@ class ResultChecker: else: print("status is ACCEPTED") status = ResultEnum.ACCEPTED + # send email + try: + mailer.send_email(get_accepted_result_from(reserve_pojo)) + except Exception as err: + print(err) collection.document(reserve_pojo.id).update({u'accepted': status.name}) @@ -120,7 +118,8 @@ def check_results(): for reserve in result_list: count = count + 1 if reserve.accepted is None or ResultEnum.ACCEPTED.value == reserve.accepted: - executor.submit(ResultChecker().run, reserve, collection) + if reserve.url != BLANK_URL: + executor.submit(ResultChecker().run, reserve, collection) else: print("status is " + reserve.accepted) diff --git a/db/local_db_manager.py b/db/local_db_manager.py new file mode 100644 index 0000000..be79267 --- /dev/null +++ b/db/local_db_manager.py @@ -0,0 +1,63 @@ +from builtins import list + +import sqlalchemy +from sqlalchemy import MetaData, Column, String, Integer, DateTime, Table +from sqlalchemy.orm import Session +from sqlalchemy_utils import database_exists, create_database + +import definitions +import params +from pojo.ReserveResultPojo import ReserveResultPojo +from pojo.captcha_error_contact_pojo import ContactInErrorPojo, ERROR_TYPE_CAPTCHA + + +class LocalDbManager: + + def __init__(self, path: str): + self.session = Session(self.init_db(path)) + + def init_db(self, path: str): + uri_for_db = "sqlite:///{}/{}.db?check_same_thread=false".format(path, "appointment") + print(uri_for_db) + # 2.-Turn on database engine + db_engine = sqlalchemy.create_engine(uri_for_db) # ensure this is the correct path for the sqlite file. + if not database_exists(uri_for_db): + create_database(uri_for_db) + connextion = db_engine.connect() + if not db_engine.dialect.has_table(connextion, + ContactInErrorPojo.__tablename__): # If table don't exist, Create. + metadata = MetaData(db_engine) + # Create a table with the appropriate Columns + Table(ContactInErrorPojo.__tablename__, metadata, + Column('id', Integer, primary_key=True, autoincrement=True), + Column('mail', String), + Column('phone', String), + Column('passport', String), + Column('last_name', String), + Column('first_name', String), + Column('ccid', String), + Column('position', Integer), + Column('error_type', Integer), + Column('update_at', DateTime), + Column('create_at', DateTime)) + # Implement the creation + metadata.create_all() + + return db_engine + + def insert_or_update(self, instance: ContactInErrorPojo): + self.session.merge(instance) + 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) diff --git a/definitions.py b/definitions.py index 006fdbb..447ef16 100644 --- a/definitions.py +++ b/definitions.py @@ -1,11 +1,11 @@ import configparser -import os import getpass +import os from pathlib import Path - home = str(Path.home()) config = configparser.ConfigParser() print("home path: " + home) + # check the config file exsistence config_file_path = home + "/config.ini" config.read(config_file_path) @@ -14,5 +14,4 @@ FIREBASE_CONFIG_FILE = config['DEFAULT']['firebase_config_file'] LOGS_DIR = config['DEFAULT']['LOGS_DIR'] username = getpass.getuser() LOG_SOURCE = username - ROOT_DIR = os.path.dirname(os.path.abspath(__file__)) diff --git a/main.py b/main.py index e05c530..2886742 100644 --- a/main.py +++ b/main.py @@ -5,6 +5,8 @@ from concurrent.futures import ThreadPoolExecutor import params from logs.AppLogging import init_logger from pojo.ModeEnum import ModeEnum +from pojo.contact_pojo import ContactPojo +from proxy.proxy_type import ProxyType from utils.excel_reader import ExcelHelper from workers.commandor_page import CommandorPage @@ -14,7 +16,7 @@ logger = logging.getLogger() logger.addHandler(logging.StreamHandler(stream=sys.stdout)) -def start_book(start_number, end_number, store_choose_state=0, max_workers=10, proxy_type=0, +def start_book(start_number, end_number, store_choose_state=0, max_workers=10, proxy_type=ProxyType.BRIGHT_DATA, mode: ModeEnum = ModeEnum.MANUAL): # read the contact, and contact the 2 objects together excel_reader = ExcelHelper() @@ -25,26 +27,31 @@ def start_book(start_number, end_number, store_choose_state=0, max_workers=10, p logger.info(contacts) with ThreadPoolExecutor(max_workers=max_workers) as executor: for contact in contacts: - proxy = get_proxy(contact.phone, proxy_type) + proxy = get_proxy(proxy_type) # start the task in thread executor.submit( CommandorPage(contact, store_type=store_choose_state, proxy_type=proxy_type, mode=mode).start_page, proxy) -def get_proxy(phone_number, proxy_type=0): - # random_id_number = str(phone_number)[1:len(str(phone_number))] - random_id_number = params.get_random_id_number_for_proxy() - proxy_username = params.get_proxy_name_prefix(proxy_type) + random_id_number - logger.info("proxy_username is " + proxy_username) - proxy = { - "server": params.PROXY_SERVER, - "username": proxy_username, - "password": params.PROXY_PASSWORD - } - return proxy +def recheck_the_captcha_error_contacts(store_type=0, mode: ModeEnum = ModeEnum.MANUAL): + # get all the contacts in captcha error + contact_list = params.local_db_manager.get_all_captcha_error_contacts() + with ThreadPoolExecutor(max_workers=10) as executor: + for errorContact in contact_list: + contact = ContactPojo.get_contact_from_error_contact(errorContact) + proxy = get_proxy() + # start the task in thread + executor.submit( + CommandorPage(contact, store_type=store_type, mode=mode).start_page, + proxy) + + +def get_proxy(proxy_type=ProxyType.BRIGHT_DATA): + return params.get_proxy(proxy_type) if __name__ == '__main__': # 修改联系人行,结束联系人行 第三个参数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) diff --git a/notification/AcceptedResultPojo.py b/notification/AcceptedResultPojo.py index 7aafbb5..1490e8b 100644 --- a/notification/AcceptedResultPojo.py +++ b/notification/AcceptedResultPojo.py @@ -21,15 +21,15 @@ class AcceptedResultPojo: self.url = url -def get_accepted_result_from(sms, sim_info: ReserveResultPojo) -> AcceptedResultPojo: +def get_accepted_result_from(sim_info: ReserveResultPojo) -> AcceptedResultPojo: if sim_info is None: # send email even there are no reserve info - return AcceptedResultPojo(sms.text, slot_position=0, sim_position=0, + return AcceptedResultPojo("", slot_position=0, sim_position=0, passport="", email="", phone="", name="", ccid="", url="") else: - return AcceptedResultPojo(sms.text, slot_position=sim_info.slot_position, sim_position=sim_info.sim_position, + return AcceptedResultPojo("", slot_position=sim_info.slot_position, sim_position=sim_info.sim_position, passport=sim_info.passport, email=sim_info.email, phone=sim_info.phone, name="{} {}".format(sim_info.lastName, sim_info.firstName), ccid=sim_info.ccid, url=sim_info.url) diff --git a/notification/mailer.py b/notification/mailer.py index 6a57aa2..b6cf949 100644 --- a/notification/mailer.py +++ b/notification/mailer.py @@ -26,8 +26,8 @@ class Mailer: aws_secret_access_key=secret) def send_email(self, result: AcceptedResultPojo): - recipients = ['panleicim@gmail.com', 'kamenonly@gmail.com', 'tangliang0411@gmail.com'] - # recipients = ['panleicim@gmail.com'] + # recipients = ['panleicim@gmail.com', 'kamenonly@gmail.com', 'tangliang0411@gmail.com'] + recipients = ['panleicim@gmail.com'] mytemplate = Template(filename=definitions.ROOT_DIR + "/templates/appointment_results.html") self.logger.info("send email to " + str(recipients)) diff --git a/params.py b/params.py index c3f32f7..573564a 100644 --- a/params.py +++ b/params.py @@ -1,8 +1,11 @@ import random import string +import definitions from db.DbManager import DataManager +from db.local_db_manager import LocalDbManager from logs.LogSender import LogSender +from proxy.proxy_type import ProxyType firebase_store_manager = DataManager() oracle_log_sender = LogSender() @@ -10,14 +13,41 @@ oracle_log_sender = LogSender() # proxy PROXY_SERVER = "http://gw.ntnt.io:5959" PROXY_PASSWORD = "94sY7zwBG13i" + +BRIGHT_DATA_PROXY_SERVER = "http://zproxy.lum-superproxy.io:22225" +BRIGHT_DATA_PROXY_USERNAME = "lum-customer-c_daabba94-zone-residential-country-fr" +BRIGHT_DATA_MOBILE_PROXY_USERNAME = "lum-customer-c_daabba94-zone-mobile-country-fr-city-paris-mobile" +BRIGHT_DATA_PROXY_PASSWORD = "9dwmh54u3bbh" +BRIGHT_DATA_MOBILE_PROXY_PASSWORD = "fk5f7c2z2c19" PROXY_NAME_PREFIX_RES = "panleicim-res-fr-" PROXY_NAME_PREFIX_CC = "panleicim-cc-fr-" -def get_proxy_name_prefix(proxy_type = 0) -> str: - if proxy_type ==0: - return PROXY_NAME_PREFIX_RES + +def get_proxy_name_prefix() -> str: + return PROXY_NAME_PREFIX_RES + + +def get_proxy(proxy_type: ProxyType): + if proxy_type == ProxyType.NETNUT: + random_id_number = get_random_id_number_for_proxy() + proxy_username = get_proxy_name_prefix() + random_id_number + proxy = { + "server": PROXY_SERVER, + "username": proxy_username, + "password": PROXY_PASSWORD + } else: - return PROXY_NAME_PREFIX_CC + proxy = { + "server": BRIGHT_DATA_PROXY_SERVER, + "username": BRIGHT_DATA_PROXY_USERNAME, + "password": BRIGHT_DATA_PROXY_PASSWORD + } + # proxy = { + # "server": BRIGHT_DATA_PROXY_SERVER, + # "username": BRIGHT_DATA_MOBILE_PROXY_USERNAME, + # "password": BRIGHT_DATA_MOBILE_PROXY_PASSWORD + # } + return proxy def get_random_id_number_for_proxy() -> str: @@ -28,6 +58,8 @@ def get_random_id_number_for_proxy() -> str: 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', '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', diff --git a/pojo/captcha_error_contact_pojo.py b/pojo/captcha_error_contact_pojo.py new file mode 100644 index 0000000..1b155d8 --- /dev/null +++ b/pojo/captcha_error_contact_pojo.py @@ -0,0 +1,23 @@ +from sqlalchemy import Column, String, Integer, DateTime, func +from sqlalchemy.orm import declarative_base + + +Base = declarative_base() + +ERROR_TYPE_CAPTCHA = 1 +TOO_MANY_REQUEST_ERROR = 2 + + +class ContactInErrorPojo(Base): + __tablename__ = "contacts_in_error" + id = Column(Integer, primary_key=True, autoincrement=True) + mail: str = Column(String) + phone: str = Column(String) + passport: str = Column(String) + last_name: str = Column(String) + first_name: str = Column(String) + ccid: str = Column(String) + position: int = Column(Integer) + error_type = Column(Integer) + update_at = Column(DateTime, onupdate=func.now()) + create_at = Column(DateTime, default=func.now()) \ No newline at end of file diff --git a/pojo/contact_pojo.py b/pojo/contact_pojo.py index 77ef414..de491c8 100644 --- a/pojo/contact_pojo.py +++ b/pojo/contact_pojo.py @@ -1,5 +1,7 @@ from dataclasses import dataclass +from pojo.captcha_error_contact_pojo import ContactInErrorPojo + @dataclass class ContactPojo: @@ -35,6 +37,12 @@ class ContactPojo: 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 def from_firestore_dict(source): ccid = source['ccid'] diff --git a/proxy/__init__.py b/proxy/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/proxy/proxy_type.py b/proxy/proxy_type.py new file mode 100644 index 0000000..ca78fa3 --- /dev/null +++ b/proxy/proxy_type.py @@ -0,0 +1,6 @@ +from enum import Enum + + +class ProxyType(Enum): + NETNUT = "NETNUT" + BRIGHT_DATA = "BRIGHT_DATA" diff --git a/requirements.txt b/requirements.txt index da21495..5d1b9ba 100644 --- a/requirements.txt +++ b/requirements.txt @@ -9,4 +9,7 @@ boto3~=1.21.13 openpyxl==3.0.9 google-cloud-firestore==2.4.0 PySimpleGUI==4.60.0 -SpeechRecognition==3.8.1 \ No newline at end of file +SpeechRecognition==3.8.1 +SQLAlchemy~=1.4.37 +requests~=2.27.1 +Mako~=1.2.0 \ No newline at end of file diff --git a/utils/excel_reader.py b/utils/excel_reader.py index 86c9601..faba582 100644 --- a/utils/excel_reader.py +++ b/utils/excel_reader.py @@ -55,6 +55,8 @@ class ExcelHelper: name = raw_name.split(' ') if len(name) == 1: name = raw_name.split('\xa0') + if len(name) == 1: + print("error in " + str(name)) last_name = name[0] if len(name) == 2: first_name = name[-1] @@ -86,10 +88,14 @@ def get_random_phone_numbers(): def generate_email_from_name(first_name: str, last_name: str) -> str: - length = 4 # number of characters in the string. + length = 2 # number of characters in the string. ran = ''.join(random.choices(string.digits, k=length)) separator = ['.', '_', ''] - email = "{}{}{}{}@163.com".format(last_name.lower(), random.choice(separator), first_name.lower(), ran) + domains = ['gmail.com', 'hotmail.com', 'yahoo.com', 'aol.com', 'outlook.com', 'hotmail.fr', 'gmx.com', + 'hotmail.com', 'yahoo.com', 'aol.com', 'hotmail.com'] + email = "{}{}{}{}@{}".format(last_name.lower(), random.choice(separator), + first_name.replace("-", "").replace("'", "").lower(), ran, + random.choice(domains)) print(email) return email @@ -130,6 +136,6 @@ def write_new_contacts_to_excel(valid_contacts: list): if __name__ == '__main__': excel_reader = ExcelHelper() - contacts = excel_reader.read_names("C:/Users/landd/Desktop/rdv/08-06/500_08_06.xlsx") + contacts = excel_reader.read_names("C:/Users/landd/Desktop/rdv/08-06/500.xlsx") print(contacts) write_new_contacts_to_excel(valid_contacts=contacts) diff --git a/utils/generate_random_passport_id.py b/utils/generate_random_passport_id.py index b04a0d9..7843e64 100644 --- a/utils/generate_random_passport_id.py +++ b/utils/generate_random_passport_id.py @@ -1,8 +1,13 @@ import random import string -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'] + +# 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'] +from pojo.captcha_error_contact_pojo import ContactInErrorPojo +from pojo.contact_pojo import ContactPojo + +letters = ['E', 'G', 'M'] def get_random_id_number() -> str: @@ -13,12 +18,24 @@ def get_random_id_number() -> str: # 产生中国护照号 def get_random_passport_id_number() -> str: - S = 7 # number of characters in the string. + S = 8 # number of characters in the string. ran = ''.join(random.choices(string.digits, k=S)) - id_number = "E" + random.choice(letters) + str(ran) + id_number = random.choice(letters) + str(ran) 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__': # for i in range(1,200): # print(get_random_id_number()) diff --git a/utils/name_generator.py b/utils/name_generator.py new file mode 100644 index 0000000..96686c6 --- /dev/null +++ b/utils/name_generator.py @@ -0,0 +1,19 @@ +import json + +import requests + + +def generate_names() -> list: + res = requests.get( + "https://www.namegeneratorfun.com/api/namegenerator?generatorType=list&firstName=&lastName=&minLength=0&maxLength=255&sexId=2&generatorId=43") + response_json = json.loads(res.text) + names = response_json['names'] + # print(names) + return names + + +if __name__ == '__main__': + for i in range(0, 500): + names = generate_names() + for name in names: + print(name) diff --git a/utils/new_profile_1001.xlsx b/utils/new_profile_1001.xlsx new file mode 100644 index 0000000..bad1b82 Binary files /dev/null and b/utils/new_profile_1001.xlsx differ diff --git a/workers/commandor_page.py b/workers/commandor_page.py index a913cb0..19ba28a 100644 --- a/workers/commandor_page.py +++ b/workers/commandor_page.py @@ -7,12 +7,14 @@ import time from typing import Union from playwright.sync_api import sync_playwright - import params -from params import PROXY_SERVER, PROXY_PASSWORD from pojo.ModeEnum import ModeEnum from pojo.ReserveResultPojo import ReserveResultPojo, PublishType +from pojo.captcha_error_contact_pojo import ERROR_TYPE_CAPTCHA, \ + TOO_MANY_REQUEST_ERROR from pojo.contact_pojo import ContactPojo +from proxy.proxy_type import ProxyType +from utils.generate_random_passport_id import get_captcha_error_contact_from_contact from workers.SolveCaptch import SolveCaptcha RDV_URL = "https://rendezvousparis.hermes.com/client/register" @@ -30,7 +32,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_FR = "Une demande avec les données saisies a déjà été validée aujourd’hui." 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 aujourd’hui," +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_FR = "La vérification du captcha a échoué" TIME_OUT = 400000 @@ -51,7 +53,8 @@ class Tls(threading.local): class CommandorPage: tls = Tls() - def __init__(self, contact: ContactPojo, store_type=0, proxy_type=0, mode: ModeEnum = ModeEnum.MANUAL): + def __init__(self, contact: ContactPojo, store_type=0, proxy_type=ProxyType.BRIGHT_DATA, + mode: ModeEnum = ModeEnum.MANUAL): self.otp_value = None self.logger = logging.getLogger("约会页面:" + str(contact.phone)) self.is_finished = False @@ -96,13 +99,7 @@ class CommandorPage: first_page = None while first_page is None: first_page = self.start_browser(proxy, self.tls.playwright, devices) - proxy_username = params.get_proxy_name_prefix(self.proxy_type) + params.get_random_id_number_for_proxy() - self.logger.info("proxy_username is " + proxy_username) - proxy = { - "server": params.PROXY_SERVER, - "username": proxy_username, - "password": params.PROXY_PASSWORD - } + proxy = params.get_proxy(self.proxy_type) # wait for sms_code field # self.clickOnValidBtn() self.thread_event = e @@ -132,7 +129,7 @@ class CommandorPage: self.logger.info("填充信息: " + str(self.contact.phone)) self._set_name(self.contact.last_name, self.contact.first_name) self._setPhoneCountryAndStore() - self._setPhoneNumber(self.contact.phone) + self._setPhoneNumber("0" + str(self.contact.phone)) self._set_email(self.contact.mail) self.setIdNumber(self.contact.passport) self._checkCgu() @@ -259,6 +256,8 @@ class CommandorPage: 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 if not self.is_finished: + params.local_db_manager.insert_or_update( + get_captcha_error_contact_from_contact(self.contact, TOO_MANY_REQUEST_ERROR)) params.oracle_log_sender.send_too_many_error(self.contact) self.is_finished = True self.termine() @@ -266,6 +265,9 @@ class CommandorPage: # this email has been already used self.is_captcha_in_error = True if not self.is_finished: + # save the error to database with contact info + params.local_db_manager.insert_or_update( + get_captcha_error_contact_from_contact(self.contact, ERROR_TYPE_CAPTCHA)) params.oracle_log_sender.send_captcha_error(self.contact) self.is_finished = True # no need to retry captcha, if retry ,will generate DOUBLE_REQUEST_ERROR_MESSAGE @@ -312,9 +314,6 @@ class CommandorPage: except Exception as error: self.logger.error(error) - def clear_app_data(self): - pass - def fill_otp(self, otp: str): self.page.focus(OTP_FIELD_ID) time.sleep(get_random_wait_time()) @@ -334,6 +333,7 @@ class CommandorPage: result.id = id result.store_type = self.store_type params.firebase_store_manager.save(result) + params.local_db_manager.handle_success(result) if status is PublishType.SUCCESS: self.on_success(result) time.sleep(2) @@ -376,20 +376,12 @@ def on_success(result: ReserveResultPojo): def launch_page(): - PROXY_USERNAME = "panleicim-res-fr-" + params.get_random_id_number_for_proxy() - print("proxy_username is " + PROXY_USERNAME) - proxy = { - "server": PROXY_SERVER, - "username": PROXY_USERNAME, - "password": PROXY_PASSWORD - } passport_number = get_random_id_number() - print("passport_number is " + passport_number) contact = ContactPojo(phone_number="+33758912245", passport_number=passport_number, last_name="XU", first_name="xingzhen", mail="ColbyPatel653@gmail.com", ccid="", position=0) page = CommandorPage(contact, store_type=1) - return page.start_page(None) + return page.start_page(params.get_proxy()) def wait_for_otp(event: threading.Event, commandor: CommandorPage):