Ketika pipeline CAPTCHA Anda mulai gagal dalam skala besar, Anda harus segera mengetahuinya - bukan beberapa jam kemudian ketika hasil scraping sudah kosong. Panduan ini menyiapkan notifikasi Slack untuk kegagalan, saldo rendah, dan tingkat kesalahan yang tidak normal.
Penyiapan: Buat webhook Slack
- Pergi keapi.slack.com/apps-> Buat Aplikasi Baru
- Pilih Webhook Masuk -> Aktifkan
- Klik Tambahkan Webhook Baru ke Ruang Kerja -> Pilih saluran
- Salin URL webhook
Python: Pembantu notifikasi kendur
import requests
import json
from datetime import datetime
SLACK_WEBHOOK_URL = "https://hooks.slack.com/services/T00/B00/xxx"
def send_slack_alert(title, message, color="#ff0000", fields=None):
"""Send a formatted Slack alert."""
attachment = {
"color": color,
"title": title,
"text": message,
"ts": int(datetime.now().timestamp()),
}
if fields:
attachment["fields"] = [
{"title": k, "value": str(v), "short": True}
for k, v in fields.items()
]
payload = {"attachments": [attachment]}
resp = requests.post(SLACK_WEBHOOK_URL, json=payload, timeout=10)
return resp.status_code == 200
Peringatan 1: Selesaikan kegagalan
def notify_solve_failure(task_id, captcha_type, error_code, site_url):
send_slack_alert(
title="CAPTCHA Solve Failed",
message=f"Task `{task_id}` failed with `{error_code}`",
color="#ff0000",
fields={
"Type": captcha_type,
"Error": error_code,
"Site": site_url,
"Time": datetime.now().strftime("%H:%M:%S"),
},
)
# Use after a failed solve
result = poll_for_result(task_id)
if result.get("error"):
notify_solve_failure(task_id, "recaptcha_v2", result["error"], "https://example.com")
Peringatan 2: Saldo rendah
def check_balance_alert(api_key, threshold=5.0):
"""Alert when balance rilis pengujian below threshold."""
resp = requests.get("https://ocr.captchaai.com/res.php", params={
"key": api_key, "action": "getbalance", "json": "1"
}).json()
balance = float(resp.get("request", 0))
if balance < threshold:
send_slack_alert(
title="Low CaptchaAI Balance",
message=f"Balance is ${balance:.2f} (threshold: ${threshold:.2f})",
color="#ff9900",
fields={
"Current Balance": f"${balance:.2f}",
"Threshold": f"${threshold:.2f}",
},
)
return balance
# Run periodically
import threading
def balance_monitor(api_key, interval=300):
"""Check balance every 5 minutes."""
check_balance_alert(api_key)
timer = threading.Timer(interval, balance_monitor, args=[api_key, interval])
timer.daemon = True
timer.start()
balance_monitor("YOUR_API_KEY")
Peringatan 3: Tingkat kesalahan tinggi
from collections import deque
class ErrorRateNotifier:
def __init__(self, window=50, threshold=0.3, cooldown=300):
self.results = deque(maxlen=window)
self.threshold = threshold
self.cooldown = cooldown
self.last_alert = 0
def record(self, success):
self.results.append(success)
if len(self.results) < 20:
return
error_rate = 1 - sum(self.results) / len(self.results)
import time
now = time.time()
if error_rate > self.threshold and (now - self.last_alert) > self.cooldown:
self.last_alert = now
send_slack_alert(
title="High CAPTCHA Error Rate",
message=f"Error rate: {error_rate:.0%} over last {len(self.results)} tasks",
color="#ff0000",
fields={
"Error Rate": f"{error_rate:.1%}",
"Window": f"{len(self.results)} tasks",
"Threshold": f"{self.threshold:.0%}",
},
)
notifier = ErrorRateNotifier()
# After each solve attempt
notifier.record(success=True) # solved
notifier.record(success=False) # failed
Implementasi Node.js
const axios = require('axios');
const SLACK_WEBHOOK = 'https://hooks.slack.com/services/T00/B00/xxx';
async function sendSlackAlert(title, message, color = '#ff0000', fields = {}) {
const attachment = {
color,
title,
text: message,
ts: Math.floor(Date.now() / 1000),
fields: Object.entries(fields).map(([k, v]) => ({
title: k, value: String(v), short: true,
})),
};
await axios.post(SLACK_WEBHOOK, { attachments: [attachment] });
}
// Failure alert
async function notifySolveFailure(taskId, type, error) {
await sendSlackAlert(
'CAPTCHA Solve Failed',
`Task \`${taskId}\` failed: \`${error}\``,
'#ff0000',
{ Type: type, Error: error }
);
}
// Balance alert
async function checkBalance(apiKey, threshold = 5.0) {
const resp = await axios.get('https://ocr.captchaai.com/res.php', {
params: { key: apiKey, action: 'getbalance', json: 1 },
});
const balance = parseFloat(resp.data.request);
if (balance < threshold) {
await sendSlackAlert(
'Low CaptchaAI Balance',
`Balance: $${balance.toFixed(2)}`,
'#ff9900',
{ Balance: `$${balance.toFixed(2)}`, Threshold: `$${threshold.toFixed(2)}` }
);
}
return balance;
}
// Periodic check
setInterval(() => checkBalance('YOUR_API_KEY'), 5 * 60 * 1000);
Ringkasan harian
def send_daily_summary(stats):
"""Send a daily digest to Slack."""
send_slack_alert(
title="Daily CAPTCHA Summary",
message=f"{stats['total']} tasks processed",
color="#36a64f",
fields={
"Solved": stats["solved"],
"Failed": stats["failed"],
"Avg Solve Time": f"{stats['avg_time_ms']}ms",
"Total Cost": f"${stats['total_cost']:.2f}",
"Success Rate": f"{stats['success_rate']:.1%}",
},
)
Pemecahan Masalah
| Masalah | Penyebab | Solusi |
|---|---|---|
| Webhook mengembalikan 403 | URL webhook tidak valid | Buat ulang webhook di Slack |
| Terlalu banyak peringatan | Tidak ada cooldown | Tambahkan periode cooldown di antara peringatan |
| Peringatan tertunda | Timeout webhook habis | Tetapkan timeout pada request (10 detik) |
| Saluran tidak menerima | Saluran yang dipilih salah | Periksa konfigurasi saluran webhook |
Pertanyaan Umum
Bagaimana cara menghindari kelelahan akibat kewaspadaan?
Gunakan periode cooldown (minimum 5 menit), masukkan kesalahan ke dalam intisari, dan hanya peringatan pada ambang batas tingkat kesalahan — bukan kegagalan individual.
Bisakah saya menggunakan Discord daripada Slack?
Ya. Webhook perselisihan menerima format JSON yang serupa. Ubah struktur muatan untuk menggunakan embeds, bukan attachments.
Pantau alur kerja CAPTCHA Anda dengan CaptchaAI
Dapatkan kunci API Anda dicaptchaai.com.
Panduan terkait
- Logging Terstruktur untuk Operasi CAPTCHA
- CaptchaAI Cek Saldo dan Isi Ulang Otomatis
- Build Dashboard Penggunaan CaptchaAI