that_one_nigga_you_k

backend que tem ID

Apr 11th, 2025 (edited)
69
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 5.35 KB | None | 0 0
  1. from http.server import BaseHTTPRequestHandler, HTTPServer
  2. import urllib.parse
  3. import json
  4. import threading
  5.  
  6. # Configuração do servidor
  7. HOST = "localhost"  # Endereço IP do servidor
  8. PORT = 8000
  9.  
  10. # Estado global dos ESPs e lista de banidos
  11. esp_devices = {}  # {id: state}
  12. banned_ids = set()
  13.  
  14. # Função para validar o ID
  15. def decifrar(id):
  16.     if not id.isdigit():
  17.         return False
  18.     id = [int(x) for x in id]
  19.     tamanho = len(id) - 2
  20.     digitos = id[:tamanho]
  21.  
  22.     soma1 = sum(digitos[i] * (tamanho - 1 - i) for i in range(tamanho - 1))
  23.     digito1 = (soma1 * 10) % 11
  24.     if digito1 == 10:
  25.         digito1 = 0
  26.  
  27.     soma2 = sum(digitos[i] * (tamanho - i) for i in range(tamanho))
  28.     digito2 = (soma2 * 10) % 11
  29.     if digito2 == 10:
  30.         digito2 = 0
  31.  
  32.     return digito1 == id[tamanho] and digito2 == id[tamanho + 1]
  33.  
  34. # Página HTML principal
  35. with open("index.html", "r") as f:
  36.     HTML_PAGE = f.read()
  37.  
  38. class ControlHandler(BaseHTTPRequestHandler):
  39.     def do_GET(self):
  40.        
  41.         print(f"[DEBUG] Requisição POST recebida: {self.path}")
  42.  
  43.         parsed = urllib.parse.urlparse(self.path)
  44.         if parsed.path == "/":
  45.             self.send_response(200)
  46.             self.send_header('Content-type', 'text/html')
  47.             self.end_headers()
  48.             self.wfile.write(HTML_PAGE.encode())
  49.  
  50.         elif parsed.path == "/status":
  51.            
  52.             query = urllib.parse.parse_qs(parsed.query)
  53.             esp_id = query.get("id", [None])[0]
  54.             print(f"[STATUS] Consulta para ID: {esp_id}")
  55.             print(f"[STATUS] IDs registrados: {list(esp_devices.keys())}")
  56.  
  57.             query = urllib.parse.parse_qs(parsed.query)
  58.             esp_id = query.get("id", [None])[0]
  59.             if esp_id in esp_devices:
  60.                 state = esp_devices[esp_id]
  61.                 self.send_response(200)
  62.                 self.send_header('Content-type', 'text/plain')
  63.                 self.end_headers()
  64.                 self.wfile.write(str(state).encode())
  65.             else:
  66.                 self.send_error(404, "ESP ID não encontrado")
  67.  
  68.         elif parsed.path == "/esp_list":
  69.             self.send_response(200)
  70.             self.send_header('Content-type', 'application/json')
  71.             self.end_headers()
  72.             data = [{"id": k, "state": v} for k, v in esp_devices.items()]
  73.             self.wfile.write(json.dumps(data).encode())
  74.  
  75.         else:
  76.             self.send_error(404)
  77.  
  78.     def do_POST(self):
  79.         parsed = urllib.parse.urlparse(self.path)
  80.         length = int(self.headers.get('Content-Length', 0))
  81.         post_data = urllib.parse.parse_qs(self.rfile.read(length).decode())
  82.         print(f"[DEBUG] Requisição POST recebida: {self.path}")
  83.        
  84.  
  85.  
  86.         if parsed.path == "/poll":
  87.             esp_id = post_data.get("id", [""])[0]
  88.             print(f"[POLL] Requisição recebida com ID: {esp_id}")
  89.  
  90.             if esp_id in banned_ids:
  91.                 print(f"[POLL] ID {esp_id} já está banido.")
  92.             elif not decifrar(esp_id):
  93.                 print(f"[POLL] ID {esp_id} é inválido (não passou na validação).")
  94.  
  95.             if esp_id in banned_ids or not decifrar(esp_id):
  96.                 banned_ids.add(esp_id)
  97.                 print(f"[POLL] ESP ID {esp_id} inválido ou banido. Enviando 403.")
  98.                 self.send_response(403)
  99.                 self.send_header("Content-Type", "text/plain")
  100.                 self.send_header("Content-Length", "0")
  101.                 self.end_headers()
  102.                 return
  103.  
  104.             if esp_id not in esp_devices:
  105.                 print(f"[POLL] Novo ESP registrado com ID: {esp_id}")
  106.                 esp_devices[esp_id] = False
  107.             else:
  108.                 print(f"[POLL] ESP {esp_id} já registrado.")
  109.                 response = "ON" if esp_devices[esp_id] else "OFF"
  110.                 self.send_response(200)
  111.                 self.send_header("Content-type", "text/plain")
  112.                 self.end_headers()
  113.                 self.wfile.write(response.encode())
  114.  
  115.             print(f"[POLL] Estado atual dos dispositivos: {esp_devices}")
  116.  
  117.             # Envia resposta válida
  118.             resposta = "OK"
  119.             resposta_bytes = resposta.encode()
  120.  
  121.             self.send_response(200)
  122.             self.send_header("Content-Type", "text/plain")
  123.             self.send_header("Content-Length", str(len(resposta_bytes)))
  124.             self.end_headers()
  125.             self.wfile.write(resposta_bytes)
  126.  
  127.         elif parsed.path == "/control":
  128.             esp_id = post_data.get("id", [""])[0]
  129.             if esp_id in esp_devices:
  130.                 esp_devices[esp_id] = not esp_devices[esp_id]
  131.                 print(f"[CONTROL] Estado do ESP {esp_id} agora é {'ON' if esp_devices[esp_id] else 'OFF'}")
  132.                 self.send_response(200)
  133.                 self.end_headers()
  134.             else:
  135.                 print(f"[CONTROL] ID {esp_id} não encontrado.")
  136.                 self.send_error(404, "ESP ID não encontrado")
  137.  
  138.         else:
  139.             self.send_error(404, "Endpoint não encontrado")
  140.  
  141.  
  142.  
  143. def run_server():
  144.     server = HTTPServer((HOST, PORT), ControlHandler)
  145.     print(f"Servidor rodando em http://{HOST}:{PORT}")
  146.     try:
  147.         server.serve_forever()
  148.     except KeyboardInterrupt:
  149.         pass
  150.     server.server_close()
  151.     print("Servidor parado.")
  152.  
  153. if __name__ == "__main__":
  154.     run_server()
  155.  
Add Comment
Please, Sign In to add comment