Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- from http.server import BaseHTTPRequestHandler, HTTPServer
- import urllib.parse
- import json
- import threading
- # Configuração do servidor
- HOST = "localhost" # Endereço IP do servidor
- PORT = 8000
- # Estado global dos ESPs e lista de banidos
- esp_devices = {} # {id: state}
- banned_ids = set()
- # Função para validar o ID
- def decifrar(id):
- if not id.isdigit():
- return False
- id = [int(x) for x in id]
- tamanho = len(id) - 2
- digitos = id[:tamanho]
- soma1 = sum(digitos[i] * (tamanho - 1 - i) for i in range(tamanho - 1))
- digito1 = (soma1 * 10) % 11
- if digito1 == 10:
- digito1 = 0
- soma2 = sum(digitos[i] * (tamanho - i) for i in range(tamanho))
- digito2 = (soma2 * 10) % 11
- if digito2 == 10:
- digito2 = 0
- return digito1 == id[tamanho] and digito2 == id[tamanho + 1]
- # Página HTML principal
- with open("index.html", "r") as f:
- HTML_PAGE = f.read()
- class ControlHandler(BaseHTTPRequestHandler):
- def do_GET(self):
- print(f"[DEBUG] Requisição POST recebida: {self.path}")
- parsed = urllib.parse.urlparse(self.path)
- if parsed.path == "/":
- self.send_response(200)
- self.send_header('Content-type', 'text/html')
- self.end_headers()
- self.wfile.write(HTML_PAGE.encode())
- elif parsed.path == "/status":
- query = urllib.parse.parse_qs(parsed.query)
- esp_id = query.get("id", [None])[0]
- print(f"[STATUS] Consulta para ID: {esp_id}")
- print(f"[STATUS] IDs registrados: {list(esp_devices.keys())}")
- query = urllib.parse.parse_qs(parsed.query)
- esp_id = query.get("id", [None])[0]
- if esp_id in esp_devices:
- state = esp_devices[esp_id]
- self.send_response(200)
- self.send_header('Content-type', 'text/plain')
- self.end_headers()
- self.wfile.write(str(state).encode())
- else:
- self.send_error(404, "ESP ID não encontrado")
- elif parsed.path == "/esp_list":
- self.send_response(200)
- self.send_header('Content-type', 'application/json')
- self.end_headers()
- data = [{"id": k, "state": v} for k, v in esp_devices.items()]
- self.wfile.write(json.dumps(data).encode())
- else:
- self.send_error(404)
- def do_POST(self):
- parsed = urllib.parse.urlparse(self.path)
- length = int(self.headers.get('Content-Length', 0))
- post_data = urllib.parse.parse_qs(self.rfile.read(length).decode())
- print(f"[DEBUG] Requisição POST recebida: {self.path}")
- if parsed.path == "/poll":
- esp_id = post_data.get("id", [""])[0]
- print(f"[POLL] Requisição recebida com ID: {esp_id}")
- if esp_id in banned_ids:
- print(f"[POLL] ID {esp_id} já está banido.")
- elif not decifrar(esp_id):
- print(f"[POLL] ID {esp_id} é inválido (não passou na validação).")
- if esp_id in banned_ids or not decifrar(esp_id):
- banned_ids.add(esp_id)
- print(f"[POLL] ESP ID {esp_id} inválido ou banido. Enviando 403.")
- self.send_response(403)
- self.send_header("Content-Type", "text/plain")
- self.send_header("Content-Length", "0")
- self.end_headers()
- return
- if esp_id not in esp_devices:
- print(f"[POLL] Novo ESP registrado com ID: {esp_id}")
- esp_devices[esp_id] = False
- else:
- print(f"[POLL] ESP {esp_id} já registrado.")
- response = "ON" if esp_devices[esp_id] else "OFF"
- self.send_response(200)
- self.send_header("Content-type", "text/plain")
- self.end_headers()
- self.wfile.write(response.encode())
- print(f"[POLL] Estado atual dos dispositivos: {esp_devices}")
- # Envia resposta válida
- resposta = "OK"
- resposta_bytes = resposta.encode()
- self.send_response(200)
- self.send_header("Content-Type", "text/plain")
- self.send_header("Content-Length", str(len(resposta_bytes)))
- self.end_headers()
- self.wfile.write(resposta_bytes)
- elif parsed.path == "/control":
- esp_id = post_data.get("id", [""])[0]
- if esp_id in esp_devices:
- esp_devices[esp_id] = not esp_devices[esp_id]
- print(f"[CONTROL] Estado do ESP {esp_id} agora é {'ON' if esp_devices[esp_id] else 'OFF'}")
- self.send_response(200)
- self.end_headers()
- else:
- print(f"[CONTROL] ID {esp_id} não encontrado.")
- self.send_error(404, "ESP ID não encontrado")
- else:
- self.send_error(404, "Endpoint não encontrado")
- def run_server():
- server = HTTPServer((HOST, PORT), ControlHandler)
- print(f"Servidor rodando em http://{HOST}:{PORT}")
- try:
- server.serve_forever()
- except KeyboardInterrupt:
- pass
- server.server_close()
- print("Servidor parado.")
- if __name__ == "__main__":
- run_server()
Add Comment
Please, Sign In to add comment