mirror of
https://github.com/star-inc/star_yuuki_bot.git
synced 2024-09-20 06:46:17 +08:00
Add WebAdmin
This commit is contained in:
parent
f310b8928f
commit
62cc4e7a57
73
libs/webadmin/server.py
Normal file
73
libs/webadmin/server.py
Normal file
|
@ -0,0 +1,73 @@
|
|||
import hashlib
|
||||
import json
|
||||
import random
|
||||
import time
|
||||
|
||||
from flask import Flask, render_template, Response, request, redirect
|
||||
from flask_bootstrap import Bootstrap
|
||||
|
||||
wa_app = Flask(__name__)
|
||||
|
||||
passports = []
|
||||
password = str(hash(random.random()))
|
||||
|
||||
class Yuuki_WebAdmin:
|
||||
def __init__(self):
|
||||
self.app = wa_app
|
||||
Bootstrap(self.app)
|
||||
|
||||
@staticmethod
|
||||
@wa_app.route("/")
|
||||
def index():
|
||||
if "yuuki_admin" in request.cookies:
|
||||
if request.cookies["yuuki_admin"] in passports:
|
||||
return render_template('manage.html')
|
||||
else:
|
||||
response = redirect("/")
|
||||
response.set_cookie(
|
||||
key='yuuki_admin',
|
||||
value='',
|
||||
expires=0
|
||||
)
|
||||
return response
|
||||
else:
|
||||
return render_template('index.html')
|
||||
|
||||
@staticmethod
|
||||
@wa_app.route("/verify", methods=['GET', 'POST'])
|
||||
def verify():
|
||||
result = {"status": 403}
|
||||
if request.method == "POST" and "code" in request.values:
|
||||
if request.values["code"] == password:
|
||||
seed = hash(random.random() + time.time())
|
||||
seed = str(seed).encode('utf-8')
|
||||
session_key = hashlib.sha256(seed).hexdigest()
|
||||
passports.append(session_key)
|
||||
result = {"status": 200, "session": session_key}
|
||||
else:
|
||||
result = {"status": 401}
|
||||
return Response(json.dumps(result), mimetype='application/json')
|
||||
|
||||
|
||||
@staticmethod
|
||||
@wa_app.route("/logout")
|
||||
def logout():
|
||||
response = redirect("/")
|
||||
if "yuuki_admin" in request.cookies:
|
||||
if request.cookies.get("yuuki_admin") in passports:
|
||||
passports.remove(request.cookies.get("yuuki_admin"))
|
||||
response.set_cookie(
|
||||
key='yuuki_admin',
|
||||
value='',
|
||||
expires=0
|
||||
)
|
||||
return response
|
||||
|
||||
@staticmethod
|
||||
def set_password(code):
|
||||
global password
|
||||
password = code
|
||||
|
||||
def start(self, admin_password):
|
||||
self.set_password(admin_password)
|
||||
self.app.run(port=2020, debug=True)
|
102
libs/webadmin/templates/index.html
Normal file
102
libs/webadmin/templates/index.html
Normal file
|
@ -0,0 +1,102 @@
|
|||
<!doctype html>
|
||||
<html lang="en">
|
||||
|
||||
<head>
|
||||
<!-- Required meta tags -->
|
||||
<meta charset="utf-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
|
||||
|
||||
<!-- Bootstrap CSS -->
|
||||
{{ bootstrap.load_css() }}
|
||||
|
||||
<style>
|
||||
body {
|
||||
padding-top: 5rem;
|
||||
}
|
||||
|
||||
.starter-template {
|
||||
padding: 3rem 1.5rem;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.damage {
|
||||
color: #ff0000;
|
||||
}
|
||||
|
||||
.password_box {
|
||||
margin: 0;
|
||||
position: absolute;
|
||||
left: 50%;
|
||||
margin-right: -50%;
|
||||
transform: translate(-50%, -50%);
|
||||
}
|
||||
</style>
|
||||
|
||||
<title>Star Yuuki BOT - WebAdmin</title>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
|
||||
{% from 'bootstrap/nav.html' import render_nav_item %}
|
||||
|
||||
<nav class="navbar navbar-expand-md navbar-dark fixed-top bg-dark">
|
||||
<a class="navbar-brand" href="#">Yuuki - WebAdmin</a>
|
||||
<button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarCollapse"
|
||||
aria-controls="navbarCollapse" aria-expanded="false" aria-label="Toggle navigation">
|
||||
<span class="navbar-toggler-icon"></span>
|
||||
</button>
|
||||
<div class="collapse navbar-collapse" id="navbarCollapse">
|
||||
<ul class="navbar-nav mr-auto">
|
||||
{{ render_nav_item('index') }}
|
||||
</ul>
|
||||
</div>
|
||||
</nav>
|
||||
|
||||
<main role="main" class="container">
|
||||
|
||||
<div class="starter-template">
|
||||
<h1>Star Yuuki BOT - WebAdmin</h1>
|
||||
<p class="lead">Version {{ version }}</p>
|
||||
<p>
|
||||
The administrator control center of LINE BOT
|
||||
</p>
|
||||
<div class="status damage"></div>
|
||||
</div>
|
||||
|
||||
<div class="password_box">
|
||||
<form class="form-inline mt-2 mt-md-0 login-box" method="post">
|
||||
<input class="form-control mr-sm-2" type="password" placeholder="Type your admin password"
|
||||
aria-label="Login" name="code">
|
||||
<button class="btn btn-outline-success my-2 my-sm-0" type="submit">Login</button>
|
||||
</form>
|
||||
<div class="datahere"></div>
|
||||
</div>
|
||||
</main>
|
||||
|
||||
<!-- Optional JavaScript -->
|
||||
{{ bootstrap.load_js() }}
|
||||
<script src="https://cdn.jsdelivr.net/npm/js-cookie@beta/dist/js.cookie.min.js"></script>
|
||||
<script>
|
||||
$(function () {
|
||||
$('form.login-box').on('submit', function (e) {
|
||||
$.ajax({
|
||||
type: "POST",
|
||||
url: "/verify",
|
||||
data: $(this).serialize(),
|
||||
success: function (data) {
|
||||
if (data.status == 200) {
|
||||
$(".status").text("Welcome");
|
||||
Cookies.set('yuuki_admin', data.session);
|
||||
location.reload();
|
||||
} else {
|
||||
$(".status").text("Wrong password")
|
||||
}
|
||||
}
|
||||
});
|
||||
e.preventDefault();
|
||||
});
|
||||
});
|
||||
</script>
|
||||
</body>
|
||||
|
||||
</html>
|
53
libs/webadmin/templates/manage.html
Normal file
53
libs/webadmin/templates/manage.html
Normal file
|
@ -0,0 +1,53 @@
|
|||
<!doctype html>
|
||||
<html lang="en">
|
||||
|
||||
<head>
|
||||
<!-- Required meta tags -->
|
||||
<meta charset="utf-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
|
||||
|
||||
<!-- Bootstrap CSS -->
|
||||
{{ bootstrap.load_css() }}
|
||||
|
||||
<style>
|
||||
body {
|
||||
padding-top: 5rem;
|
||||
}
|
||||
|
||||
.starter-template {
|
||||
padding: 3rem 1.5rem;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.damage {
|
||||
color: #ff0000;
|
||||
}
|
||||
</style>
|
||||
<title>Star Yuuki BOT - WebAdmin</title>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
|
||||
{% from 'bootstrap/nav.html' import render_nav_item %}
|
||||
|
||||
<nav class="navbar navbar-expand-md navbar-dark fixed-top bg-dark">
|
||||
<a class="navbar-brand" href="#">Yuuki - WebAdmin</a>
|
||||
<button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarCollapse"
|
||||
aria-controls="navbarCollapse" aria-expanded="false" aria-label="Toggle navigation">
|
||||
<span class="navbar-toggler-icon"></span>
|
||||
</button>
|
||||
<div class="collapse navbar-collapse" id="navbarCollapse">
|
||||
<ul class="navbar-nav mr-auto">
|
||||
{{ render_nav_item('index') }}
|
||||
</ul>
|
||||
<a href="/logout"><button class="btn btn-outline-success my-2 my-sm-0">Logout</button></a>
|
||||
</div>
|
||||
</nav>
|
||||
|
||||
{% block body %}{% endblock%}
|
||||
|
||||
<!-- Optional JavaScript -->
|
||||
{{ bootstrap.load_js() }}
|
||||
</body>
|
||||
|
||||
</html>
|
|
@ -1,3 +1,5 @@
|
|||
flask==1.1.1
|
||||
bootstrap-flask==1.2.0
|
||||
certifi==2019.11.28
|
||||
chardet==3.0.4
|
||||
gitdb2==2.0.6
|
||||
|
|
Loading…
Reference in a new issue