Update app.py
Browse files
app.py
CHANGED
@@ -5,6 +5,9 @@ from flask import Flask, request, jsonify
|
|
5 |
from datetime import datetime, timedelta
|
6 |
import asyncio
|
7 |
import re
|
|
|
|
|
|
|
8 |
|
9 |
app = Flask(__name__)
|
10 |
|
@@ -13,8 +16,12 @@ AI_API_ENDPOINT = os.environ.get('AI_API_ENDPOINT')
|
|
13 |
AI_API_KEY = os.environ.get('AI_API_KEY')
|
14 |
AI_MODEL = os.environ.get('AI_MODEL')
|
15 |
PHP_PROXY_URL = os.environ.get('PHP_PROXY_URL')
|
|
|
|
|
|
|
|
|
16 |
|
17 |
-
if not all([TELEGRAM_BOT_TOKEN, AI_API_ENDPOINT, AI_API_KEY, AI_MODEL]):
|
18 |
raise ValueError("请设置所有必要的环境变量")
|
19 |
|
20 |
AI_API_HEADERS = {
|
@@ -80,6 +87,64 @@ BAN_TRIGGER_PHRASES = [
|
|
80 |
]
|
81 |
UNBAN_PHRASE = "close username"
|
82 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
83 |
def make_telegram_request(method, data=None):
|
84 |
url = f"https://api.telegram.org/bot{TELEGRAM_BOT_TOKEN}/{method}"
|
85 |
if PHP_PROXY_URL:
|
@@ -134,7 +199,7 @@ async def handleTelegramUpdate(update):
|
|
134 |
fromUserFirstName = update['message']['from'].get('first_name', '用户')
|
135 |
fromUserLastName = update['message']['from'].get('last_name', '')
|
136 |
fromUserName = update['message']['from'].get('username', '')
|
137 |
-
|
138 |
USER_LAST_ACTIVE[fromUserId] = datetime.now()
|
139 |
|
140 |
if isGroupChat:
|
@@ -156,7 +221,6 @@ async def handleTelegramUpdate(update):
|
|
156 |
else:
|
157 |
GROUP_INFO[chatId]['last_active'] = datetime.now()
|
158 |
|
159 |
-
|
160 |
if not userMessage:
|
161 |
return
|
162 |
|
@@ -273,7 +337,7 @@ async def processAiMessage(chatId, userMessage, fromUserId, message_id, fromUser
|
|
273 |
minutes = int(remaining_time.total_seconds() / 60)
|
274 |
await sendTelegramMessage(chatId, f"您已被禁用,剩余时间: {minutes} 分钟。", options={'reply_to_message_id': message_id})
|
275 |
return
|
276 |
-
|
277 |
for pattern in BAN_TRIGGER_PHRASES:
|
278 |
if re.search(pattern, userMessage, re.IGNORECASE):
|
279 |
await banUser(chatId, fromUserId)
|
@@ -284,7 +348,7 @@ async def processAiMessage(chatId, userMessage, fromUserId, message_id, fromUser
|
|
284 |
userTemp = USER_SETTINGS.get(fromUserId, {}).get('temperature', DEFAULT_TEMP)
|
285 |
userPromptIndex = USER_SETTINGS.get(fromUserId, {}).get('prompt_index', CURRENT_PROMPT_INDEX)
|
286 |
currentPrompt = PROMPT_TEMPLATES.get(userPromptIndex, "")
|
287 |
-
|
288 |
user_last_active = USER_LAST_ACTIVE.get(fromUserId, None)
|
289 |
group_info = GROUP_INFO.get(chatId, None)
|
290 |
group_active_users = GROUP_ACTIVE_USERS.get(chatId, None)
|
@@ -473,4 +537,6 @@ async def unbanUser(chatId, userId):
|
|
473 |
print(f"用户 {userId} 在群组 {chatId} 中被解禁。")
|
474 |
|
475 |
if __name__ == '__main__':
|
476 |
-
|
|
|
|
|
|
5 |
from datetime import datetime, timedelta
|
6 |
import asyncio
|
7 |
import re
|
8 |
+
import time
|
9 |
+
from threading import Thread
|
10 |
+
from webdav3.client import Client
|
11 |
|
12 |
app = Flask(__name__)
|
13 |
|
|
|
16 |
AI_API_KEY = os.environ.get('AI_API_KEY')
|
17 |
AI_MODEL = os.environ.get('AI_MODEL')
|
18 |
PHP_PROXY_URL = os.environ.get('PHP_PROXY_URL')
|
19 |
+
WEBDAV_URL = os.environ.get('WEBDAV_URL')
|
20 |
+
WEBDAV_USERNAME = os.environ.get('WEBDAV_USERNAME')
|
21 |
+
WEBDAV_PASSWORD = os.environ.get('WEBDAV_PASSWORD')
|
22 |
+
WEBDAV_DIRECTORY = '/tg_bot'
|
23 |
|
24 |
+
if not all([TELEGRAM_BOT_TOKEN, AI_API_ENDPOINT, AI_API_KEY, AI_MODEL, WEBDAV_URL, WEBDAV_USERNAME, WEBDAV_PASSWORD]):
|
25 |
raise ValueError("请设置所有必要的环境变量")
|
26 |
|
27 |
AI_API_HEADERS = {
|
|
|
87 |
]
|
88 |
UNBAN_PHRASE = "close username"
|
89 |
|
90 |
+
webdav_options = {
|
91 |
+
'webdav_hostname': WEBDAV_URL,
|
92 |
+
'webdav_login': WEBDAV_USERNAME,
|
93 |
+
'webdav_password': WEBDAV_PASSWORD
|
94 |
+
}
|
95 |
+
webdav_client = Client(webdav_options)
|
96 |
+
|
97 |
+
def save_data_to_webdav():
|
98 |
+
data = {
|
99 |
+
"chatHistories": chatHistories,
|
100 |
+
"GROUP_SETTINGS": GROUP_SETTINGS,
|
101 |
+
"USER_SETTINGS": USER_SETTINGS,
|
102 |
+
"USER_LAST_ACTIVE": {k: v.isoformat() for k, v in USER_LAST_ACTIVE.items()},
|
103 |
+
"GROUP_ACTIVE_USERS": {k: list(v) for k, v in GROUP_ACTIVE_USERS.items()},
|
104 |
+
"GROUP_INFO": {k: {**v, 'last_active': v['last_active'].isoformat()} for k, v in GROUP_INFO.items()},
|
105 |
+
"BANNED_USERS": {k: v.isoformat() for k, v in BANNED_USERS.items()}
|
106 |
+
}
|
107 |
+
try:
|
108 |
+
file_name = f"{WEBDAV_DIRECTORY}/data.json"
|
109 |
+
with open("data.json", "w") as f:
|
110 |
+
json.dump(data, f)
|
111 |
+
|
112 |
+
if not webdav_client.check(WEBDAV_DIRECTORY):
|
113 |
+
webdav_client.mkdir(WEBDAV_DIRECTORY)
|
114 |
+
|
115 |
+
webdav_client.upload_sync(remote_path=file_name, local_path="data.json")
|
116 |
+
print(f"数据已上传至 WebDAV: {file_name}")
|
117 |
+
except Exception as e:
|
118 |
+
print(f"上传数据到 WebDAV 失败: {e}")
|
119 |
+
|
120 |
+
def load_data_from_webdav():
|
121 |
+
global chatHistories, GROUP_SETTINGS, USER_SETTINGS, USER_LAST_ACTIVE, GROUP_ACTIVE_USERS, GROUP_INFO, BANNED_USERS
|
122 |
+
try:
|
123 |
+
file_name = f"{WEBDAV_DIRECTORY}/data.json"
|
124 |
+
if webdav_client.check(file_name):
|
125 |
+
webdav_client.download_sync(remote_path=file_name, local_path="data.json")
|
126 |
+
with open("data.json", "r") as f:
|
127 |
+
data = json.load(f)
|
128 |
+
chatHistories = data.get("chatHistories", {})
|
129 |
+
GROUP_SETTINGS = data.get("GROUP_SETTINGS", {})
|
130 |
+
USER_SETTINGS = data.get("USER_SETTINGS", {})
|
131 |
+
USER_LAST_ACTIVE = {int(k): datetime.fromisoformat(v) for k, v in data.get("USER_LAST_ACTIVE", {}).items()}
|
132 |
+
GROUP_ACTIVE_USERS = {int(k): set(v) for k, v in data.get("GROUP_ACTIVE_USERS", {}).items()}
|
133 |
+
GROUP_INFO = {int(k): {**v, 'last_active': datetime.fromisoformat(v['last_active'])} for k, v in data.get("GROUP_INFO", {}).items()}
|
134 |
+
BANNED_USERS = {int(k): datetime.fromisoformat(v) for k, v in data.get("BANNED_USERS", {}).items()}
|
135 |
+
|
136 |
+
print(f"从 WebDAV 加载数据成功: {file_name}")
|
137 |
+
else:
|
138 |
+
print("WebDAV 上没有找到数据文件,初始化为空数据。")
|
139 |
+
save_data_to_webdav()
|
140 |
+
except Exception as e:
|
141 |
+
print(f"从 WebDAV 加载数据失败: {e}")
|
142 |
+
|
143 |
+
def webdav_sync_thread():
|
144 |
+
while True:
|
145 |
+
save_data_to_webdav()
|
146 |
+
time.sleep(60)
|
147 |
+
|
148 |
def make_telegram_request(method, data=None):
|
149 |
url = f"https://api.telegram.org/bot{TELEGRAM_BOT_TOKEN}/{method}"
|
150 |
if PHP_PROXY_URL:
|
|
|
199 |
fromUserFirstName = update['message']['from'].get('first_name', '用户')
|
200 |
fromUserLastName = update['message']['from'].get('last_name', '')
|
201 |
fromUserName = update['message']['from'].get('username', '')
|
202 |
+
|
203 |
USER_LAST_ACTIVE[fromUserId] = datetime.now()
|
204 |
|
205 |
if isGroupChat:
|
|
|
221 |
else:
|
222 |
GROUP_INFO[chatId]['last_active'] = datetime.now()
|
223 |
|
|
|
224 |
if not userMessage:
|
225 |
return
|
226 |
|
|
|
337 |
minutes = int(remaining_time.total_seconds() / 60)
|
338 |
await sendTelegramMessage(chatId, f"您已被禁用,剩余时间: {minutes} 分钟。", options={'reply_to_message_id': message_id})
|
339 |
return
|
340 |
+
|
341 |
for pattern in BAN_TRIGGER_PHRASES:
|
342 |
if re.search(pattern, userMessage, re.IGNORECASE):
|
343 |
await banUser(chatId, fromUserId)
|
|
|
348 |
userTemp = USER_SETTINGS.get(fromUserId, {}).get('temperature', DEFAULT_TEMP)
|
349 |
userPromptIndex = USER_SETTINGS.get(fromUserId, {}).get('prompt_index', CURRENT_PROMPT_INDEX)
|
350 |
currentPrompt = PROMPT_TEMPLATES.get(userPromptIndex, "")
|
351 |
+
|
352 |
user_last_active = USER_LAST_ACTIVE.get(fromUserId, None)
|
353 |
group_info = GROUP_INFO.get(chatId, None)
|
354 |
group_active_users = GROUP_ACTIVE_USERS.get(chatId, None)
|
|
|
537 |
print(f"用户 {userId} 在群组 {chatId} 中被解禁。")
|
538 |
|
539 |
if __name__ == '__main__':
|
540 |
+
load_data_from_webdav()
|
541 |
+
Thread(target=webdav_sync_thread, daemon=True).start()
|
542 |
+
app.run(host='0.0.0.0', port=int(os.environ.get('PORT', 7860)))
|