import os, json, urllib.request, subprocess, traceback, sys from http.server import BaseHTTPRequestHandler, HTTPServer PORT = 7860 # .strip() уберет случайные пробелы, если они есть в секретах TOKEN = os.environ.get("TELEGRAM_BOT_TOKEN", "").strip() ALLOWED_USER = os.environ.get("TELEGRAM_ALLOWED_USERS", "").strip() def log(msg): """Мгновенный вывод в логи Hugging Face""" print(msg, flush=True) sys.stdout.flush() def send_tg(chat_id, text): """Прямая отправка в Telegram БЕЗ Cloudflare""" if not TOKEN: log("❌ Ошибка: Не задан TELEGRAM_BOT_TOKEN") return url = f"https://api.telegram.org/bot{TOKEN}/sendMessage" data = json.dumps({"chat_id": chat_id, "text": str(text)}).encode('utf-8') # Добавляем User-Agent, чтобы Телеграм не ругался на скрипт headers = { "Content-Type": "application/json", "User-Agent": "Mozilla/5.0" } req = urllib.request.Request(url, data=data, headers=headers) try: urllib.request.urlopen(req) log(f"✈️ Сообщение успешно отправлено в чат {chat_id}") except Exception as e: log(f"❌ Ошибка отправки в Telegram: {e}") class WebhookHandler(BaseHTTPRequestHandler): def do_POST(self): length = int(self.headers.get('Content-Length', 0)) data = json.loads(self.rfile.read(length)) # Сразу отдаем 200 OK Телеграму self.send_response(200) self.end_headers() if "message" in data and "text" in data["message"]: chat_id = str(data["message"]["chat"]["id"]) text = data["message"]["text"] log(f"📥 Получено: {text}") if ALLOWED_USER and chat_id != ALLOWED_USER: log("⛔ Блокировка: чужой ID.") send_tg(chat_id, "⛔ Доступ закрыт.") return send_tg(chat_id, "🤖 Принято! Запускаю Гермеса...") try: log("🧠 Выполняю команду hermes...") my_env = os.environ.copy() # ПРАВИЛЬНЫЙ ПОРЯДОК АРГУМЕНТОВ cmd = [ "hermes", "-m", "openai/z-ai/glm-5.1", "-z", text, "chat", "--cli" ] result = subprocess.run(cmd, capture_output=True, text=True, env=my_env) reply = result.stdout.strip() err_reply = result.stderr.strip() if err_reply: log(f"⚠️ Лог Гермеса (stderr): {err_reply}") if not reply: reply = err_reply if reply: log(f"📤 Ответ получен: {len(reply)} симв.") send_tg(chat_id, reply[-4000:]) else: log("❓ Гермес вернул пустоту.") send_tg(chat_id, "✅ Пустой ответ от Гермеса.") except Exception as e: error_trace = traceback.format_exc() log(f"❌ ОШИБКА:\n{error_trace}") send_tg(chat_id, f"❌ Системная ошибка: {e}") def do_GET(self): self.send_response(200) self.end_headers() self.wfile.write(b"Server Online") if __name__ == "__main__": log(f"🚀 Starting Hermes Webhook Bridge on port {PORT}") HTTPServer(('0.0.0.0', PORT), WebhookHandler).serve_forever()