diff --git a/scripts/sms_first_campaign.py b/scripts/sms_first_campaign.py index 7224791..f6fe219 100644 --- a/scripts/sms_first_campaign.py +++ b/scripts/sms_first_campaign.py @@ -106,14 +106,37 @@ def load_settings(conn): # ─── SMS API ───────────────────────────────────────────────────────────────── def normalize_phone(phone): - """Нормализует телефон: только цифры, начинается с 7. Возвращает None если пустой.""" + """Нормализует телефон: только цифры, начинается с 7. Возвращает None если пустой. + + Обрабатляет: + - +7XXX, 7XXX, 8XXX, XXX (без кода страны) → 7XXX + - Текст/имена в поле (Екатерина +7978...) → извлекает только цифры + - Два номера в одном поле (XXX / YYY) → берёт первый (обрезает до 11 цифр) + - Минимум 10 цифр (без 7), максимум 11 (с 7) + """ clean = "".join(c for c in str(phone) if c.isdigit()) if len(clean) < 10: return None - if clean.startswith("8"): + + # If 8 prefix (Russian landline style) → replace with 7 + if clean.startswith("8") and len(clean) == 11: clean = "7" + clean[1:] + # If starts with 7 and is 11 digits → ok + elif clean.startswith("7") and len(clean) == 11: + pass + # If 10 digits (no country code) → prepend 7 + elif len(clean) == 10: + clean = "7" + clean + # If too long (multiple numbers concatenated) → take first 10 digits + prepend 7 + elif len(clean) > 11: + # Try to extract first number: look for 10-digit sequence starting with 9 + # Common case: "9242377967 / 89783225219" → "9242377967" (10 digits) + clean10 = clean[:10] + clean = "7" + clean10 + # If starts with 7 but wrong length → prepend 7 to first 10 digits elif not clean.startswith("7"): clean = "7" + clean + return clean def send_sms(phone, message, api_id): diff --git a/scripts/sms_paid_storage_campaign.py b/scripts/sms_paid_storage_campaign.py index e1433d7..b22edaa 100644 --- a/scripts/sms_paid_storage_campaign.py +++ b/scripts/sms_paid_storage_campaign.py @@ -89,13 +89,28 @@ def load_settings(conn): # ─── SMS API ───────────────────────────────────────────────────────────────── def normalize_phone(phone): + """Нормализует телефон: только цифры, начинается с 7. Возвращает None если пустой. + + Обрабатывает: + - +7XXX, 7XXX, 8XXX, XXX (без кода страны) → 7XXX + - Текст/имена в поле (Екатерина +7978...) → извлекает только цифры + - Два номера в одном поле (XXX / YYY) → берёт первый + - Минимум 10 цифр, максимум 11 + """ clean = "".join(c for c in str(phone) if c.isdigit()) if len(clean) < 10: return None - if clean.startswith("8"): + + if len(clean) > 11: + clean = clean[:10] + + if clean.startswith("8") and len(clean) == 11: clean = "7" + clean[1:] - elif not clean.startswith("7"): + elif len(clean) == 10: clean = "7" + clean + elif not clean.startswith("7") and len(clean) == 11: + clean = "7" + clean[1:] + return clean def send_sms(phone, message, api_id): diff --git a/scripts/sms_second_campaign.py b/scripts/sms_second_campaign.py index 9ee6137..9e7e931 100644 --- a/scripts/sms_second_campaign.py +++ b/scripts/sms_second_campaign.py @@ -111,14 +111,37 @@ def load_settings(conn): # ─── SMS API ───────────────────────────────────────────────────────────────── def normalize_phone(phone): - """Нормализует телефон: только цифры, начинается с 7. Возвращает None если пустой.""" + """Нормализует телефон: только цифры, начинается с 7. Возвращает None если пустой. + + Обрабатляет: + - +7XXX, 7XXX, 8XXX, XXX (без кода страны) → 7XXX + - Текст/имена в поле (Екатерина +7978...) → извлекает только цифры + - Два номера в одном поле (XXX / YYY) → берёт первый (обрезает до 11 цифр) + - Минимум 10 цифр (без 7), максимум 11 (с 7) + """ clean = "".join(c for c in str(phone) if c.isdigit()) if len(clean) < 10: return None - if clean.startswith("8"): + + # If 8 prefix (Russian landline style) → replace with 7 + if clean.startswith("8") and len(clean) == 11: clean = "7" + clean[1:] + # If starts with 7 and is 11 digits → ok + elif clean.startswith("7") and len(clean) == 11: + pass + # If 10 digits (no country code) → prepend 7 + elif len(clean) == 10: + clean = "7" + clean + # If too long (multiple numbers concatenated) → take first 10 digits + prepend 7 + elif len(clean) > 11: + # Try to extract first number: look for 10-digit sequence starting with 9 + # Common case: "9242377967 / 89783225219" → "9242377967" (10 digits) + clean10 = clean[:10] + clean = "7" + clean10 + # If starts with 7 but wrong length → prepend 7 to first 10 digits elif not clean.startswith("7"): clean = "7" + clean + return clean def send_sms(phone, message, api_id):