From ae01db56fed4054db6c3cce4f9418d2b04d9e339 Mon Sep 17 00:00:00 2001 From: Lei PAN Date: Tue, 24 May 2022 21:51:55 +0200 Subject: [PATCH 1/5] check blank page in check_results.py --- check_results.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/check_results.py b/check_results.py index 3cfae99..67d61fd 100644 --- a/check_results.py +++ b/check_results.py @@ -16,7 +16,7 @@ SORRY_SENTENCE_EN = "we are extremely sorry that we were not able to fulfill" NOT_AVAILABLE_CONTENT = "For more than 130 years, our House has offered its full expertise to satisfy" PENDING_SENTENCE = "Ce soir, entre 20:00 et 20:30, vous obtiendrez une réponse par e-mail." PENDING_SENTENCE_EN = "This evening between 20:00 and 20:30 you will receive a response by email." - +BLANK_URL = "about:blank" class TlsPlaywright(threading.local): def __init__(self) -> None: @@ -119,8 +119,10 @@ if __name__ == '__main__': with ThreadPoolExecutor(max_workers=5) as executor: for reserve in result_list: count = count + 1 - if reserve.accepted is None or ResultEnum.PENDING.value == reserve.accepted: - executor.submit(ResultChecker().run, reserve, collection) + if reserve.accepted is None: + # or ResultEnum.PENDING.value == reserve.accepted: + if reserve.url != BLANK_URL: + executor.submit(ResultChecker().run, reserve, collection) else: print("status is " + reserve.accepted) From f303c33752feb4907ff4985d2f6ff6b16bd157da Mon Sep 17 00:00:00 2001 From: Lei PAN Date: Fri, 27 May 2022 22:32:07 +0200 Subject: [PATCH 2/5] optimize check_results.py --- check_results.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/check_results.py b/check_results.py index 67d61fd..104b74f 100644 --- a/check_results.py +++ b/check_results.py @@ -116,11 +116,10 @@ if __name__ == '__main__': reserve_pojo = ReserveResultPojo.from_firestore_dict(appointment.to_dict()) result_list.append(reserve_pojo) - with ThreadPoolExecutor(max_workers=5) as executor: + with ThreadPoolExecutor(max_workers=20) as executor: for reserve in result_list: count = count + 1 - if reserve.accepted is None: - # or ResultEnum.PENDING.value == reserve.accepted: + if reserve.accepted is None or ResultEnum.PENDING.value == reserve.accepted: if reserve.url != BLANK_URL: executor.submit(ResultChecker().run, reserve, collection) else: From d45f78c44a416c6212f34c7bc991a4ed5d39cb6d Mon Sep 17 00:00:00 2001 From: Lei PAN Date: Sun, 29 May 2022 22:20:25 +0200 Subject: [PATCH 3/5] add new fun to generate profiles --- .gitignore | 1 + utils/excel_reader.py | 95 +++++++++++++++++++++++++++ utils/export_valid_profiles.py | 32 ++++----- utils/generate_random_passport_id.py | 3 +- utils/new_profile_500.xlsx | Bin 0 -> 27256 bytes 5 files changed, 113 insertions(+), 18 deletions(-) create mode 100644 utils/new_profile_500.xlsx diff --git a/.gitignore b/.gitignore index 606c743..496accb 100644 --- a/.gitignore +++ b/.gitignore @@ -14,3 +14,4 @@ appointment_*.log ./build ./dist ./contact_all.xlsx +./utils/new_profile_500.xlsx diff --git a/utils/excel_reader.py b/utils/excel_reader.py index df90efc..439baf5 100644 --- a/utils/excel_reader.py +++ b/utils/excel_reader.py @@ -1,9 +1,15 @@ import json +import random +import string import pandas as pandas +import xlsxwriter + from definitions import CONTACT_LIST_FILE from pojo.contact_pojo import ContactPojo +phone_number_prefix = ['6', '7'] + class ExcelHelper: @@ -36,3 +42,92 @@ class ExcelHelper: mail=contact_dict['email']) contact_list.append(contact) return contact_list + + def read_names(self, file_name=CONTACT_LIST_FILE) -> list: + contact_list_in_json = pandas.read_excel(file_name).to_json(orient='records') + contact_dict_list = json.loads(contact_list_in_json) + contact_list = [] + count = 2 + for contact_dict in contact_dict_list: + if contact_dict['name']: + raw_name = contact_dict['name'].strip() + name = raw_name.split(' ') + if len(name) == 1: + name = raw_name.split('\xa0') + last_name = name[0] + if len(name) == 2: + first_name = name[-1] + else: + first_name = ''.join(name[1:len(name)]) + + contact = ContactPojo(phone_number="", + last_name=last_name, + first_name=first_name, + passport_number="", + mail="") + + if len(first_name) == 0: + print("first_name is empty: position:" + str(count)) + print(name) + if len(last_name) == 0: + print("last_name is empty: position:" + str(count)) + count = count + 1 + contact_list.append(contact) + + return contact_list + + +def get_random_phone_numbers(): + length = 8 # number of characters in the string. + ran = ''.join(random.choices(string.digits, k=length)) + id_number = random.choice(phone_number_prefix) + str(ran) + return id_number + + +def generate_email_from_name(first_name: str, last_name: str) -> str: + length = 3 # number of characters in the string. + ran = ''.join(random.choices(string.digits, k=length)) + email = "{}{}{}@163.com".format(last_name.lower(), first_name.lower(), ran) + print(email) + return email + + +def get_random_id_number() -> str: + # write_the_valid_profiles_to_excel() + S = 8 # number of characters in the string. + # call random.choices() string module to find the string in Uppercase + numeric data. + ran = ''.join(random.choices(string.digits, k=S)) + print("The randomly generated string is : 94" + str(ran)) # print the random data + return ran + + +def write_new_contacts_to_excel(valid_contacts: list): + row = 0 + col = 0 + # Create a workbook and add a worksheet. + workbook = xlsxwriter.Workbook('new_profile_{}.xlsx'.format(len(valid_contacts))) + header_data = ['name', 'phone', 'passport', 'email'] + worksheet = workbook.add_worksheet() + header_format = workbook.add_format({'bold': True}) + + for col_num, data in enumerate(header_data): + worksheet.write(row, col_num, data, header_format) + row = row + 1 + for info in valid_contacts: + info.phone = get_random_phone_numbers() + info.passport = get_random_id_number() + info.mail = generate_email_from_name(info.first_name, info.last_name) + # Iterate over the data and write it out row by row. + worksheet.write(row, col, "{} {}".format(info.last_name, info.first_name)) + worksheet.write(row, col + 1, info.phone) + worksheet.write(row, col + 2, info.passport) + worksheet.write(row, col + 3, info.mail) + row += 1 + workbook.close() + + +if __name__ == '__main__': + excel_reader = ExcelHelper() + contacts = excel_reader.read_names("new_profile_500.xlsx") + print(contacts) + # write_new_contacts_to_excel(valid_contacts=contacts) diff --git a/utils/export_valid_profiles.py b/utils/export_valid_profiles.py index 1213e4b..eb83786 100644 --- a/utils/export_valid_profiles.py +++ b/utils/export_valid_profiles.py @@ -19,32 +19,32 @@ def get_random_id_number() -> str: def write_the_valid_profiles_to_excel(): - day_list = ['2022-03-23','2022-03-24','2022-03-25'] + day_list = ['2022-05-28'] collection = [] for day in day_list: - collection.extend(params.firebase_store_manager.get_all_successful_items_for_day(day).stream()) + collection.extend(params.firebase_store_manager.get_all_successful_items_for_day(day, source_from=None).stream()) valid_contacts = [] # exist_contacts = ExcelHelper().read_contacts() for valid_appointment in collection: reserve_pojo = ReserveResultPojo.from_firestore_dict(valid_appointment.to_dict()) # check whether the contact exists already - exist = [contact for contact in valid_contacts if contact.mail == reserve_pojo.email] - if len(exist) == 0: - contact = ContactPojo(reserve_pojo.phone, passport_number=get_random_id_number(), - last_name=reserve_pojo.lastName, first_name=reserve_pojo.firstName, ccid="", - mail=reserve_pojo.email, position=0) - # seed = 8 # number of characters in the string. - # call random.choices() string module to find the string in Uppercase + numeric data. - # contact.passport = get_random_id_number() - # if contact.passport == None or len(contact.passport) == 0: - # old_contact = [item for item in exist_contacts if item.mail == contact.mail] - # if len(old_contact) > 0: - # contact.passport = old_contact[0].passport + # exist = [contact for contact in valid_contacts if contact.mail == reserve_pojo.email] + # if len(exist) == 0: + contact = ContactPojo(reserve_pojo.phone, passport_number=get_random_id_number(), + last_name=reserve_pojo.lastName, first_name=reserve_pojo.firstName, ccid="", + mail=reserve_pojo.email, position=0) + # seed = 8 # number of characters in the string. + # call random.choices() string module to find the string in Uppercase + numeric data. + # contact.passport = get_random_id_number() + # if contact.passport == None or len(contact.passport) == 0: + # old_contact = [item for item in exist_contacts if item.mail == contact.mail] + # if len(old_contact) > 0: + # contact.passport = old_contact[0].passport - print(contact) - valid_contacts.append(contact) + print(contact) + valid_contacts.append(contact) row = 0 col = 0 diff --git a/utils/generate_random_passport_id.py b/utils/generate_random_passport_id.py index e01ccca..a892600 100644 --- a/utils/generate_random_passport_id.py +++ b/utils/generate_random_passport_id.py @@ -8,8 +8,7 @@ letters = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'J', 'K', 'P', 'Q', 'R', 'S', def get_random_id_number() -> str: S = 8 # number of characters in the string. ran = ''.join(random.choices(string.digits, k=S)) - id_number = str(ran) - # print("The randomly generated string is : 94" + str(ran)) # print the random data + id_number = str(ran) return id_number diff --git a/utils/new_profile_500.xlsx b/utils/new_profile_500.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..77bcbe78d34a0062ef19b21aa2ee8069240dbd1f GIT binary patch literal 27256 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 Date: Tue, 31 May 2022 23:14:55 +0200 Subject: [PATCH 4/5] optimize check_results.py and add export contact --- check_results.py | 2 +- utils/excel_reader.py | 9 +++++---- utils/export_valid_profiles.py | 2 +- 3 files changed, 7 insertions(+), 6 deletions(-) diff --git a/check_results.py b/check_results.py index 104b74f..39ad769 100644 --- a/check_results.py +++ b/check_results.py @@ -116,7 +116,7 @@ if __name__ == '__main__': reserve_pojo = ReserveResultPojo.from_firestore_dict(appointment.to_dict()) result_list.append(reserve_pojo) - with ThreadPoolExecutor(max_workers=20) as executor: + with ThreadPoolExecutor(max_workers=10) as executor: for reserve in result_list: count = count + 1 if reserve.accepted is None or ResultEnum.PENDING.value == reserve.accepted: diff --git a/utils/excel_reader.py b/utils/excel_reader.py index 439baf5..04a8281 100644 --- a/utils/excel_reader.py +++ b/utils/excel_reader.py @@ -85,9 +85,10 @@ def get_random_phone_numbers(): def generate_email_from_name(first_name: str, last_name: str) -> str: - length = 3 # number of characters in the string. + length = 4 # number of characters in the string. ran = ''.join(random.choices(string.digits, k=length)) - email = "{}{}{}@163.com".format(last_name.lower(), first_name.lower(), ran) + separator = ['.', '_', ''] + email = "{}{}{}{}@163.com".format(last_name.lower(), random.choice(separator), first_name.lower(), ran) print(email) return email @@ -128,6 +129,6 @@ def write_new_contacts_to_excel(valid_contacts: list): if __name__ == '__main__': excel_reader = ExcelHelper() - contacts = excel_reader.read_names("new_profile_500.xlsx") + contacts = excel_reader.read_names("C:/Users/landd/Desktop/1000.xlsx") print(contacts) - # write_new_contacts_to_excel(valid_contacts=contacts) + write_new_contacts_to_excel(valid_contacts=contacts) diff --git a/utils/export_valid_profiles.py b/utils/export_valid_profiles.py index eb83786..6ef769b 100644 --- a/utils/export_valid_profiles.py +++ b/utils/export_valid_profiles.py @@ -19,7 +19,7 @@ def get_random_id_number() -> str: def write_the_valid_profiles_to_excel(): - day_list = ['2022-05-28'] + day_list = ['2022-05-30'] collection = [] for day in day_list: From 8e31c25527d9d90539022d25f57bf128f60612eb Mon Sep 17 00:00:00 2001 From: Lei PAN Date: Wed, 1 Jun 2022 16:38:09 +0200 Subject: [PATCH 5/5] use proxy of brightdatao --- check_results.py | 15 +++++++-------- params.py | 10 ++++++++-- utils/new_profile_500.xlsx | Bin 27256 -> 0 bytes workers/commandor_page.py | 12 ++++++------ 4 files changed, 21 insertions(+), 16 deletions(-) delete mode 100644 utils/new_profile_500.xlsx diff --git a/check_results.py b/check_results.py index 39ad769..a826277 100644 --- a/check_results.py +++ b/check_results.py @@ -18,6 +18,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" + class TlsPlaywright(threading.local): def __init__(self) -> None: self.playwright = sync_playwright().start() @@ -65,19 +66,17 @@ class ResultChecker: 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 + "server": params.BRIGHT_DATA_PROXY_SERVER, + "username": params.BRIGHT_DATA_PROXY_USERNAME, + "password": params.BRIGHT_DATA_PROXY_PASSWORD } print(content) self.browser.close() diff --git a/params.py b/params.py index 0fc1bf0..dbea4df 100644 --- a/params.py +++ b/params.py @@ -13,15 +13,21 @@ 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_PROXY_PASSWORD = "9dwmh54u3bbh" 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(proxy_type=0) -> str: + if proxy_type == 0: return PROXY_NAME_PREFIX_RES else: return PROXY_NAME_PREFIX_CC + def get_random_id_number_for_proxy() -> str: S = 8 # number of characters in the string. ran = ''.join(random.choices(string.digits, k=S)) diff --git a/utils/new_profile_500.xlsx b/utils/new_profile_500.xlsx deleted file mode 100644 index 77bcbe78d34a0062ef19b21aa2ee8069240dbd1f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 27256 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