Kendi sunucunda çalışıyor · bahadirduzcan.com.tr

Private Captcha self-hosted

Gizliliğe saygılı, reCAPTCHA'ya alternatif captcha. Verisi senin sunucunda kalır, üçüncü tarafa istek gitmez. Aşağıda kendi projelerine 3 adımda nasıl ekleyeceğin var.

Adresler

Yönetim paneli
admin-captcha.bahadirduzcan.com.tr
Site oluştur, sitekey ve API anahtarı al.
🔒 Authelia ile korunur
Widget / CDN
cdn-captcha.bahadirduzcan.com.tr
Tarayıcıya yüklenen widget betiği.
herkese açık
Doğrulama API'si
api-captcha.bahadirduzcan.com.tr
Sunucu tarafı çözüm doğrulaması.
herkese açık
Bu sayfa
captcha.bahadirduzcan.com.tr
Demo + entegrasyon rehberi.
herkese açık
Not: api ve cdn herkese açık olmak zorunda — captcha'yı senin sitelerine giren anonim ziyaretçiler kullanır. Sadece yönetim paneli Authelia arkasındadır; oraya sadece sen girersin.

Canlı demo

Panelde bir site (property) oluşturup sitekey'ini aşağıya yapıştır, widget'ı burada dene. (Property ayarlarında bu alan adını — captcha.bahadirduzcan.com.tr — ve localhost'u izinli alanlara eklemeyi unutma.)

Projene ekle — 3 adım

  1. Panelde site oluştur: admin-captcha'ya gir → Properties → yeni property → izinli alan adlarına sitenin domainini ekle. Bir sitekey alırsın.
  2. API anahtarı al: Panelde Settings → API keys → Create new key. Bu anahtar sunucu tarafında doğrulama için, gizli tut.
  3. Formuna widget'ı + sunucu doğrulamasını ekle (aşağıdaki kod).

1) HTML — formun içine

<!-- widget betiği: sayfada bir kez -->
<script defer src="https://cdn-captcha.bahadirduzcan.com.tr/widget/js/privatecaptcha.js"></script>

<!-- formun içine: sitekey senin, puzzle-endpoint SENİN api'ne bakmalı -->
<form method="POST" action="/gonder">
  <div class="private-captcha"
       data-sitekey="SENIN_SITEKEY"
       data-puzzle-endpoint="https://api-captcha.bahadirduzcan.com.tr/puzzle"></div>
  <button type="submit">Gönder</button>
</form>
Widget çözülünce forma otomatik olarak gizli bir alan ekler: <input name="private-captcha-solution" value="...">. Bu değeri sunucuda doğrularsın.

2) Sunucu tarafı — çözümü doğrula

Formdan gelen private-captcha-solution değerini, gizli API anahtarınla /verify'a POST et. Yanıtta success===true && code===0 ise geçerli.

// Express örneği
const solution = req.body["private-captcha-solution"];
const r = await fetch("https://api-captcha.bahadirduzcan.com.tr/verify", {
  method: "POST",
  headers: { "X-Api-Key": process.env.PC_API_KEY },
  body: solution                       // ham çözüm string'i, gövdeye direkt
});
const data = await r.json();
if (data.success && data.code === 0) {
  // ✅ insan — formu işle
} else {
  // ❌ reddet
}
// PHP örneği
$solution = $_POST["private-captcha-solution"];
$ch = curl_init("https://api-captcha.bahadirduzcan.com.tr/verify");
curl_setopt_array($ch, [
  CURLOPT_POST => true,
  CURLOPT_HTTPHEADER => ["X-Api-Key: " . getenv("PC_API_KEY")],
  CURLOPT_POSTFIELDS => $solution,
  CURLOPT_RETURNTRANSFER => true,
]);
$res = json_decode(curl_exec($ch), true);
if ($res["success"] && $res["code"] === 0) { /* ✅ */ }
# Python (requests)
import requests, os
solution = request.form["private-captcha-solution"]
r = requests.post(
    "https://api-captcha.bahadirduzcan.com.tr/verify",
    headers={"X-Api-Key": os.environ["PC_API_KEY"]},
    data=solution,
)
res = r.json()
if res["success"] and res["code"] == 0:
    ...  # ✅ insan
curl -X POST https://api-captcha.bahadirduzcan.com.tr/verify \
  -H "X-Api-Key: SENIN_API_ANAHTARIN" \
  --data "PRIVATE_CAPTCHA_SOLUTION_DEGERI"

# yanıt:
# {"success": true, "code": 0, "timestamp": "...", "origin": "site.com"}

reCAPTCHA'dan geçiş

Private Captcha, Google reCAPTCHA uyumlu bir /siteverify ucu da sunar (secret + response parametreleri). Mevcut reCAPTCHA kodun varsa sadece endpoint'i https://api-captcha.bahadirduzcan.com.tr/siteverify yapıp secret'ı API anahtarınla değiştirmen yeter.