Merge branch 'feature/auto_with_checkresults' into feature/automatic
This commit is contained in:
+10
-12
@@ -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
|
||||
|
||||
+15
-16
@@ -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,6 +118,7 @@ def check_results():
|
||||
for reserve in result_list:
|
||||
count = count + 1
|
||||
if reserve.accepted is None or ResultEnum.ACCEPTED.value == reserve.accepted:
|
||||
if reserve.url != BLANK_URL:
|
||||
executor.submit(ResultChecker().run, reserve, collection)
|
||||
else:
|
||||
print("status is " + reserve.accepted)
|
||||
|
||||
@@ -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)
|
||||
+2
-3
@@ -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__))
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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))
|
||||
|
||||
@@ -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:
|
||||
|
||||
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',
|
||||
|
||||
@@ -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())
|
||||
@@ -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']
|
||||
|
||||
@@ -0,0 +1,6 @@
|
||||
from enum import Enum
|
||||
|
||||
|
||||
class ProxyType(Enum):
|
||||
NETNUT = "NETNUT"
|
||||
BRIGHT_DATA = "BRIGHT_DATA"
|
||||
@@ -10,3 +10,6 @@ openpyxl==3.0.9
|
||||
google-cloud-firestore==2.4.0
|
||||
PySimpleGUI==4.60.0
|
||||
SpeechRecognition==3.8.1
|
||||
SQLAlchemy~=1.4.37
|
||||
requests~=2.27.1
|
||||
Mako~=1.2.0
|
||||
@@ -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)
|
||||
|
||||
@@ -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())
|
||||
|
||||
@@ -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)
|
||||
Binary file not shown.
+16
-24
@@ -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):
|
||||
|
||||
Reference in New Issue
Block a user