號碼品質決定一切:如何用自動化腳本測試臨時號碼的「純淨度」

Live Coding 風格的純實戰指南——來自一個為出海專案建過號碼純淨度檢測流水線的 QA 老兵

大實話:你花 $0.5 買的「新鮮號」,可能已經被 Google、Telegram、TikTok 同時標記為「高風險」。買號不測號,等於閉著眼扔錢。
本文給出一套自動化腳本,讓你在買號後的 30 秒內,看清這個號到底是「乾淨」還是「髒」。

一、純淨度的量化標準(全文地基)

號碼純淨度(Number Purity)衡量該號碼在主流平台的信用狀態:未被註冊過、未被風控標記、未被加入黑名單。我們將純淨度分為四級,作為自動化評分的判定目標。

S
完全純淨
A
輕度污染
B
重度污染
C
完全無效
等級定義核心指標可用性結論
S完全純淨5 個主流平台均未註冊、可接收驗證碼且無延時審核;回應時間 <15s;無異常狀態碼優先使用,安全可靠
A輕度污染1-2 個平台已註冊或觸發二次驗證,核心平台(Google/WhatsApp)仍可用;回應時間 <30s可用,注意避開已污染平台
B重度污染3 個以上平台已被註冊,或核心平台拒絕註冊;回應時間 >60s 或無回應僅能用於不重要的測試,或直接廢棄
C完全無效號碼無法接通、停機,或所有主流平台拒絕發送驗證碼立刻退款或移入廢棄池

二、自動化測試腳本的完整實現

下面的 Python 偽代碼覆蓋了從獲取號碼到自動隔離的完整生命週期。你可以用 requests 搭配 playwrightselenium 實作,重點在邏輯而非具體框架。

Step 1:從接碼平台獲取一個待測號碼

def acquire_number(api_base_url, api_key, country='US', service='google'):
    resp = requests.get(
        f"{api_base_url}/getNumber",
        params={'api_key': api_key, 'country': country, 'service': service}
    )
    data = resp.json()
    # 必須返回 phone_number 和 activation_id(用於後續輪詢簡訊)
    return data['phone_number'], data['activation_id']

Step 2:多平台併發觸發驗證碼

PLATFORM_LIST = [
    ('Google', 'https://accounts.google.com/signup'),
    ('WhatsApp', 'https://web.whatsapp.com/phone'),
    ('Telegram', 'https://web.telegram.org/k/'),
    ('TikTok', 'https://www.tiktok.com/signup/phone-or-email/phone'),
    ('Amazon', 'https://www.amazon.com/ap/register')
]

def trigger_one(phone, platform_name, url):
    # 使用 Playwright 打開無頭瀏覽器,模擬裝置環境
    # 點擊“發送驗證碼”,記錄狀態碼與是否成功觸發
    # 回傳 {'platform': platform_name, 'can_register': True/False, 'status_code': 200/403 etc.}
    pass

def concurrent_trigger(phone):
    results = {}
    with ThreadPoolExecutor(max_workers=5) as executor:
        future_to_plat = {
            executor.submit(trigger_one, phone, name, url): name
            for name, url in PLATFORM_LIST
        }
        for future in as_completed(future_to_plat):
            res = future.result()
            results[res['platform']] = res
    return results

Step 3:輪詢簡訊回收站

def poll_sms(api_base_url, api_key, activation_id, max_wait=60):
    start = time.time()
    while time.time() - start < max_wait:
        resp = requests.get(
            f"{api_base_url}/getStatus",
            params={'api_key': api_key, 'activation_id': activation_id}
        )
        data = resp.json()
        if data.get('status') == 'ok' and data.get('sms_list'):
            return data['sms_list']  # 包含發送方、時間戳、內容等
        time.sleep(5)
    return []

Step 4:加權評分與判定

def compute_purity(trigger_results, sms_records):
    score = 100
    core_platforms = {'Google', 'WhatsApp'}
    for plat, res in trigger_results.items():
        if not res['can_register']:
            score -= 20 if plat in core_platforms else 10
            continue
        delay = sms_records.get(plat, {}).get('delay_seconds', 999)
        if delay > 60:
            score -= 10
        elif delay > 30:
            score -= 5
        sms_text = sms_records.get(plat, {}).get('content', '')
        if any(kw in sms_text for kw in ['已註冊', '已被佔用', 'invalid', 'already']):
            score -= 15
    if score >= 90: grade = 'S'
    elif score >= 70: grade = 'A'
    elif score >= 50: grade = 'B'
    else: grade = 'C'
    return score, grade

Step 5:號碼自動隔離(Redis 原子操作)

import redis
r = redis.Redis(decode_responses=True)

def isolate_number(phone, grade):
    if grade in ('S', 'A'):
        r.smove('pool:pending', 'pool:clean', phone)
    else:
        r.smove('pool:pending', 'pool:dirty', phone)
        # 記錄原因以便後續申訴退款
        r.hset(f'reason:{phone}', mapping={'grade': grade, 'time': time.time()})

三、純淨度檢測維度與權重對應表

維度測量方法權重說明
可註冊性註冊介面狀態碼40%能否成功觸發驗證碼發送,最核心指標
回應延遲觸發→收到簡訊的時間差20%健康號碼通常 <15s
歷史狀態簡訊內容為「首次」或「已註冊」25%已註冊的號碼不可用於新帳號
並發可用平台數5 個主流平台中有幾個可成功註冊15%越多可用,號碼越乾淨

四、工程化集成與告警設計

模組化目錄結構

number-purity-check/
├── config.yaml                 # 接碼平台 API 金鑰、目標國家等
├── pipeline/
│   ├── acquire.py              # 從平台取號
│   ├── trigger.py              # 多平台觸發驗證碼(Playwright)
│   ├── poll.py                 # 輪詢簡訊
│   ├── scorer.py               # 加權評分邏輯
│   └── isolate.py              # Redis 隔離操作
├── ci/
│   ├── github-actions.yaml
│   └── jenkinsfile
├── reports/
│   └── weekly_report.md        # 自動生成週報模板
└── tests/
    └── test_purity.py

CI/CD 集成(GitHub Actions)

on:
  schedule:
    - cron: '0 5 * * *'   # 每天凌晨 5 點 UTC
jobs:
  purity-check:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - run: pip install -r requirements.txt
      - run: python pipeline/run.py --sample 0.2
      - run: python reports/post_to_slack.py

監控指標與告警閾值

號碼品質週報模板 (Markdown)

# 號碼品質週報 – 2026-03-30 至 2026-04-05
- 被測號碼數:1,500
- S 級:42% (↓5%)  ⚠️ 趨勢下降
- A 級:33% (↑2%)
- B 級:18% (↑4%)
- C 級:7% (↓1%)

## 異常警示
- Google 拒絕率:52% → 58% (已超過 50% 警戒)
- TikTok 延遲中位數:18s → 29s

## 行動建議
- 提升非 VoIP 物理卡採購佔比,降低 Google 風控影響
- 評估引入第二備選號碼供應商(例如 SMSPool 替代部分 5sim 流量)

五、踩坑實錄:10 個實戰故障與預防

陷阱 1:觸發頻率過高被運營商屏蔽
同一 IP 短時間內向多個平台同時觸發驗證碼,可能被識別為惡意行為。
解法:併發請求間加入至少 600ms 延遲,並透過代理池分散來源 IP。
陷阱 2:平台冷卻期導致連坐封禁
WhatsApp、Telegram 對同一 IP 連續註冊多個號碼會觸發冷卻期,後續號碼全部無效。
解法:每個號碼測試使用獨立瀏覽器 context 和獨立 IP,模擬真實間隔。
陷阱 3:接碼平台返回快取舊簡訊
部分平台回傳歷史簡訊,導致誤判為「已註冊」。
解法:過濾時間戳超過 5 分鐘的簡訊,要求 API 僅返回本次 activation_id 的新訊息。
陷阱 4:Playwright 瀏覽器指紋被識別
預設無頭模式可能被網站檢測為自動化工具,導致驗證碼不發送。
解法:使用 playwright.chromium.launch(headless=False) 或強化指紋偽裝(修改 navigator 屬性)。
陷阱 5:國家碼不一致導致號碼格式錯誤
接碼平台回傳的號碼有時不含 '+' 或國家碼前綴,觸發請求時被拒。
解法:統一標準化號碼格式為 E.164,在觸發前增加格式校驗與修正函數。
陷阱 6:簡訊內容多語言匹配失敗
「已註冊」可能以 "already registered"、"déjà enregistré" 等形式出現。
解法:建立多語言關鍵字表,使用正則表達式模糊匹配。
陷阱 7:平臺對 VoIP 號碼的隱性拒絕
Google 和 Telegram 常對 VoIP 號碼不回傳驗證碼,且不顯示明確錯誤。
解法:比對接碼平台提供的號碼類型,若為 VoIP 則在評分中提前降低期望或直接降級。
陷阱 8:記憶體洩漏與瀏覽器實例未關閉
大量併發測試後,遺留的瀏覽器進程佔滿記憶體。
解法:使用 try...finally 確保每個 context 和 browser 實例都被關閉,或使用程序池限制最大實例數。
陷阱 9:接碼平台 API 頻率限制
SMS-MAN 等平台對查詢狀態接口有每分鐘請求數限制,超限會被暫時封鎖。
解法:實現令牌桶或漏桶演算法,並在收到 429 狀態碼時自動退避。
陷阱 10:時間同步偏差導致延遲計算錯誤
測試機器與 NTP 伺服器不同步,可能對延遲判定產生數十秒偏差。
解法:在測試前強制 NTP 同步,並使用 UTC 時間戳記錄所有事件。

六、總結與行動清單

核心結論:沒有自動化檢測之前,你買到的每一個號都是一張刮刮樂。有了這套腳本,你可以在 30 秒內 刮開塗層,看清它是「全新白號」還是「被人用過十遍的黑號」。

行動清單

  1. 搭建多平台驗證碼觸發的瀏覽器自動化環境(Playwright 或 Selenium)。
  2. 接入至少一個主流接碼平台 API(5sim / SMSPool / SMS-MAN)並完成聯調。
  3. 依本文加權評分邏輯實現純淨度判定腳本。
  4. 將腳本整合進號碼採購流程,設定「低於 A 級自動退款或棄用」策略。
  5. 每週生成號碼品質趨勢報告,作為續購或更換供應商的決策依據。
  6. 將純淨度檢測加入 CI/CD 鏈,實現號碼池每日健康檢查。
最後提醒:即使拿到 S 級新鮮號,也絕不要用它關聯你任何真實身份資訊。號碼是一次性的籌碼,你的真實身份才是不可替換的資產。