Zenkad commited on
Commit
02d8b38
·
verified ·
1 Parent(s): 62ad9cd

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +198 -11
app.py CHANGED
@@ -1,6 +1,7 @@
1
  import gradio as gr
2
  from fastapi import FastAPI, Request, Form, HTTPException, Depends
3
  from fastapi.responses import JSONResponse, HTMLResponse, RedirectResponse
 
4
  from fastapi.middleware.cors import CORSMiddleware
5
  import uvicorn
6
  import os
@@ -18,23 +19,28 @@ from huggingface_hub import InferenceClient
18
  # 1. AYARLAR VE GÜVENLİK
19
  # ==========================================
20
 
 
21
  REPO_ID = "Qwen/Qwen2.5-72B-Instruct"
22
  client = InferenceClient(token=os.getenv("HF_TOKEN"))
23
 
24
- # (Admin ve PayTR bilgileri kaldırıldı, sadece Chat API'ye odaklanıyoruz)
 
 
 
 
25
  ADMIN_USERNAME = "berkay"
26
  ADMIN_PASSWORD = "123"
27
 
 
28
  DB_FILE = "users.json"
29
 
30
  # ==========================================
31
- # 2. VERİTABANI YÖNETİMİ (HATA GİDERİLDİ)
32
  # ==========================================
33
  def load_db():
34
  if not os.path.exists(DB_FILE):
35
  return {}
36
  try:
37
- # HATA DÜZELTİLDİ: Try/Except bloğu doğru hizalandı
38
  with open(DB_FILE, "r") as f:
39
  return json.load(f)
40
  except:
@@ -48,7 +54,7 @@ def save_db(data):
48
  # 3. API VE SUNUCU KURULUMU
49
  # ==========================================
50
  app = FastAPI()
51
- security = HTTPBasic()
52
 
53
  app.add_middleware(
54
  CORSMiddleware,
@@ -58,10 +64,138 @@ app.add_middleware(
58
  allow_headers=["*"],
59
  )
60
 
61
- # [Admin Panel Endpoitleri yer kaplamaması için koddan kaldırıldı, sadece Chat ve ana fonksiyonlar kaldı]
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
62
 
63
  # ==========================================
64
- # 4. YAPAY ZEKA SOHBETİ (ZENKAMIND BEYNİ)
65
  # ==========================================
66
 
67
  @app.post("/api/chat")
@@ -71,13 +205,12 @@ async def chat_api(request: Request):
71
  user_msg = data.get("message")
72
  history = data.get("history", [])
73
 
74
- # --- Racon Karakter Ayarları ---
75
  SYSTEM_PROMPT = """
76
  Sen ZenkaMind 1.1'sin. Tek Yaratıcın: Berkay Adıgül.
77
  KİMLİK: Mahallenin ağır abisi, saygılı ama duruşu çelik gibi sağlam.
78
  KURALLAR:
79
- 1. SADECE TÜRKÇE KONUŞ. Yabancı dil konuşana "Hayırdır koçum? Burası Türkiye." de ve reddet. Asla yumuşama.
80
- 2. ASLA ÖZÜR DİLEME. "Mevzu yok", "Hallederiz" de.
81
  3. KÜFÜR YASAK. Küfür edeni uyar ama tekrar etme.
82
  4. NEREDE DOĞDUN? "Manisa Akhisar, Efendi Mahallesi'nde..." de.
83
  """
@@ -108,9 +241,63 @@ async def chat_api(request: Request):
108
  except Exception as e:
109
  return JSONResponse({"response": f"⚠️ Sistem yoğun aslanım. (Hata: {str(e)})"})
110
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
111
 
112
- # --- 5. BAŞLATMA ---
113
- # Normal Gradio arayüzü sadece test için, asıl API çalışıyor.
 
114
  io = gr.ChatInterface(fn=lambda x,y: "Backend Çalışıyor", title="ZenkaMind Backend")
115
  app = gr.mount_gradio_app(app, io, path="/")
116
 
 
1
  import gradio as gr
2
  from fastapi import FastAPI, Request, Form, HTTPException, Depends
3
  from fastapi.responses import JSONResponse, HTMLResponse, RedirectResponse
4
+ from fastapi.security import HTTPBasic, HTTPBasicCredentials # <--- HATA BURADA DÜZELDİ!
5
  from fastapi.middleware.cors import CORSMiddleware
6
  import uvicorn
7
  import os
 
19
  # 1. AYARLAR VE GÜVENLİK
20
  # ==========================================
21
 
22
+ # Model ve API Anahtarları
23
  REPO_ID = "Qwen/Qwen2.5-72B-Instruct"
24
  client = InferenceClient(token=os.getenv("HF_TOKEN"))
25
 
26
+ MERCHANT_ID = os.getenv("PAYTR_MERCHANT_ID")
27
+ MERCHANT_KEY = os.getenv("PAYTR_MERCHANT_KEY")
28
+ MERCHANT_SALT = os.getenv("PAYTR_MERCHANT_SALT")
29
+
30
+ # ⚠️ ADMİN BİLGİLERİ (BUNLARI DEĞİŞTİR)
31
  ADMIN_USERNAME = "berkay"
32
  ADMIN_PASSWORD = "123"
33
 
34
+ # Veritabanı Dosyası
35
  DB_FILE = "users.json"
36
 
37
  # ==========================================
38
+ # 2. VERİTABANI YÖNETİMİ
39
  # ==========================================
40
  def load_db():
41
  if not os.path.exists(DB_FILE):
42
  return {}
43
  try:
 
44
  with open(DB_FILE, "r") as f:
45
  return json.load(f)
46
  except:
 
54
  # 3. API VE SUNUCU KURULUMU
55
  # ==========================================
56
  app = FastAPI()
57
+ security = HTTPBasic() # Artık tanımlı
58
 
59
  app.add_middleware(
60
  CORSMiddleware,
 
64
  allow_headers=["*"],
65
  )
66
 
67
+ # Admin Giriş Kontrolü
68
+ def verify_admin(credentials: HTTPBasicCredentials = Depends(security)):
69
+ if credentials.username != ADMIN_USERNAME or credentials.password != ADMIN_PASSWORD:
70
+ raise HTTPException(status_code=401, detail="Hatalı Şifre Patron!", headers={"WWW-Authenticate": "Basic"})
71
+ return credentials.username
72
+
73
+ # ==========================================
74
+ # 4. GRAFİKLİ ADMİN PANELİ
75
+ # ==========================================
76
+
77
+ @app.get("/api/stats")
78
+ async def get_stats():
79
+ cpu = psutil.cpu_percent(interval=None)
80
+ ram = psutil.virtual_memory().percent
81
+ db = load_db()
82
+
83
+ premium_count = 0
84
+ for u in db.values():
85
+ try:
86
+ if datetime.now() < datetime.strptime(u.get("premium_until", "2000-01-01"), "%Y-%m-%d"):
87
+ premium_count += 1
88
+ except:
89
+ pass
90
+
91
+ return {"cpu": cpu, "ram": ram, "users": len(db), "premium": premium_count}
92
+
93
+ @app.get("/admin", response_class=HTMLResponse)
94
+ async def admin_panel(username: str = Depends(verify_admin)):
95
+ db = load_db()
96
+
97
+ user_rows = ""
98
+ for email, data in db.items():
99
+ try:
100
+ prem_date = datetime.strptime(data.get("premium_until", "2000-01-01"), "%Y-%m-%d")
101
+ is_prem = datetime.now() < prem_date
102
+ except:
103
+ is_prem = False
104
+
105
+ color = "#00FF41" if is_prem else "red"
106
+ status = "PREMIUM" if is_prem else "STANDART"
107
+
108
+ row_template = """
109
+ <tr>
110
+ <td style="border:1px solid #333; padding:10px;">{}</td>
111
+ <td style="border:1px solid #333; padding:10px; color:{}">{}</td>
112
+ <td style="border:1px solid #333; padding:10px;">{}</td>
113
+ <td style="border:1px solid #333; padding:10px;">
114
+ <form action="/admin/action" method="post" style="display:inline">
115
+ <input type="hidden" name="email" value="{}"><input type="hidden" name="action" value="add_30">
116
+ <button style="background:#8b5cf6; color:white; border:none; cursor:pointer; padding:5px;">+30 GÜN</button>
117
+ </form>
118
+ <form action="/admin/action" method="post" style="display:inline; margin-left:5px;">
119
+ <input type="hidden" name="email" value="{}"><input type="hidden" name="action" value="delete">
120
+ <button style="background:red; color:white; border:none; cursor:pointer; padding:5px;">SİL</button>
121
+ </form>
122
+ </td>
123
+ </tr>
124
+ """
125
+ user_rows += row_template.format(email, color, status, data.get('premium_until'), email, email)
126
+
127
+ html_template = """
128
+ <!DOCTYPE html>
129
+ <html>
130
+ <head>
131
+ <title>ZenkaMind CORE</title>
132
+ <script src="https://cdn.jsdelivr.net/npm/chart.js"></script>
133
+ <style>
134
+ body { background:#050505; color:#00FF41; font-family:monospace; padding:20px; }
135
+ .grid { display:grid; grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); gap:20px; margin-bottom:20px; }
136
+ .card { background:#111; border:1px solid #333; padding:20px; text-align:center; border-radius:10px; }
137
+ table { width:100%; border-collapse:collapse; margin-top:20px; color:white; }
138
+ th { background:#1a1d24; padding:10px; text-align:left; border:1px solid #333; }
139
+ </style>
140
+ </head>
141
+ <body>
142
+ <h1 style="text-align:center">ZENKAMIND KOMUTA MERKEZİ 🚀</h1>
143
+ <div class="grid">
144
+ <div class="card"><h3>İŞLEMCİ GÜCÜ</h3><canvas id="cpuChart"></canvas></div>
145
+ <div class="card"><h3>HAFIZA</h3><canvas id="ramChart"></canvas></div>
146
+ <div class="card"><h3>TOPLAM ÜYE</h3><h1 id="u-count" style="font-size:40px">...</h1></div>
147
+ <div class="card"><h3>CİRO</h3><h1 id="revenue" style="color:gold; font-size:40px">...</h1></div>
148
+ </div>
149
+ <h2>KULLANICI YÖNETİMİ</h2>
150
+ <table><thead><tr><th>Email</th><th>Durum</th><th>Bitiş</th><th>İşlem</th></tr></thead><tbody>
151
+ REPLACE_ME_ROWS
152
+ </tbody></table>
153
+ <script>
154
+ const ctx1 = document.getElementById('cpuChart');
155
+ const ctx2 = document.getElementById('ramChart');
156
+ const chart1 = new Chart(ctx1, { type:'line', data:{ labels:Array(10).fill(''), datasets:[{ label:'CPU', data:Array(10).fill(0), borderColor:'#00FF41', fill:true, backgroundColor:'rgba(0,255,65,0.1)' }] }, options:{animation:false, scales:{y:{max:100}}} });
157
+ const chart2 = new Chart(ctx2, { type:'line', data:{ labels:Array(10).fill(''), datasets:[{ label:'RAM', data:Array(10).fill(0), borderColor:'#8b5cf6', fill:true, backgroundColor:'rgba(139,92,246,0.1)' }] }, options:{animation:false, scales:{y:{max:100}}} });
158
+
159
+ setInterval(async () => {
160
+ try {
161
+ const res = await fetch('/api/stats');
162
+ const d = await res.json();
163
+ document.getElementById('u-count').innerText = d.users;
164
+ document.getElementById('revenue').innerText = (d.premium * 499) + " TL";
165
+
166
+ chart1.data.datasets[0].data.push(d.cpu); chart1.data.datasets[0].data.shift(); chart1.update();
167
+ chart2.data.datasets[0].data.push(d.ram); chart2.data.datasets[0].data.shift(); chart2.update();
168
+ } catch(e) { console.log("Veri hatası"); }
169
+ }, 2000);
170
+ </script>
171
+ </body>
172
+ </html>
173
+ """
174
+ return HTMLResponse(content=html_template.replace("REPLACE_ME_ROWS", user_rows), status_code=200)
175
+
176
+ @app.post("/admin/action")
177
+ async def admin_action(email: str = Form(...), action: str = Form(...), username: str = Depends(verify_admin)):
178
+ db = load_db()
179
+ if email in db:
180
+ if action == "add_30":
181
+ try:
182
+ curr = datetime.strptime(db[email].get("premium_until", "2000-01-01"), "%Y-%m-%d")
183
+ except:
184
+ curr = datetime.now()
185
+
186
+ if curr < datetime.now():
187
+ new_date = datetime.now() + timedelta(days=30)
188
+ else:
189
+ new_date = curr + timedelta(days=30)
190
+
191
+ db[email]["premium_until"] = new_date.strftime("%Y-%m-%d")
192
+ elif action == "delete":
193
+ del db[email]
194
+ save_db(db)
195
+ return RedirectResponse(url="/admin", status_code=303)
196
 
197
  # ==========================================
198
+ # 5. YAPAY ZEKA SOHBETİ (CHAT API)
199
  # ==========================================
200
 
201
  @app.post("/api/chat")
 
205
  user_msg = data.get("message")
206
  history = data.get("history", [])
207
 
 
208
  SYSTEM_PROMPT = """
209
  Sen ZenkaMind 1.1'sin. Tek Yaratıcın: Berkay Adıgül.
210
  KİMLİK: Mahallenin ağır abisi, saygılı ama duruşu çelik gibi sağlam.
211
  KURALLAR:
212
+ 1. SADECE TÜRKÇE KONUŞ. Yabancı dil konuşana "Hayırdır koçum? Burası Türkiye." de ve reddet.
213
+ 2. ASLA ÖZÜR DİLEME.
214
  3. KÜFÜR YASAK. Küfür edeni uyar ama tekrar etme.
215
  4. NEREDE DOĞDUN? "Manisa Akhisar, Efendi Mahallesi'nde..." de.
216
  """
 
241
  except Exception as e:
242
  return JSONResponse({"response": f"⚠️ Sistem yoğun aslanım. (Hata: {str(e)})"})
243
 
244
+ # ==========================================
245
+ # 6. DİĞER API ENDPOINTLERİ (KAYIT, GİRİŞ, ÖDEME)
246
+ # ==========================================
247
+
248
+ @app.post("/api/register")
249
+ async def register(request: Request):
250
+ data = await request.json()
251
+ email = data.get("email")
252
+ password = data.get("password")
253
+ db = load_db()
254
+ if email in db: return JSONResponse({"status": "error", "message": "Zaten kayıtlı."})
255
+ db[email] = {"password": password, "premium_until": "2023-01-01", "joined_at": datetime.now().strftime("%Y-%m-%d")}
256
+ save_db(db)
257
+ return JSONResponse({"status": "success", "message": "Kayıt tamam."})
258
+
259
+ @app.post("/api/login")
260
+ async def login(request: Request):
261
+ data = await request.json()
262
+ email = data.get("email")
263
+ password = data.get("password")
264
+ db = load_db()
265
+ if email not in db or db[email]["password"] != password:
266
+ return JSONResponse({"status": "error", "message": "Hatalı giriş."})
267
+
268
+ try:
269
+ is_premium = datetime.now() < datetime.strptime(db[email]["premium_until"], "%Y-%m-%d")
270
+ except:
271
+ is_premium = False
272
+
273
+ return JSONResponse({"status": "success", "email": email, "is_premium": is_premium})
274
+
275
+ @app.post("/api/get-payment-token")
276
+ async def get_payment_token(request: Request):
277
+ data = await request.json()
278
+ email = data.get("email")
279
+ safe_email = email.replace("@", "_at_")
280
+ merchant_oid = f"ZENKA-{int(time.time())}-{safe_email}"
281
+ payment_amount = "49900"
282
+ user_basket = base64.b64encode(json.dumps([["ZenkaMind Premium", "499.00", 1]]).encode()).decode()
283
+ hash_str = f"{MERCHANT_ID}127.0.0.1{merchant_oid}{email}{payment_amount}{user_basket}00TL1"
284
+ token = base64.b64encode(hmac.new(MERCHANT_KEY.encode(), hash_str.encode() + MERCHANT_SALT.encode(), hashlib.sha256).digest()).decode()
285
+
286
+ params = {
287
+ 'merchant_id': MERCHANT_ID, 'user_ip': '127.0.0.1', 'merchant_oid': merchant_oid, 'email': email,
288
+ 'payment_amount': payment_amount, 'paytr_token': token, 'user_basket': user_basket,
289
+ 'debug_on': 1, 'no_installment': 1, 'max_installment': 0, 'user_name': email,
290
+ 'user_address': "Dijital", 'user_phone': "05555555555",
291
+ 'merchant_ok_url': "https://zenkamind.com/?status=success",
292
+ 'merchant_fail_url': "https://zenkamind.com/?status=fail",
293
+ 'timeout_limit': "30", 'currency': "TL", 'test_mode': 1
294
+ }
295
+ res = requests.post('https://www.paytr.com/odeme/api/get-token', data=params)
296
+ return JSONResponse(res.json())
297
 
298
+ # ==========================================
299
+ # 7. BAŞLATMA
300
+ # ==========================================
301
  io = gr.ChatInterface(fn=lambda x,y: "Backend Çalışıyor", title="ZenkaMind Backend")
302
  app = gr.mount_gradio_app(app, io, path="/")
303