summaryrefslogtreecommitdiff
path: root/backend/main.py
diff options
context:
space:
mode:
authoraltaf-creator <dev@altafcreator.com>2026-05-01 12:27:42 +0800
committeraltaf-creator <dev@altafcreator.com>2026-05-01 12:27:42 +0800
commitcdfdd3a2d6bdd2ac37e2bd237b6e760864e41db1 (patch)
tree5d692d9c28b01b4d508f94edd7a3b5e21cdee453 /backend/main.py
parentdb1c6676a13798ee57dbac429a1d5045b60356fb (diff)
new backend + turnstile
Diffstat (limited to 'backend/main.py')
-rw-r--r--backend/main.py48
1 files changed, 48 insertions, 0 deletions
diff --git a/backend/main.py b/backend/main.py
new file mode 100644
index 0000000..97481b6
--- /dev/null
+++ b/backend/main.py
@@ -0,0 +1,48 @@
+import fastapi
+import requests
+from dotenv import load_dotenv
+from os import getenv
+
+print("Hello, world!")
+load_dotenv()
+
+app = fastapi.FastAPI(title="altafcreator.com", decscription="altafcreator.com API", version="1.0")
+TURNSTILE_SECRET = getenv("CLOUDFLARE_TURNSTILE_SECRET").encode("utf-8")
+
+
+@app.post("/email")
+def email(token):
+ if validate_turnstile(token):
+ return {
+ "status": True,
+ "message": "here's my email",
+ "business": "business@altafcreator.com",
+ "personal": "altaf@altafcreator.com",
+ }
+ else:
+ return {
+ "status": False,
+ "message": "Turnstile verification invalid",
+ }
+
+
+# https://developers.cloudflare.com/turnstile/get-started/server-side-validation/, modified
+# returns response if success, returns None if unsuccessful.
+def validate_turnstile(token, remoteip=None) -> tuple:
+ url = 'https://challenges.cloudflare.com/turnstile/v0/siteverify'
+
+ data = {
+ 'secret': TURNSTILE_SECRET,
+ 'response': token
+ }
+
+ if remoteip:
+ data['remoteip'] = remoteip
+
+ try:
+ response = requests.post(url, data=data, timeout=10)
+ response.raise_for_status()
+ return response.json()
+ except requests.RequestException as e:
+ print(f"Turnstile validation error: {e}")
+ return None