tst / server-verify-example.js
Skydata001's picture
Upload 3 files
5340f1e verified
/**
* โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•
* ู…ุซุงู„ ุงู„ุชุญู‚ู‚ ู…ู† ุงู„ุชูˆูƒู† ููŠ ุงู„ุฎุงุฏู… ุงู„ุฎู„ููŠ (Node.js)
* SkyGuard CAPTCHA โ€” Server-Side Token Verification
* โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•
*
* ุชุซุจูŠุช ุงู„ู…ุชุทู„ุจุงุช:
* npm install express axios
*
* ุชุดุบูŠู„:
* node server-verify-example.js
*/
const express = require("express");
const axios = require("axios");
const app = express();
app.use(express.json());
// โ”€โ”€ ุงู„ุฅุนุฏุงุฏุงุช โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
const SKYGUARD_SPACE_URL = "https://YOUR_USERNAME-skyguard-captcha.hf.space";
// โ”€โ”€ ุงู„ุชุญู‚ู‚ ู…ู† captchaToken ุงู„ู‚ุงุฏู… ู…ู† ุงู„ูˆุงุฌู‡ุฉ ุงู„ุฃู…ุงู…ูŠุฉ โ”€โ”€
async function verifyCaptchaToken(token) {
try {
const url = `${SKYGUARD_SPACE_URL}/api/verify?token=${encodeURIComponent(token)}`;
const res = await axios.get(url, { timeout: 5000 });
return res.data.valid === true;
} catch (err) {
console.error("[SkyGuard] Verification error:", err.message);
return false; // ููŠ ุญุงู„ุฉ ุงู„ูุดู„ุŒ ุงุฑูุถ ุงู„ุทู„ุจ
}
}
// โ”€โ”€ ู…ุซุงู„: ุญู…ุงูŠุฉ ู†ู‚ุทุฉ ู†ู‡ุงูŠุฉ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
app.post("/api/submit-form", async (req, res) => {
const { captchaToken, name, email, message } = req.body;
// 1) ุชุญู‚ู‚ ู…ู† ูˆุฌูˆุฏ ุงู„ุชูˆูƒู†
if (!captchaToken) {
return res.status(400).json({ error: "captcha_required" });
}
// 2) ุชุญู‚ู‚ ู…ู† ุตุญุฉ ุงู„ุชูˆูƒู† ุนุจุฑ SkyGuard API
const valid = await verifyCaptchaToken(captchaToken);
if (!valid) {
return res.status(403).json({ error: "captcha_invalid_or_expired" });
}
// 3) ุงู„ุชูˆูƒู† ุตุญูŠุญ โ€” ู†ูู‘ุฐ ุงู„ู…ู†ุทู‚ ุงู„ุฃุตู„ูŠ
console.log("โœ… CAPTCHA verified! Processing form:", { name, email });
res.json({ success: true, message: "ุชู… ุฅุฑุณุงู„ ุงู„ู†ู…ูˆุฐุฌ ุจู†ุฌุงุญ" });
});
// โ”€โ”€ ู…ุซุงู„: ุญู…ุงูŠุฉ ู†ู‚ุทุฉ ุชุณุฌูŠู„ ุงู„ุฏุฎูˆู„ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
app.post("/api/login", async (req, res) => {
const { username, password, captchaToken } = req.body;
if (!captchaToken) {
return res.status(400).json({ error: "captcha_required" });
}
const valid = await verifyCaptchaToken(captchaToken);
if (!valid) {
return res.status(403).json({ error: "captcha_failed" });
}
// โ† ู‡ู†ุง ู…ู†ุทู‚ ุชุณุฌูŠู„ ุงู„ุฏุฎูˆู„ ุงู„ุฎุงุต ุจูƒ
console.log("Login attempt by:", username);
res.json({ success: true });
});
// โ”€โ”€ ู…ุซุงู„: Middleware ู‚ุงุจู„ ู„ุฅุนุงุฏุฉ ุงู„ุงุณุชุฎุฏุงู… โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
async function requireCaptcha(req, res, next) {
const token =
req.body?.captchaToken ||
req.query?.captchaToken ||
req.headers["x-captcha-token"];
if (!token) {
return res.status(400).json({ error: "captcha_token_missing" });
}
const valid = await verifyCaptchaToken(token);
if (!valid) {
return res.status(403).json({ error: "captcha_verification_failed" });
}
next();
}
// ุงุณุชุฎุฏุงู… ุงู„ู€ middleware
app.post("/api/register", requireCaptcha, (req, res) => {
res.json({ success: true, message: "ุชู… ุชุณุฌูŠู„ ุงู„ุญุณุงุจ ุจู†ุฌุงุญ" });
});
app.post("/api/contact", requireCaptcha, (req, res) => {
res.json({ success: true, message: "ุชู… ุฅุฑุณุงู„ ุฑุณุงู„ุชูƒ" });
});
// โ”€โ”€ ุชุดุบูŠู„ ุงู„ุฎุงุฏู… โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
app.listen(3000, () => {
console.log("โœ… Server running at http://localhost:3000");
console.log("๐Ÿ”— SkyGuard Space:", SKYGUARD_SPACE_URL);
});
/**
* โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•
* ู…ุซุงู„ PHP (ุฅุฐุง ูƒู†ุช ุชุณุชุฎุฏู… PHP)
* โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•
<?php
function verifySkyGuard(string $token): bool {
$url = "https://YOUR_USERNAME-skyguard-captcha.hf.space/api/verify?token=" . urlencode($token);
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_TIMEOUT, 5);
$body = curl_exec($ch);
curl_close($ch);
if (!$body) return false;
$data = json_decode($body, true);
return ($data['valid'] ?? false) === true;
}
// ุงู„ุงุณุชุฎุฏุงู…:
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$token = $_POST['captchaToken'] ?? '';
if (!verifySkyGuard($token)) {
http_response_code(403);
die(json_encode(['error' => 'captcha_failed']));
}
// โœ… ู…ุชุงุจุนุฉ ุงู„ู…ู†ุทู‚ ุงู„ุฃุตู„ูŠ...
}
?>
*/
/**
* โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•
* ู…ุซุงู„ Python (Flask/Django)
* โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•
import requests
SKYGUARD_URL = "https://YOUR_USERNAME-skyguard-captcha.hf.space"
def verify_skyguard(token: str) -> bool:
try:
r = requests.get(
f"{SKYGUARD_URL}/api/verify",
params={"token": token},
timeout=5
)
return r.json().get("valid") is True
except Exception:
return False
# Flask ู…ุซุงู„:
from flask import Flask, request, jsonify
app = Flask(__name__)
@app.route("/submit", methods=["POST"])
def submit():
token = request.json.get("captchaToken", "")
if not verify_skyguard(token):
return jsonify({"error": "captcha_failed"}), 403
# โœ… ู…ุชุงุจุนุฉ...
return jsonify({"success": True})
*/