MashaKenzie commited on
Commit
0397c54
·
verified ·
1 Parent(s): 9d51afa

Create app.py

Browse files
Files changed (1) hide show
  1. app.py +117 -0
app.py ADDED
@@ -0,0 +1,117 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import os
2
+ import json
3
+ from fastapi import FastAPI, Request, HTTPException, Response
4
+ from fastapi.responses import PlainTextResponse
5
+ from huggingface_hub import InferenceClient
6
+ import io
7
+ from PIL import Image
8
+
9
+ app = FastAPI(title="VK AI Webhook Bot")
10
+
11
+ # Переменные окружения (добавьте их в Settings → Variables в Space)
12
+ VK_TOKEN = os.getenv("VK_TOKEN") # access_token группы
13
+ VK_SECRET = os.getenv("VK_SECRET") # секретное слово (придумайте сами)
14
+ HF_TOKEN = os.getenv("HF_TOKEN") # ваш HF токен
15
+ CONFIRMATION_STRING = os.getenv("VK_CONFIRM") # строка подтверждения из VK
16
+
17
+ client = InferenceClient(token=HF_TOKEN)
18
+
19
+ LLM_MODEL = "Qwen/Qwen2.5-7B-Instruct"
20
+ IMG_MODEL = "stabilityai/stable-diffusion-xl-base-1.0"
21
+
22
+ @app.get("/")
23
+ async def root():
24
+ return {"status": "VK Webhook Bot is running"}
25
+
26
+ @app.post("/webhook")
27
+ async def vk_webhook(request: Request):
28
+ try:
29
+ body = await request.json()
30
+ except:
31
+ raise HTTPException(400, "Invalid JSON")
32
+
33
+ # Проверка секретного ключа (обязательно!)
34
+ if body.get("secret") != VK_SECRET:
35
+ raise HTTPException(403, "Invalid secret")
36
+
37
+ event_type = body.get("type")
38
+
39
+ if event_type == "confirmation":
40
+ # VK при настройке шлёт confirmation → возвращаем строку подтверждения
41
+ if CONFIRMATION_STRING:
42
+ return PlainTextResponse(CONFIRMATION_STRING)
43
+ else:
44
+ raise HTTPException(500, "Confirmation string not set")
45
+
46
+ if event_type == "message_new":
47
+ msg = body["object"]["message"]
48
+ peer_id = msg["peer_id"]
49
+ text = msg["text"].strip()
50
+ from_id = msg["from_id"]
51
+ msg_id = msg.get("id") # для reply_to
52
+
53
+ low_text = text.lower()
54
+
55
+ # Пример обработки команд
56
+ if low_text.startswith("!картинка") or "нарисуй" in low_text:
57
+ prompt = text.replace("!картинка", "").replace("нарисуй", "").strip()
58
+ if not prompt:
59
+ # Отправляем ответ (через vk_api или requests — см. ниже)
60
+ await send_vk_message(peer_id, "Укажите, что нарисовать!", msg_id)
61
+ return {"ok": True}
62
+
63
+ await send_vk_message(peer_id, f"Генерирую картинку: «{prompt}»...", msg_id)
64
+
65
+ try:
66
+ image = client.text_to_image(
67
+ prompt,
68
+ model=IMG_MODEL,
69
+ num_inference_steps=25,
70
+ guidance_scale=7.0
71
+ )
72
+ buf = io.BytesIO()
73
+ image.save(buf, format="PNG")
74
+ buf.seek(0)
75
+
76
+ # Здесь нужно загрузить фото в ВК и получить attachment
77
+ # Для этого используйте vk_api или requests + upload сервер
78
+ # Простой вариант — пока просто логируем
79
+ print("Картинка сгенерирована")
80
+ await send_vk_message(peer_id, "Картинка готова! (загрузка пока не реализована)", msg_id)
81
+
82
+ except Exception as e:
83
+ await send_vk_message(peer_id, f"Ошибка генерации: {str(e)[:100]}", msg_id)
84
+
85
+ else:
86
+ # Обычный чат с AI
87
+ try:
88
+ response = client.chat.completions.create(
89
+ model=LLM_MODEL,
90
+ messages=[{"role": "user", "content": text}],
91
+ max_tokens=400
92
+ )
93
+ answer = response.choices[0].message.content.strip()
94
+ await send_vk_message(peer_id, answer, msg_id)
95
+ except Exception as e:
96
+ await send_vk_message(peer_id, "Ошибка ИИ, попробуйте позже", msg_id)
97
+
98
+ return {"ok": True} # VK требует "ok" или 200 OK
99
+
100
+ async def send_vk_message(peer_id: int, text: str, reply_to: int = None):
101
+ """Отправка сообщения через VK API (простой вариант через requests)"""
102
+ import requests
103
+
104
+ params = {
105
+ "peer_id": peer_id,
106
+ "message": text,
107
+ "random_id": 0,
108
+ "access_token": VK_TOKEN,
109
+ "v": "5.199"
110
+ }
111
+ if reply_to:
112
+ params["reply_to"] = reply_to
113
+
114
+ try:
115
+ requests.post("https://api.vk.com/method/messages.send", params=params)
116
+ except:
117
+ print("Ошибка отправки сообщения в VK")