Initial commit
This commit is contained in:
parent
3431e3818f
commit
a2a595e6a0
5
AutoZoom/api/changelogs/2.6.json
Normal file
5
AutoZoom/api/changelogs/2.6.json
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
{
|
||||||
|
"en": ["Adjustments have been made to the Discord RPC system", "Created a temporary fix for Python 3.10 and Discord RPC"],
|
||||||
|
"uk": ["Внесені коректировки в систему роботи Discord RPC", "Зроблений тимчасовий фікс проблем Python 3.10 та Discord RPC"],
|
||||||
|
"ru": ["Внесены корректировки в систему работы Discord RPC", "Создан временный фикс проблем Python 3.10 и Discord RPC"]
|
||||||
|
}
|
4
AutoZoom/api/version.json
Normal file
4
AutoZoom/api/version.json
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
{
|
||||||
|
"dev": 2.7,
|
||||||
|
"stable": 2.6
|
||||||
|
}
|
15
config.json
Normal file
15
config.json
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
{
|
||||||
|
"address": "127.0.0.1",
|
||||||
|
"port": 8080,
|
||||||
|
"url": "https://api.end-play.xyz",
|
||||||
|
"data_location": "data/",
|
||||||
|
"autozoom_location": "AutoZoom/api/",
|
||||||
|
"telegram_bot_token": "12345678:asdfghjklzxcvbnm",
|
||||||
|
"messages": {
|
||||||
|
"key_expired": "API key expired",
|
||||||
|
"key_invalid": "Invalid API key",
|
||||||
|
"key_valid": "Valid API key",
|
||||||
|
"bad_request": "Bad request",
|
||||||
|
"ip_blacklisted": "Your IP is blacklisted. Make sure you are using correct API address."
|
||||||
|
}
|
||||||
|
}
|
314
daemon.py
Normal file
314
daemon.py
Normal file
@ -0,0 +1,314 @@
|
|||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
|
||||||
|
from datetime import datetime
|
||||||
|
from http.server import HTTPServer, BaseHTTPRequestHandler
|
||||||
|
|
||||||
|
import ujson
|
||||||
|
import os
|
||||||
|
import random
|
||||||
|
import shutil
|
||||||
|
import requests
|
||||||
|
import string
|
||||||
|
import traceback
|
||||||
|
|
||||||
|
from urllib.parse import parse_qs, urlsplit
|
||||||
|
|
||||||
|
def jsonLoad(path):
|
||||||
|
data = open(path, "r", encoding='utf-8')
|
||||||
|
out = ujson.load(data)
|
||||||
|
data.close()
|
||||||
|
return out
|
||||||
|
|
||||||
|
def jsonSave(path, value):
|
||||||
|
file = open(path, "w", encoding='utf-8')
|
||||||
|
file.write(ujson.dumps(value, indent=4))
|
||||||
|
file.close()
|
||||||
|
|
||||||
|
def apiKeyInvalid(obj):
|
||||||
|
obj.send_response(401)
|
||||||
|
obj.send_header('Content-type', 'application/json; charset=utf-8')
|
||||||
|
obj.end_headers()
|
||||||
|
obj.wfile.write(b'{"code":401, "message": "Invalid API key"}')
|
||||||
|
return
|
||||||
|
|
||||||
|
def apiKeyExpired(obj):
|
||||||
|
obj.send_response(403)
|
||||||
|
obj.send_header('Content-type', 'application/json; charset=utf-8')
|
||||||
|
obj.end_headers()
|
||||||
|
obj.wfile.write(b'{"code":403, "message": "API key expired"}')
|
||||||
|
return
|
||||||
|
|
||||||
|
def badRequest(obj):
|
||||||
|
obj.send_response(400)
|
||||||
|
obj.send_header('Content-type', 'application/json; charset=utf-8')
|
||||||
|
obj.end_headers()
|
||||||
|
obj.wfile.write(b'{"code":400, "message": "Bad request"}')
|
||||||
|
return
|
||||||
|
|
||||||
|
def okRequest(obj):
|
||||||
|
obj.send_response(200)
|
||||||
|
obj.send_header('Content-type', 'application/json; charset=utf-8')
|
||||||
|
obj.end_headers()
|
||||||
|
obj.wfile.write(b'{"code":200, "message": "ok"}')
|
||||||
|
return
|
||||||
|
|
||||||
|
def blacklistedRequest(obj):
|
||||||
|
obj.send_response(403)
|
||||||
|
obj.send_header('Content-type', 'application/json; charset=utf-8')
|
||||||
|
obj.end_headers()
|
||||||
|
obj.wfile.write(b'{"code":403, "message": "Your IP is blacklisted. Make sure you are using correct API address."}')
|
||||||
|
obj.close_connection
|
||||||
|
return
|
||||||
|
|
||||||
|
def azGenKey(ipaddr):
|
||||||
|
|
||||||
|
az_requests = jsonLoad(config["data_location"]+"az_requests.json")
|
||||||
|
today_day = datetime.now().strftime("%d.%m.%Y")
|
||||||
|
|
||||||
|
if ipaddr in az_requests:
|
||||||
|
|
||||||
|
if today_day in az_requests[ipaddr]:
|
||||||
|
|
||||||
|
if az_requests[ipaddr][today_day] > 4:
|
||||||
|
return False
|
||||||
|
|
||||||
|
else:
|
||||||
|
az_requests[ipaddr][today_day] = 0
|
||||||
|
|
||||||
|
else:
|
||||||
|
az_requests[ipaddr] = {}
|
||||||
|
az_requests[ipaddr][today_day] = 0
|
||||||
|
|
||||||
|
api_keys = jsonLoad(config["data_location"]+"api_keys.json")
|
||||||
|
|
||||||
|
key = ''.join(random.sample(string.ascii_letters + string.digits, 20))
|
||||||
|
|
||||||
|
api_keys["autozoom"].append(key)
|
||||||
|
az_requests[ipaddr][today_day] += 1
|
||||||
|
|
||||||
|
jsonSave(config["data_location"]+"api_keys.json", api_keys)
|
||||||
|
jsonSave(config["data_location"]+"az_requests.json", az_requests)
|
||||||
|
|
||||||
|
return key
|
||||||
|
|
||||||
|
conffile = open("config.json", "r")
|
||||||
|
config = ujson.load(conffile)
|
||||||
|
conffile.close()
|
||||||
|
|
||||||
|
|
||||||
|
class SimpleHTTPRequestHandler(BaseHTTPRequestHandler):
|
||||||
|
|
||||||
|
def do_GET(self):
|
||||||
|
|
||||||
|
global config
|
||||||
|
|
||||||
|
blacklist = jsonLoad(config["data_location"]+"blacklist.json")
|
||||||
|
|
||||||
|
for addr in blacklist:
|
||||||
|
if addr == str(self.headers["X-Real-IP"]):
|
||||||
|
blacklistedRequest(self)
|
||||||
|
|
||||||
|
keys = jsonLoad(config["data_location"]+"api_keys.json")
|
||||||
|
expired = jsonLoad(config["data_location"]+"expired_keys.json")
|
||||||
|
|
||||||
|
try:
|
||||||
|
fullpath = config["url"]+self.path
|
||||||
|
reqpath = urlsplit(fullpath).path
|
||||||
|
requery = parse_qs(urlsplit(fullpath).query)
|
||||||
|
|
||||||
|
if reqpath == "/favicon.ico":
|
||||||
|
|
||||||
|
with open("favicon.ico", 'rb') as f:
|
||||||
|
self.send_response(200)
|
||||||
|
self.send_header(
|
||||||
|
"Content-Type", 'application/octet-stream')
|
||||||
|
self.send_header(
|
||||||
|
"Content-Disposition", 'attachment; filename="{}"'.format(os.path.basename("favicon.ico")))
|
||||||
|
fs = os.fstat(f.fileno())
|
||||||
|
self.send_header("Content-Length", str(fs.st_size))
|
||||||
|
self.end_headers()
|
||||||
|
shutil.copyfileobj(f, self.wfile)
|
||||||
|
f.close()
|
||||||
|
|
||||||
|
elif (reqpath == "/azVersion"):
|
||||||
|
|
||||||
|
if requery["apikey"][0] == "publickey":
|
||||||
|
|
||||||
|
file = open(config["autozoom_location"]+"version.json", "r")
|
||||||
|
versions = ujson.load(file)
|
||||||
|
file.close()
|
||||||
|
|
||||||
|
output = versions["stable"]
|
||||||
|
|
||||||
|
if "branch" in reqpath:
|
||||||
|
if requery["branch"][0] == "dev":
|
||||||
|
output = versions["dev"]
|
||||||
|
|
||||||
|
self.send_response(200)
|
||||||
|
self.send_header('Content-type', 'application/json; charset=utf-8')
|
||||||
|
self.end_headers()
|
||||||
|
self.wfile.write(bytes(ujson.dumps({"version": output}), encoding='utf-8'))
|
||||||
|
|
||||||
|
elif requery["apikey"][0] in expired:
|
||||||
|
apiKeyExpired(self)
|
||||||
|
|
||||||
|
else:
|
||||||
|
apiKeyInvalid(self)
|
||||||
|
|
||||||
|
elif (reqpath == "/azChangelog"):
|
||||||
|
|
||||||
|
if requery["apikey"][0] == "publickey":
|
||||||
|
|
||||||
|
file = open(f'{config["autozoom_location"]}changelogs/{requery["version"][0]}.json', "r")
|
||||||
|
output = ujson.load(file)[requery["locale"][0]]
|
||||||
|
file.close()
|
||||||
|
|
||||||
|
self.send_response(200)
|
||||||
|
self.send_header('Content-type', 'application/json; charset=utf-8')
|
||||||
|
self.end_headers()
|
||||||
|
self.wfile.write(bytes(ujson.dumps({"changelog": output}, ensure_ascii=False), encoding='utf-8'))
|
||||||
|
|
||||||
|
elif requery["apikey"][0] in expired:
|
||||||
|
apiKeyExpired(self)
|
||||||
|
|
||||||
|
else:
|
||||||
|
apiKeyInvalid(self)
|
||||||
|
|
||||||
|
elif (reqpath == "/azRequestKey"):
|
||||||
|
|
||||||
|
if requery["apikey"][0] == "publickey":
|
||||||
|
|
||||||
|
generated_key = azGenKey(str(self.headers["X-Real-IP"]))
|
||||||
|
|
||||||
|
if not generated_key:
|
||||||
|
|
||||||
|
self.send_response(403)
|
||||||
|
self.send_header('Content-type', 'application/json; charset=utf-8')
|
||||||
|
self.end_headers()
|
||||||
|
self.wfile.write(b'{"code":403, "message": "Too many new key requests for today. Try again later."}')
|
||||||
|
|
||||||
|
else:
|
||||||
|
|
||||||
|
self.send_response(200)
|
||||||
|
self.send_header('Content-type', 'application/json; charset=utf-8')
|
||||||
|
self.end_headers()
|
||||||
|
self.wfile.write(bytes('{"code":200, "message": "ok", "apikey": "' + generated_key + '"}', encoding='utf-8'))
|
||||||
|
|
||||||
|
elif requery["apikey"][0] in expired:
|
||||||
|
apiKeyExpired(self)
|
||||||
|
|
||||||
|
else:
|
||||||
|
apiKeyInvalid(self)
|
||||||
|
|
||||||
|
elif (reqpath == "/update"):
|
||||||
|
|
||||||
|
if requery["app"][0] == "autozoom":
|
||||||
|
|
||||||
|
if requery["apikey"][0] == "publickey":
|
||||||
|
|
||||||
|
filepath = config["autozoom_location"]+"AutoZoomLatest.zip"
|
||||||
|
|
||||||
|
with open(filepath, 'rb') as f:
|
||||||
|
self.send_response(200)
|
||||||
|
self.send_header("Content-Type", 'application/octet-stream')
|
||||||
|
self.send_header("Content-Disposition", 'attachment; filename="{}"'.format(os.path.basename(filepath)))
|
||||||
|
fs = os.fstat(f.fileno())
|
||||||
|
self.send_header("Content-Length", str(fs.st_size))
|
||||||
|
self.end_headers()
|
||||||
|
shutil.copyfileobj(f, self.wfile)
|
||||||
|
f.close()
|
||||||
|
|
||||||
|
else:
|
||||||
|
apiKeyInvalid(self)
|
||||||
|
|
||||||
|
else:
|
||||||
|
badRequest(self)
|
||||||
|
|
||||||
|
else:
|
||||||
|
badRequest(self)
|
||||||
|
|
||||||
|
except Exception as exp:
|
||||||
|
badRequest(self)
|
||||||
|
traceback.print_exc()
|
||||||
|
|
||||||
|
def do_POST(self):
|
||||||
|
|
||||||
|
global config
|
||||||
|
|
||||||
|
blacklist = jsonLoad(config["data_location"]+"blacklist.json")
|
||||||
|
|
||||||
|
for addr in blacklist:
|
||||||
|
if addr == str(self.headers["X-Real-IP"]):
|
||||||
|
blacklistedRequest(self)
|
||||||
|
|
||||||
|
content_length = int(self.headers['Content-Length'])
|
||||||
|
body = self.rfile.read(content_length).decode("utf-8")
|
||||||
|
|
||||||
|
keys = jsonLoad(config["data_location"]+"api_keys.json")
|
||||||
|
expired = jsonLoad(config["data_location"]+"expired_keys.json")
|
||||||
|
|
||||||
|
try:
|
||||||
|
fullpath = config["url"]+self.path
|
||||||
|
reqpath = urlsplit(fullpath).path
|
||||||
|
requery = parse_qs(urlsplit(fullpath).query)
|
||||||
|
data = body
|
||||||
|
|
||||||
|
if (reqpath == "/azSendMessage"):
|
||||||
|
|
||||||
|
if requery["apikey"][0] in keys["autozoom"]:
|
||||||
|
|
||||||
|
keys_storage = jsonLoad(config["data_location"]+"keys_storage.json")
|
||||||
|
|
||||||
|
if requery["apikey"][0] in keys_storage:
|
||||||
|
|
||||||
|
try:
|
||||||
|
if "message" in reqpath:
|
||||||
|
try:
|
||||||
|
output = requests.post(
|
||||||
|
url=f'https://api.telegram.org/bot{config["telegram_bot_token"]}/sendMessage?chat_id={keys_storage[requery["apikey"][0]]}&text={requery["message"][0]}'
|
||||||
|
)
|
||||||
|
except:
|
||||||
|
output = requests.post(
|
||||||
|
url=f'https://api.telegram.org/bot{config["telegram_bot_token"]}/sendMessage',
|
||||||
|
data={'chat_id': keys_storage[requery["apikey"][0]], 'text': ujson.loads(data)["message"]}
|
||||||
|
)
|
||||||
|
else:
|
||||||
|
output = requests.post(
|
||||||
|
url=f'https://api.telegram.org/bot{config["telegram_bot_token"]}/sendMessage',
|
||||||
|
data={'chat_id': keys_storage[requery["apikey"][0]], 'text': ujson.loads(data)["message"]}
|
||||||
|
)
|
||||||
|
if output.status_code == requests.codes.ok:
|
||||||
|
okRequest(self)
|
||||||
|
else:
|
||||||
|
badRequest(self)
|
||||||
|
except:
|
||||||
|
traceback.print_exc()
|
||||||
|
badRequest(self)
|
||||||
|
|
||||||
|
else:
|
||||||
|
|
||||||
|
self.send_response(400)
|
||||||
|
self.send_header('Content-type', 'application/json; charset=utf-8')
|
||||||
|
self.end_headers()
|
||||||
|
self.wfile.write(b'{"code":400, "message": "Bad request. This key might not be linked to Telegram user."}')
|
||||||
|
|
||||||
|
elif requery["apikey"][0] in expired:
|
||||||
|
apiKeyExpired(self)
|
||||||
|
|
||||||
|
else:
|
||||||
|
apiKeyInvalid(self)
|
||||||
|
|
||||||
|
else:
|
||||||
|
badRequest(self)
|
||||||
|
|
||||||
|
except Exception as exp:
|
||||||
|
badRequest(self)
|
||||||
|
traceback.print_exc()
|
||||||
|
|
||||||
|
|
||||||
|
httpd = HTTPServer((config["address"], config["port"]), SimpleHTTPRequestHandler)
|
||||||
|
|
||||||
|
try:
|
||||||
|
httpd.serve_forever()
|
||||||
|
except KeyboardInterrupt:
|
||||||
|
pass
|
3
data/api_keys.json
Normal file
3
data/api_keys.json
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
{
|
||||||
|
"autozoom": []
|
||||||
|
}
|
1
data/az_requests.json
Normal file
1
data/az_requests.json
Normal file
@ -0,0 +1 @@
|
|||||||
|
{}
|
1
data/blacklist.json
Normal file
1
data/blacklist.json
Normal file
@ -0,0 +1 @@
|
|||||||
|
[]
|
1
data/expired_keys.json
Normal file
1
data/expired_keys.json
Normal file
@ -0,0 +1 @@
|
|||||||
|
[]
|
BIN
favicon.ico
Normal file
BIN
favicon.ico
Normal file
Binary file not shown.
After Width: | Height: | Size: 156 KiB |
4
requirements.txt
Normal file
4
requirements.txt
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
ujson
|
||||||
|
requests
|
||||||
|
shutil
|
||||||
|
urllib
|
Reference in New Issue
Block a user