📘 Инструкция по запуску Python-моста
🎯 Зачем нужен Python-мост? Браузер не может отправлять WoL-пакеты и выполнять ICMP ping (как в командной строке). Мост решает эту проблему.
⬇️ Скачать Python:
⚠️ При установке на Windows ОБЯЗАТЕЛЬНО отметьте "Add Python to PATH"
🪟 Windows
- Установите Python (ссылка выше, обязательно Add to PATH)
- Создайте файл
wol_bridge.py на рабочем столе, скопируйте туда код ниже
- Запустите командную строку (Win+R → cmd):
cd %USERPROFILE%\Desktop → python wol_bridge.py
- Держите окно открытым. Вернитесь в браузер и нажмите "🐍 Python-мост"
🍎 macOS
- Установите Python с официального сайта
- Создайте файл:
nano ~/Desktop/wol_bridge.py → вставьте код ниже
- Запустите:
python3 ~/Desktop/wol_bridge.py
🐧 Linux
- Python уже предустановлен в большинстве дистрибутивов
- Создайте файл:
nano wol_bridge.py → вставьте код
- Запустите:
python3 wol_bridge.py
📄 Код моста (wol_bridge.py):
#!/usr/bin/env python3
import socket
import subprocess
import json
from http.server import HTTPServer, BaseHTTPRequestHandler
class Handler(BaseHTTPRequestHandler):
def do_GET(self):
if self.path == '/ping':
self.send_response(200)
self.send_header('Content-type', 'application/json')
self.end_headers()
self.wfile.write(json.dumps({"status":"ok"}).encode())
elif self.path == '/arp':
arp_table = {}
try:
result = subprocess.run(["arp", "-n"], capture_output=True, text=True)
for line in result.stdout.splitlines():
parts = line.split()
if len(parts) >= 3 and '.' in parts[0]:
arp_table[parts[0]] = parts[2]
except: pass
self.send_response(200)
self.send_header('Content-type', 'application/json')
self.end_headers()
self.wfile.write(json.dumps({"arp":arp_table}).encode())
else:
self.send_response(404)
def do_POST(self):
length = int(self.headers.get('Content-Length', 0))
data = json.loads(self.rfile.read(length))
if self.path == '/ping':
ip = data.get('ip')
alive = False
if ip:
try:
result = subprocess.run(["ping", "-c", "1", "-W", "1", ip], capture_output=True)
alive = result.returncode == 0
except: pass
self.send_response(200)
self.send_header('Content-type', 'application/json')
self.end_headers()
self.wfile.write(json.dumps({"alive":alive}).encode())
elif self.path == '/wol':
mac = data.get('mac')
success = False
if mac:
try:
clean = mac.replace(':', '').replace('-', '')
magic = bytes.fromhex('FF'*6 + clean*16)
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)
sock.sendto(magic, ('255.255.255.255', 9))
sock.close()
success = True
except: pass
self.send_response(200)
self.send_header('Content-type', 'application/json')
self.end_headers()
self.wfile.write(json.dumps({"success":success}).encode())
if __name__ == '__main__':
print("🚀 WolBridge запущен на http://localhost:8765")
HTTPServer(('0.0.0.0', 8765), Handler).serve_forever()