號碼品質決定一切:如何用自動化腳本測試臨時號碼的「純淨度」
Live Coding 風格的純實戰指南——來自一個為出海專案建過號碼純淨度檢測流水線的 QA 老兵
大實話:你花
本文給出一套自動化腳本,讓你在買號後的 30 秒內,看清這個號到底是「乾淨」還是「髒」。
$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 搭配 playwright 或 selenium 實作,重點在邏輯而非具體框架。
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
監控指標與告警閾值
- S/A/B/C 佔比:每週對比,若 S 級下降超過 10% 則發送黃色告警。
- 平均檢測延遲:若超過 35 秒趨勢上升,表示供應商質量下降。
- 特定平台拒絕率:當 Google 拒絕率 > 50% 或 WhatsApp 拒絕率 > 40% 時,觸發橙色告警,建議更換號碼供應商。
號碼品質週報模板 (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。
同一 IP 短時間內向多個平台同時觸發驗證碼,可能被識別為惡意行為。
解法:併發請求間加入至少 600ms 延遲,並透過代理池分散來源 IP。
陷阱 2:平台冷卻期導致連坐封禁
WhatsApp、Telegram 對同一 IP 連續註冊多個號碼會觸發冷卻期,後續號碼全部無效。
解法:每個號碼測試使用獨立瀏覽器 context 和獨立 IP,模擬真實間隔。
WhatsApp、Telegram 對同一 IP 連續註冊多個號碼會觸發冷卻期,後續號碼全部無效。
解法:每個號碼測試使用獨立瀏覽器 context 和獨立 IP,模擬真實間隔。
陷阱 3:接碼平台返回快取舊簡訊
部分平台回傳歷史簡訊,導致誤判為「已註冊」。
解法:過濾時間戳超過 5 分鐘的簡訊,要求 API 僅返回本次 activation_id 的新訊息。
部分平台回傳歷史簡訊,導致誤判為「已註冊」。
解法:過濾時間戳超過 5 分鐘的簡訊,要求 API 僅返回本次 activation_id 的新訊息。
陷阱 4:Playwright 瀏覽器指紋被識別
預設無頭模式可能被網站檢測為自動化工具,導致驗證碼不發送。
解法:使用
預設無頭模式可能被網站檢測為自動化工具,導致驗證碼不發送。
解法:使用
playwright.chromium.launch(headless=False) 或強化指紋偽裝(修改 navigator 屬性)。
陷阱 5:國家碼不一致導致號碼格式錯誤
接碼平台回傳的號碼有時不含 '+' 或國家碼前綴,觸發請求時被拒。
解法:統一標準化號碼格式為 E.164,在觸發前增加格式校驗與修正函數。
接碼平台回傳的號碼有時不含 '+' 或國家碼前綴,觸發請求時被拒。
解法:統一標準化號碼格式為 E.164,在觸發前增加格式校驗與修正函數。
陷阱 6:簡訊內容多語言匹配失敗
「已註冊」可能以 "already registered"、"déjà enregistré" 等形式出現。
解法:建立多語言關鍵字表,使用正則表達式模糊匹配。
「已註冊」可能以 "already registered"、"déjà enregistré" 等形式出現。
解法:建立多語言關鍵字表,使用正則表達式模糊匹配。
陷阱 7:平臺對 VoIP 號碼的隱性拒絕
Google 和 Telegram 常對 VoIP 號碼不回傳驗證碼,且不顯示明確錯誤。
解法:比對接碼平台提供的號碼類型,若為 VoIP 則在評分中提前降低期望或直接降級。
Google 和 Telegram 常對 VoIP 號碼不回傳驗證碼,且不顯示明確錯誤。
解法:比對接碼平台提供的號碼類型,若為 VoIP 則在評分中提前降低期望或直接降級。
陷阱 8:記憶體洩漏與瀏覽器實例未關閉
大量併發測試後,遺留的瀏覽器進程佔滿記憶體。
解法:使用
大量併發測試後,遺留的瀏覽器進程佔滿記憶體。
解法:使用
try...finally 確保每個 context 和 browser 實例都被關閉,或使用程序池限制最大實例數。
陷阱 9:接碼平台 API 頻率限制
SMS-MAN 等平台對查詢狀態接口有每分鐘請求數限制,超限會被暫時封鎖。
解法:實現令牌桶或漏桶演算法,並在收到 429 狀態碼時自動退避。
SMS-MAN 等平台對查詢狀態接口有每分鐘請求數限制,超限會被暫時封鎖。
解法:實現令牌桶或漏桶演算法,並在收到 429 狀態碼時自動退避。
陷阱 10:時間同步偏差導致延遲計算錯誤
測試機器與 NTP 伺服器不同步,可能對延遲判定產生數十秒偏差。
解法:在測試前強制 NTP 同步,並使用 UTC 時間戳記錄所有事件。
測試機器與 NTP 伺服器不同步,可能對延遲判定產生數十秒偏差。
解法:在測試前強制 NTP 同步,並使用 UTC 時間戳記錄所有事件。
六、總結與行動清單
核心結論:沒有自動化檢測之前,你買到的每一個號都是一張刮刮樂。有了這套腳本,你可以在 30 秒內 刮開塗層,看清它是「全新白號」還是「被人用過十遍的黑號」。
行動清單
- 搭建多平台驗證碼觸發的瀏覽器自動化環境(Playwright 或 Selenium)。
- 接入至少一個主流接碼平台 API(5sim / SMSPool / SMS-MAN)並完成聯調。
- 依本文加權評分邏輯實現純淨度判定腳本。
- 將腳本整合進號碼採購流程,設定「低於 A 級自動退款或棄用」策略。
- 每週生成號碼品質趨勢報告,作為續購或更換供應商的決策依據。
- 將純淨度檢測加入 CI/CD 鏈,實現號碼池每日健康檢查。
最後提醒:即使拿到 S 級新鮮號,也絕不要用它關聯你任何真實身份資訊。號碼是一次性的籌碼,你的真實身份才是不可替換的資產。