Kgshop commited on
Commit
090b5ab
·
verified ·
1 Parent(s): a45e8a6

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +134 -1
app.py CHANGED
@@ -3344,4 +3344,137 @@ def get_env_stats(env_id):
3344
  env_data = data.get(env_id)
3345
 
3346
  if not env_data:
3347
- return jsonify({"error": "Среда не
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3344
  env_data = data.get(env_id)
3345
 
3346
  if not env_data:
3347
+ return jsonify({"error": "Среда ненайдена"}), 404
3348
+
3349
+ raw_logs = env_data.get("logs", [])
3350
+ formatted_logs = []
3351
+
3352
+ for log in reversed(raw_logs):
3353
+ try:
3354
+ utc_dt = datetime.fromisoformat(log['time'])
3355
+ almaty_dt = utc_dt + timedelta(hours=5)
3356
+ time_str = almaty_dt.strftime('%Y-%m-%d %H:%M:%S')
3357
+ formatted_logs.append({
3358
+ "time": time_str,
3359
+ "ip": log.get('ip', 'unknown'),
3360
+ "ua": log.get('ua', 'unknown')
3361
+ })
3362
+ except:
3363
+ continue
3364
+
3365
+ response_data = {
3366
+ "id": env_id,
3367
+ "keyword": env_data.get("keyword"),
3368
+ "type": env_data.get("type", "closed"),
3369
+ "hits": env_data.get("hits", 0),
3370
+ "logs": formatted_logs
3371
+ }
3372
+ return jsonify(response_data)
3373
+
3374
+ @app.route('/env/<env_id>')
3375
+ def serve_env(env_id):
3376
+ new_token_to_set = None
3377
+ with data_lock:
3378
+ data = load_data()
3379
+ env_data = data.get(env_id)
3380
+
3381
+ if not env_data or not isinstance(env_data, dict) or env_data.get("archived"):
3382
+ return "Среда не найдена или заархивирована.", 404
3383
+
3384
+ current_log = {
3385
+ "time": datetime.utcnow().isoformat(),
3386
+ "ip": request.headers.get('X-Forwarded-For', request.remote_addr),
3387
+ "ua": request.headers.get('User-Agent', '')[:150]
3388
+ }
3389
+
3390
+ env_data['hits'] = env_data.get('hits', 0) + 1
3391
+ if 'logs' not in env_data or not isinstance(env_data.get('logs'), list):
3392
+ env_data['logs'] = []
3393
+
3394
+ env_data['logs'].append(current_log)
3395
+ if len(env_data['logs']) > 30:
3396
+ env_data['logs'] = env_data['logs'][-30:]
3397
+
3398
+ env_type = env_data.get("type", "closed")
3399
+ if env_type == 'closed':
3400
+ stored_token = env_data.get("device_token")
3401
+ if not stored_token:
3402
+ new_token_to_set = ''.join(random.choices(string.ascii_letters + string.digits, k=40))
3403
+ env_data['device_token'] = new_token_to_set
3404
+
3405
+ data[env_id] = env_data
3406
+ save_data(data)
3407
+
3408
+ keyword = env_data.get("keyword", "")
3409
+ prompts_data = load_prompts()
3410
+
3411
+ if env_type == 'open':
3412
+ return render_template_string(SYNKRIS_LOOK_TEMPLATE, keyword=keyword, prompts_data=prompts_data)
3413
+
3414
+ user_token = request.cookies.get(f'access_token_{env_id}')
3415
+ stored_token = env_data.get("device_token")
3416
+
3417
+ if new_token_to_set:
3418
+ resp = make_response(render_template_string(SYNKRIS_LOOK_TEMPLATE, keyword=keyword, prompts_data=prompts_data))
3419
+ resp.set_cookie(f'access_token_{env_id}', new_token_to_set, max_age=31536000, httponly=True, samesite='Lax')
3420
+ return resp
3421
+ elif stored_token and user_token == stored_token:
3422
+ return render_template_string(SYNKRIS_LOOK_TEMPLATE, keyword=keyword, prompts_data=prompts_data)
3423
+ else:
3424
+ return """
3425
+ <!DOCTYPE html>
3426
+ <html lang="ru">
3427
+ <head>
3428
+ <meta charset="UTF-8">
3429
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
3430
+ <title>Доступ запрещен</title>
3431
+ <style>
3432
+ body {
3433
+ font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif;
3434
+ background: #111;
3435
+ color: #eee;
3436
+ display: flex;
3437
+ align-items: center;
3438
+ justify-content: center;
3439
+ height: 100vh;
3440
+ margin: 0;
3441
+ text-align: center;
3442
+ flex-direction: column;
3443
+ }
3444
+ .container {
3445
+ padding: 40px;
3446
+ background: #1a1a1a;
3447
+ border-radius: 16px;
3448
+ border: 1px solid #333;
3449
+ box-shadow: 0 10px 30px rgba(0,0,0,0.5);
3450
+ }
3451
+ h1 {
3452
+ color: #ff4d4d;
3453
+ margin-top: 0;
3454
+ margin-bottom: 15px;
3455
+ font-size: 2.5rem;
3456
+ }
3457
+ p {
3458
+ color: #aaa;
3459
+ font-size: 1.1rem;
3460
+ max-width: 400px;
3461
+ }
3462
+ </style>
3463
+ </head>
3464
+ <body>
3465
+ <div class="container">
3466
+ <h1>⛔ Доступ запрещен</h1>
3467
+ <p>Эта ссылка уже привязана к другому устройству или браузеру.</p>
3468
+ </div>
3469
+ </body>
3470
+ </html>
3471
+ """, 403
3472
+
3473
+ if __name__ == '__main__':
3474
+ setup_initial_files()
3475
+ download_db_from_hf()
3476
+ if HF_TOKEN_WRITE:
3477
+ backup_thread = threading.Thread(target=periodic_backup, daemon=True)
3478
+ backup_thread.start()
3479
+ port = int(os.environ.get('PORT', 7860))
3480
+ app.run(debug=False, host='0.0.0.0', port=port)