1
0

2 Revīzijas 36f7b1d73f ... b270b7bdd8

Autors SHA1 Ziņojums Datums
  关习习 b270b7bdd8 Merge remote-tracking branch 'origin/master' 1 mēnesi atpakaļ
  关习习 76bdce732b 更新心跳检测功能check_stat 1 mēnesi atpakaļ
4 mainītis faili ar 116 papildinājumiem un 3 dzēšanām
  1. 86 0
      check_stat.py
  2. 2 1
      key.example.json
  3. 11 0
      main.py
  4. 17 2
      msg_send_save.py

+ 86 - 0
check_stat.py

@@ -0,0 +1,86 @@
+import time
+import requests
+from msg_send_save import send_feishu
+
+# 服务状态检查间隔(秒)
+CHECK_INTERVAL = 120  # 2分钟
+# 心跳超时时间(秒)
+HEARTBEAT_TIMEOUT = 120  # 2分钟
+
+# 服务状态跟踪变量
+is_service_online = True  # 初始假设服务在线
+last_status_change_time = time.time()  # 上次状态变更时间
+
+def check_service_status():
+    """
+    检查服务状态
+    Returns:
+        bool: True表示服务在线,False表示服务离线
+    """
+    try:
+        response = requests.get('http://127.0.0.1:3100/stat', timeout=10)
+        if response.status_code == 200:
+            data = response.json()
+            last_heartbeat = data.get('heartbeat', 0)
+            # 检查最近一次心跳时间是否在超时范围内
+            if time.time() - last_heartbeat <= HEARTBEAT_TIMEOUT:
+                return True
+            else:
+                return False
+        else:
+            return False
+    except Exception as e:
+        print(f"检查服务状态时出错: {e}")
+        return False
+
+def notify_status_change(online):
+    """
+    通知服务状态变更
+    Args:
+        online (bool): True表示服务上线,False表示服务下线
+    """
+    if online:
+        message = "【服务状态通知】QQ机器人服务已重新上线"
+    else:
+        message = "【服务状态通知】QQ机器人服务已下线,请及时处理"
+    
+    send_feishu(message)
+    print(message)
+
+def main():
+    """
+    主循环,定时检查服务状态
+    """
+    global is_service_online, last_status_change_time
+    
+    print("开始监控服务状态...")
+    while True:
+        try:
+            # 检查当前服务状态
+            current_status = check_service_status()
+            
+            # 如果状态发生变化
+            if current_status != is_service_online:
+                # 更新状态和变更时间
+                is_service_online = current_status
+                last_status_change_time = time.time()
+                
+                # 通知状态变更
+                notify_status_change(current_status)
+            else:
+                # 状态未变化,打印当前状态
+                status_text = "在线" if is_service_online else "离线"
+                print(f"服务状态: {status_text}")
+            
+            # 等待下次检查
+            time.sleep(CHECK_INTERVAL)
+            
+        except KeyboardInterrupt:
+            print("监控程序已退出")
+            break
+        except Exception as e:
+            print(f"监控过程中发生错误: {e}")
+            time.sleep(CHECK_INTERVAL)
+
+if __name__ == "__main__":
+    main()

+ 2 - 1
key.example.json

@@ -1,4 +1,5 @@
 {
   "groq": "YOUR_GROQ_KEY",
-  "siliflow": "YOUR_SILIFLOW_KEY"
+  "siliflow": "YOUR_SILIFLOW_KEY",
+  "feishu": "YOUR_FEISHU_KEY"
 }

+ 11 - 0
main.py

@@ -39,6 +39,8 @@ prompt_less = config_get("prompt_less")
 
 # 一个比较没用的变量,用来限制绘画cd的,现在默认是0就是无cd
 last_request_time = 0
+# 最近一次的心跳上报时间,用来记录服务状态
+last_heartbeat_time = time.time()
 
 def on_my_message(group_id, user_id, user_name, raw_message, message):
     """
@@ -200,8 +202,14 @@ def change2girl(raw_message,group_id,user_id):
     else:
         print('未找到 QQ 号')
 
+
+@app.route('/stat', methods=['GET'])
+def stat_get():
+    return {"heartbeat": last_heartbeat_time}
+
 @app.route('/cat', methods=['POST'])
 def chat():
+    global last_heartbeat_time
     data = request.json
     data_type = data['post_type']
     # 管理员模式,目前只有开启主机功能
@@ -278,6 +286,9 @@ def chat():
                 send_group_message_word(group_id,get_v50()) if rand_num < 30 else send_group_message_word(group_id,"₍^ >ヮ<^₎")
             else:
                 send_group_message_word(group_id,"₍^ >ヮ<^₎")
+    elif data_type == "meta_event":
+        if data["meta_event_type"] == "heartbeat":
+            last_heartbeat_time = data['time']
     return ""
 
 if __name__ == '__main__':

+ 17 - 2
msg_send_save.py

@@ -2,7 +2,7 @@ import csv
 import datetime
 import os
 import requests
-
+from config import key_get
 def send_private_message_word(user_id,word):
     """
     用来回复私人消息
@@ -92,4 +92,19 @@ def del_group_message(message_id):
     """
     requests.post('http://127.0.0.1:3000//delete_msg', json={
         'message_id': str(message_id)
-    })
+    })
+
+def send_feishu(message):
+    """
+    用来发送飞书消息
+    """
+    headers = {
+        'Content-Type': 'application/json',
+        'Authorization': key_get("feishu")
+    }
+    requests.post('https://api.gxx12138.space/feishu/text', headers=headers, json={
+        'content': message
+    })
+
+if __name__ == '__main__':
+    send_feishu('测试')