diff --git a/src/person_name/contact_manager.py b/src/person_name/contact_manager.py index c20a6db..14b4f49 100755 --- a/src/person_name/contact_manager.py +++ b/src/person_name/contact_manager.py @@ -16,7 +16,7 @@ DEFAULT_SERIAL_TO_IGNORE = ["47e7e36b", "bitbrowser"] def upload_contacts_list(): - _contacts_to_book = read_contacts(str(Path.home()) + "/Desktop/contact_list_2025-05-20.xlsx") + _contacts_to_book = read_contacts(str(Path.home()) + "/Desktop/contact_list_2026-04-11_FIXED.xlsx") return _contacts_to_book @@ -119,7 +119,7 @@ def write_new_contacts_to_excel(valid_contacts: list, file_name=str(datetime.dat def generate_valid_contact_list_for_day(segment_number=1): - _collection_name = "2026-03-26" + _collection_name = "2026-04-11" _valid_contact_list = MONGO_STORE_MANAGER.get_all_successful_items_for_one_day(_collection_name) _all_contacts = MONGO_STORE_MANAGER.get_all_contacts_to_book() _contact_to_save = [] @@ -131,9 +131,11 @@ def generate_valid_contact_list_for_day(segment_number=1): if _true_contact.mail == _contact.mail: _contact.last_name = _true_contact.last_name _contact.phone = _true_contact.phone - _contact.passport = str(_true_contact.resident_card_number)[:9] + _contact.passport = str(_true_contact.passport)[:9] _contact.first_name = _true_contact.first_name - _contact.resident_card_number = str(_true_contact.resident_card_number)[:9] + _contact.resident_card_number = str(_true_contact.passport)[:9] + if _contact.mail == "angielovato14903@yahoo.com": + print("no resident card number for " + _contact.mail) print("{}:{}".format(_true_contact.mail, _true_contact.source_from)) if isinstance(_true_contact.source_from, str) and _true_contact.source_from is not None and len(_true_contact.source_from) > 0: print(_true_contact.source_from) @@ -285,14 +287,80 @@ def write_resident_card_number_to_contact_list(file_to_read, file_name="contact_ write_list_with_segment_number(file_name, _contacts_to_book, 1) +def check_resident_card_number(file_path): + """读取 contact_list Excel 文件,检查 resident_card_number 是否为 9 位纯数字字符串。 + 若不是则输出该联系人信息,并调用 generate_single_titre_sejour_number() 生成新值进行修复。 + 最终将所有联系人(含修复结果)写入原文件名+_FIXED 的新文件,保持原有列格式。""" + _contact_list = read_contacts(file_path) + _has_invalid = False + for _contact in _contact_list: + rcn = str(_contact.resident_card_number) if _contact.resident_card_number is not None else "" + if not (len(rcn) == 9 and rcn.isdigit()): + print(_contact) + _contact.resident_card_number = generate_single_titre_sejour_number() + _has_invalid = True + + if not _has_invalid: + print("[OK] Tous les resident_card_number sont valides (9 chiffres). Aucun fichier créé.") + return + + # Construire le chemin du fichier de sortie : même dossier, nom + _FIXED + extension + p = Path(file_path) + output_file = str(p.parent / (p.stem + "_FIXED" + p.suffix)) + + # Écriture dans le même format que write_new_contacts_to_excel + row = 0 + col = 0 + workbook = xlsxwriter.Workbook(output_file, {'nan_inf_to_errors': True}) + header_data = ['name', 'phone', 'passport', 'email', 'store', 'serial', 'ip_country', 'ua', + 'resident_card_number', 'source_from'] + 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 = 1 + + def safe_write_val(row_num, col_num, value): + try: + if isinstance(value, str): + if value.lower() in ['nan', 'inf', '-inf']: + worksheet.write(row_num, col_num, "") + else: + worksheet.write(row_num, col_num, value) + elif isinstance(value, (int, float)): + if math.isnan(value) or math.isinf(value): + worksheet.write(row_num, col_num, "") + else: + worksheet.write(row_num, col_num, value) + else: + worksheet.write(row_num, col_num, value if value is not None else "") + except (TypeError, ValueError): + worksheet.write(row_num, col_num, "") + + for info in _contact_list: + 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) + worksheet.write(row, col + 4, info.store) + worksheet.write(row, col + 5, info.serial) + worksheet.write(row, col + 6, info.ip_country) + safe_write_val(row, col + 7, info.ua) + worksheet.write(row, col + 8, info.resident_card_number) + worksheet.write(row, col + 9, info.source_from) + row += 1 + workbook.close() + print("Fichier corrigé écrit dans : " + output_file) + + if __name__ == '__main__': # write_resident_card_number_to_contact_list(file_to_read=str(Path.home()) + "/Desktop/contact_list_all_13.xlsx", # file_name="contact_list_all_13") - # contacts_to_book = upload_contacts_list() - # MONGO_STORE_MANAGER.upload_contact_list(contacts_to_book) + contacts_to_book = upload_contacts_list() + MONGO_STORE_MANAGER.upload_contact_list(contacts_to_book) # print("start at {}".format(datetime.datetime.now())) - generate_valid_contact_list_for_day(segment_number=2) - # generate_contact_from_mail_list("/Users/lpan/Downloads/邮箱及密码_23_03_25_yahoo.xlsx") + # generate_valid_contact_list_for_day(segment_number=2) + # generate_contact_from_mail_list("/Users/panlei/Downloads/100_yahoo_11_04.xlsx") # print("end at {}".format(datetime.datetime.now())) # update_contact_list_not_received_mail() # get_old_validated_contact_list() @@ -301,4 +369,5 @@ if __name__ == '__main__': # merge_contact_list_files( # "/Users/lpan/Desktop/contact_list_2024-11-06.xlsx" # ]) + # check_resident_card_number(str(Path.home()) + "/Desktop/contact_list_2026-04-11_FIXED.xlsx") # fix_phone_number_format(str(Path.home()) + "/Desktop/gmx_ch_100_2024-06-13.xlsx")