Spaces:
Sleeping
Sleeping
Update app.py
Browse files
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)
|