PinkSky / server.py
FreshPixels's picture
Update server.py
25ea7fe verified
Raw
History Blame
3.96 kB
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()