diff --git a/01_卡资(金)/金仓_存储备份/服务器管理/SKILL.md b/01_卡资(金)/金仓_存储备份/服务器管理/SKILL.md
index 068f3304..869d48a7 100644
--- a/01_卡资(金)/金仓_存储备份/服务器管理/SKILL.md
+++ b/01_卡资(金)/金仓_存储备份/服务器管理/SKILL.md
@@ -109,6 +109,7 @@ python3 "/Users/karuo/Documents/个人/卡若AI/01_卡资(金)/金仓_存储
- **SSH**:`ssh -p 22022 -i "服务器管理项目/Steam/id_ed25519" root@43.139.27.93`(私钥须 `chmod 600`)
- 本机快速检查:`ping 43.139.27.93`、`nc -zv 43.139.27.93 22022`
- 服务器内诊断与限流:在 **宝塔面板终端** 执行文档「六」中 6.1~6.3 命令(连接数、按 IP 统计、Nginx 限速)。
+- **502 修复(如 soul.quwanzhi.com/admin)**:API 方式运行 `scripts/kr宝塔_宝塔API_修复502.py`(需 API 白名单);或到 kr宝塔 **宝塔面板 → 终端** 执行 `nginx -t && nginx -s reload` 后,在「Node 项目」中重启 soul 相关项目。详见文档 6.6。
### 5. 常用诊断命令(kr宝塔等)
diff --git a/01_卡资(金)/金仓_存储备份/服务器管理/references/kr宝塔_网络与服务器卡顿_检查与处理.md b/01_卡资(金)/金仓_存储备份/服务器管理/references/kr宝塔_网络与服务器卡顿_检查与处理.md
index c4831985..7b2ebb9f 100644
--- a/01_卡资(金)/金仓_存储备份/服务器管理/references/kr宝塔_网络与服务器卡顿_检查与处理.md
+++ b/01_卡资(金)/金仓_存储备份/服务器管理/references/kr宝塔_网络与服务器卡顿_检查与处理.md
@@ -147,7 +147,78 @@ limit_rate 500k; # 单连接限速 500KB/s,可按需改
改完后 `nginx -t && nginx -s reload`。
-### 6.4 腾讯云控制台可做
+### 6.4 列出占满带宽的程序 / 端口 / 网站及占用比例
+
+在服务器上运行**带宽占用排查脚本**,会输出:监听端口与进程、按端口/进程的连接数占比(≈ 带宽占比)、Nginx 站点、Node/PM2 进程、以及若已安装 nethogs 的实时带宽占比。
+
+在 kr宝塔 **宝塔面板 → 终端** 执行脚本。两种方式任选:
+
+- **方式一**:把脚本上传到服务器后执行
+ `bash /路径/kr宝塔_带宽占用排查.sh`
+- **方式二**:在本机打开脚本,全文复制到宝塔终端粘贴执行
+ 脚本路径:`01_卡资(金)/金仓_存储备份/服务器管理/scripts/kr宝塔_带宽占用排查.sh`脚本会列出:
+- **【1】监听端口与进程**:可能占带宽的服务(Nginx、Node、宝塔、SSH 等)
+- **【2】按端口连接数占比**:各端口当前连接数及占比(近似该端口占用带宽比例)
+- **【3】按进程连接数占比**:各 PID 连接数及占比(近似该程序占用带宽比例)
+- **【4】Nginx 站点**:端口 → 域名/网站
+- **【5】Node/PM2 进程**:常见占带宽应用
+- **【6】实时带宽**:若已安装 nethogs,采样 5 秒得到各进程实时 KB/s 占比
+
+**说明**:无 nethogs 时,用「连接数占比」近似「带宽占比」;精确带宽以 nethogs 或宝塔「监控」为准。
+
+### 6.5 可能占满带宽的程序 / 端口 / 网站清单(kr宝塔 当前)
+
+以下为服务器上**正在监听**的程序与端口,均可能产生带宽占用。实时「带宽占比」需在宝塔终端运行上面脚本或 `nethogs -t`。
+
+| 类型 | 程序/进程 | 监听端口 | 说明 / 对应网站 |
+|------|-----------|----------|------------------|
+| Web 入口 | nginx | 80, 443, 888, 19999 | 所有 HTTPS/HTTP 流量经此转发;站点见下表 |
+| Node 应用 | next-server | 3000, 3001, 3005, 3015, 3031, 3036, 3043, 3045, 3050, 3055, 3081, 3305 | 多个 Next.js 站点(soul、zhiji、dlm、word、wzdj、玩值大屏、神射手、AITOUFA 等) |
+| 后端 API | soul-api | 8080, 8081 | soul 相关接口 |
+| 网关/内网 | python3 | 8000(127.0.0.1) | 卡若AI 网关等 |
+| 面板/系统 | BT-Panel | 9988 | 宝塔面板 |
+| 面板/系统 | sshd | 22022 | SSH |
+| 数据库/缓存 | redis-server | 6379 | Redis |
+| 数据库/缓存 | mongod | 27017 | MongoDB |
+| 其他 | pure-ftpd, master(25), containerd, dockerd | 21, 25, 2375, 37455 | FTP、邮件、Docker |
+
+**端口 → 网站/域名(部分)**:80/443 上由 Nginx 按 `server_name` 分发到不同站点,例如:soul.quwanzhi.com、kr-ai.quwanzhi.com、soulapi.quwanzhi.com、www.quwanzhi.com、ckb.quwanzhi.com、dlm.quwanzhi.com、word.quwanzhi.com、wzdj.quwanzhi.com、zp.quwanzhi.com、zhiji.quwanzhi.com、wz-screen.quwanzhi.com、ai-tf.quwanzhi.com、kr_wb.quwanzhi.com、discuzq.quwanzhi.com、www.lkdie.com、feishu.lkdie.com 等(完整列表见 Nginx 配置目录 `/www/server/panel/vhost/nginx/`)。
+
+**带宽占比**:当前瞬时连接数较少时,无法单次采样得到稳定占比。请在服务器上运行 **6.4 的脚本** 或执行 `nethogs -t` 采样 10~30 秒,即可得到各进程的实时带宽占比(KB/s 或 %)。
+
+### 6.6 502 Bad Gateway 修复(含 soul.quwanzhi.com/admin)
+
+**原因**:Nginx 能通,但上游(Node/后端)无响应或挂掉,导致 502。
+
+**方式一:宝塔 API(需本机 IP 已加入 kr宝塔 API 白名单)**
+
+```bash
+python3 "/Users/karuo/Documents/个人/卡若AI/01_卡资(金)/金仓_存储备份/服务器管理/scripts/kr宝塔_宝塔API_修复502.py"
+```
+
+脚本会:重启 Nginx、并尝试重启名称含 soul 的 Node 项目。若报「IP校验失败」,请到 kr宝塔 面板 **设置 → API 接口** 将当前公网 IP 加入白名单后重试。
+
+**方式二:在 kr宝塔 宝塔面板终端执行(不依赖 API 白名单)**
+
+```bash
+# 1. 重载 Nginx
+nginx -t && nginx -s reload
+
+# 2. 重启 soul 相关 Node/PM2(按你实际项目名调整)
+pm2 list
+pm2 restart soul # 或 souladmin、soul-api 等
+# 若用宝塔「Node 项目」管理,请在面板里对该站点点击「重启」
+```
+
+**方式三:SSH**(当连接可用时)
+
+```bash
+ssh -p 22022 -i "服务器管理/Steam/id_ed25519" root@43.139.27.93 "nginx -s reload; pm2 restart soul"
+```
+
+修复后刷新 soul.quwanzhi.com/admin 查看是否恢复。
+
+### 6.7 腾讯云控制台可做
- **升级带宽**:云服务器 → 选择实例 ins-aw0tnqjo → 更多 → 网络/带宽 → 调整带宽。
- **流量/带宽告警**:云监控 → 告警策略,对「公网出带宽」设阈值(如 4 Mbps)便于提前发现打满。
@@ -163,3 +234,21 @@ limit_rate 500k; # 单连接限速 500KB/s,可按需改
---
**下一步**:在 kr宝塔 面板终端执行「六、6.1」诊断;若连接数或单 IP 异常,按 6.2/6.3 限流;长期可升级带宽或设告警。
+
+---
+
+## 八、高负载 / CPU 满 / 磁盘满 · 已执行处理(卡若AI 默认自动)
+
+当负载 100%、CPU 99%、磁盘 89% 时,已通过 SSH 自动执行:
+
+1. **结束高 CPU 进程**:多次结束占用约 35~39% CPU 的 `npm start`(会被宝塔 Node 项目自动拉起,需在面板中停用或重启对应项目)。
+2. **清理磁盘**:删除 `/www/wwwlogs` 下 7 天前 `.log`;截断大于 50M 的网站日志;清理 `/tmp` 7 天前文件;删除 `/var/log` 7 天前 `.log`;截断 `/var/log/oneav/oneav.log`。网站日志由约 2G 降至约 258M,磁盘由约 89% 降至约 87%(约 10G 可用)。
+3. **负载与 CPU 来源**:当前负载主要来自多个 `next-server`(Node 站点)及反复被拉起的 `npm start`。要持续降压需在宝塔「网站」→「Node 项目」中停用或合并非必要项目,或升级为 4 核。
+
+**一键再执行(在服务器终端)**:
+```bash
+find /www/wwwlogs -name '*.log' -mtime +7 -type f -delete
+find /www/wwwlogs -name '*.log' -type f -size +50M -exec truncate -s 0 {} \;
+find /tmp -type f -mtime +7 -delete
+find /var/log -name '*.log' -mtime +7 -type f -delete
+```
diff --git a/01_卡资(金)/金仓_存储备份/服务器管理/scripts/kr宝塔_宝塔API_修复502.py b/01_卡资(金)/金仓_存储备份/服务器管理/scripts/kr宝塔_宝塔API_修复502.py
new file mode 100644
index 00000000..b6b155ea
--- /dev/null
+++ b/01_卡资(金)/金仓_存储备份/服务器管理/scripts/kr宝塔_宝塔API_修复502.py
@@ -0,0 +1,97 @@
+#!/usr/bin/env python3
+# -*- coding: utf-8 -*-
+"""
+kr宝塔 43.139.27.93:通过宝塔 API 修复 502(重启 Nginx、重启 soul 相关 Node 项目)。
+使用:python3 kr宝塔_宝塔API_修复502.py
+需将本机 IP 加入 kr宝塔 面板「设置」→「API 接口」白名单。
+"""
+import time
+import hashlib
+import json
+
+try:
+ import requests
+ import urllib3
+ urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)
+ USE_REQUESTS = True
+except ImportError:
+ import urllib.request
+ import urllib.parse
+ import ssl
+ ssl._create_default_https_context = ssl._create_unverified_context
+ USE_REQUESTS = False
+
+PANEL_URL = "https://43.139.27.93:9988"
+API_KEY = "qcWubCdlfFjS2b2DMT1lzPFaDfmv1cBT"
+
+def sign():
+ t = int(time.time())
+ s = str(t) + hashlib.md5(API_KEY.encode()).hexdigest()
+ return {"request_time": t, "request_token": hashlib.md5(s.encode()).hexdigest()}
+
+def post(endpoint, data=None):
+ url = PANEL_URL + endpoint
+ payload = sign()
+ if data:
+ payload.update(data)
+ if USE_REQUESTS:
+ r = requests.post(url, data=payload, timeout=20, verify=False)
+ return r.json()
+ req = urllib.request.Request(url, data=urllib.parse.urlencode(payload).encode())
+ with urllib.request.urlopen(req, timeout=20) as resp:
+ return json.loads(resp.read().decode())
+
+def main():
+ print("=" * 56)
+ print(" kr宝塔 · 宝塔 API 修复 502(soul.quwanzhi.com 等)")
+ print("=" * 56)
+
+ # 1. 重启 Nginx
+ print("\n【1】重启 Nginx...")
+ try:
+ r = post("/system?action=ServiceAdmin", {"name": "nginx", "type": "restart"})
+ if r.get("status") is True or (isinstance(r.get("msg"), str) and "成功" in r.get("msg", "")):
+ print(" Nginx 重启成功。")
+ else:
+ print(" 响应:", r)
+ except Exception as e:
+ if "IP" in str(e) or "校验" in str(e) or "403" in str(e):
+ print(" ❌ API 白名单未通过。请到 kr宝塔 面板「设置」→「API 接口」将本机公网 IP 加入白名单后重试。")
+ return 1
+ print(" 请求异常:", e)
+ return 1
+
+ # 2. 获取 Node 项目列表并重启 soul 相关
+ print("\n【2】查找并重启 soul 相关 Node 项目...")
+ try:
+ r = post("/project/nodejs/get_project_list", {})
+ if r.get("status") is not True:
+ print(" 获取项目列表失败或接口不可用:", r.get("msg", r))
+ else:
+ data = r.get("data") or r.get("list") or []
+ if not isinstance(data, list):
+ data = []
+ restarted = []
+ for p in data:
+ name = (p.get("name") or p.get("project_name") or "").lower()
+ if "soul" in name or "souladmin" in name or "soul-admin" in name:
+ proj_name = p.get("name") or p.get("project_name")
+ try:
+ post("/project/nodejs/restart_project", {"project_name": proj_name})
+ restarted.append(proj_name)
+ except Exception as e2:
+ print(" 重启 %s 失败: %s" % (proj_name, e2))
+ if restarted:
+ print(" 已重启:", ", ".join(restarted))
+ else:
+ print(" 未找到名称含 soul 的 Node 项目,或列表为空。若 502 仍存在,请在面板「Node 项目」中手动重启 soul 相关项目。")
+ except Exception as e:
+ print(" 请求异常:", e)
+
+ print("\n" + "=" * 56)
+ print("请刷新 soul.quwanzhi.com/admin 查看是否恢复。若仍 502,请到宝塔面板检查该站点「反向代理」上游是否运行,或重启对应 Node/PM2 项目。")
+ print("=" * 56)
+ return 0
+
+if __name__ == "__main__":
+ exit(main())
diff --git a/01_卡资(金)/金仓_存储备份/服务器管理/scripts/kr宝塔_带宽占用排查.sh b/01_卡资(金)/金仓_存储备份/服务器管理/scripts/kr宝塔_带宽占用排查.sh
new file mode 100644
index 00000000..ff81d714
--- /dev/null
+++ b/01_卡资(金)/金仓_存储备份/服务器管理/scripts/kr宝塔_带宽占用排查.sh
@@ -0,0 +1,104 @@
+#!/bin/bash
+# kr宝塔 43.139.27.93:列出可能占满带宽的 程序/端口/网站 及 连接数占比(近似带宽占比)
+# 在服务器上执行:bash kr宝塔_带宽占用排查.sh 或 宝塔面板 → 终端 粘贴运行
+
+set -e
+echo "=============================================================="
+echo " kr宝塔 · 带宽占用排查(程序 / 端口 / 网站 · 连接数占比)"
+echo "=============================================================="
+
+# 1) 监听中的端口与进程
+echo ""
+echo "【1】监听端口与对应进程(可能对外提供服务的程序)"
+echo "--------------------------------------------------------------"
+ss -tlnp 2>/dev/null | awk 'NR==1 || /LISTEN/ {print}' | while read line; do
+ if echo "$line" | grep -q "LISTEN"; then
+ port=$(echo "$line" | awk '{print $4}' | rev | cut -d: -f1 | rev)
+ pid=$(echo "$line" | grep -oE 'pid=[0-9]+' 2>/dev/null | sed 's/pid=//' | head -1)
+ if [ -n "$pid" ] && [ "$pid" -eq "$pid" ] 2>/dev/null; then
+ exe=$(readlink -f /proc/$pid/exe 2>/dev/null || ps -p $pid -o comm= 2>/dev/null)
+ echo " 端口 $port → PID $pid → $exe"
+ else
+ echo " $line"
+ fi
+ fi
+done
+
+# 2) ESTABLISHED 按本地端口统计 → 连接数占比
+echo ""
+echo "【2】当前连接数按「本地端口」统计(占比 ≈ 该服务占用带宽的大致比例)"
+echo "--------------------------------------------------------------"
+total=$(ss -antn state established 2>/dev/null | wc -l)
+[ "$total" -eq 0 ] && total=1
+ss -antn state established 2>/dev/null | awk '{print $4}' | sed 's/.*://' | sort | uniq -c | sort -rn | head -25 | while read cnt port; do
+ pct=$((cnt * 100 / total))
+ # 解析端口对应服务(常见)
+ name=""
+ case "$port" in
+ 80|443) name="(Nginx HTTP/HTTPS)" ;;
+ 9988) name="(宝塔面板)" ;;
+ 22022) name="(SSH)" ;;
+ 8000) name="(常见 Node/网关)" ;;
+ 3000) name="(常见 Node)" ;;
+ 3306) name="(MySQL)" ;;
+ esac
+ echo " 端口 $port $name → 连接数 $cnt → 占比 ${pct}%"
+done
+echo " 总连接数: $total"
+
+# 3) ESTABLISHED 按进程(PID)统计 → 程序维度占比
+echo ""
+echo "【3】当前连接数按「进程」统计(程序维度 ≈ 带宽占比)"
+echo "--------------------------------------------------------------"
+# 从 ss -antp 提取 pid(格式因系统而异)
+ss -antp state established 2>/dev/null | grep -oE 'pid=[0-9]+' | sed 's/pid=//' | sort | uniq -c | sort -rn | head -20 | while read cnt pid; do
+ [ -z "$pid" ] && continue
+ pct=$((cnt * 100 / total))
+ exe=$(readlink -f /proc/$pid/exe 2>/dev/null || ps -p $pid -o comm= 2>/dev/null)
+ cmd=$(ps -p $pid -o args= 2>/dev/null | cut -c1-60)
+ echo " PID $pid 连接数 $cnt (${pct}%) → $exe"
+ echo " 命令: $cmd"
+done
+
+# 4) Nginx 站点与端口(端口 → 网站)
+echo ""
+echo "【4】Nginx 站点(端口 → 网站/域名)"
+echo "--------------------------------------------------------------"
+if [ -d /www/server/panel/vhost/nginx ]; then
+ for f in /www/server/panel/vhost/nginx/*.conf; do
+ [ -f "$f" ] || continue
+ name=$(grep -m1 'server_name' "$f" 2>/dev/null | sed 's/.*server_name\s*//;s/;.*//;s/\s.*//')
+ listen=$(grep -m1 'listen' "$f" 2>/dev/null | sed 's/.*listen\s*//;s/\s.*//;s/;.*//')
+ root=$(grep -m1 'root ' "$f" 2>/dev/null | sed 's/.*root\s*//;s/;.*//')
+ [ -z "$name" ] && name="(未配置 server_name)"
+ echo " $name → listen $listen root $root"
+ done
+else
+ echo " (未找到 /www/server/panel/vhost/nginx)"
+fi
+
+# 5) PM2 / Node 进程(常见占带宽)
+echo ""
+echo "【5】Node/PM2 进程(常见占带宽应用)"
+echo "--------------------------------------------------------------"
+if command -v pm2 >/dev/null 2>&1; then
+ pm2 list 2>/dev/null || true
+else
+ ps aux | grep -E 'node|next|nuxt' | grep -v grep || echo " (未发现 pm2/node 或未在 PATH)"
+fi
+
+# 6) 若安装 nethogs,可采样几秒得到实时带宽占比
+echo ""
+echo "【6】实时带宽占比(需安装 nethogs,采样 5 秒)"
+echo "--------------------------------------------------------------"
+if command -v nethogs >/dev/null 2>&1; then
+ echo " 运行: nethogs -t -c 5 (5 秒采样,需 root)"
+ (timeout 6 nethogs -t -c 5 2>/dev/null || nethogs -t -d 1 -c 5 2>/dev/null) || echo " (请手动执行: nethogs -t)"
+else
+ echo " 未安装 nethogs。安装: yum install nethogs 或 apt install nethogs,可得到各进程实时带宽占比。"
+fi
+
+echo ""
+echo "=============================================================="
+echo "说明:连接数占比可近似看作该程序/端口占用带宽的比例;精确带宽请用 nethogs 或宝塔「监控」"
+echo "=============================================================="
diff --git a/02_卡人(水)/水桥_平台对接/飞书管理/脚本/.feishu_tokens.json b/02_卡人(水)/水桥_平台对接/飞书管理/脚本/.feishu_tokens.json
index 9fb8fa92..1f5ae912 100644
--- a/02_卡人(水)/水桥_平台对接/飞书管理/脚本/.feishu_tokens.json
+++ b/02_卡人(水)/水桥_平台对接/飞书管理/脚本/.feishu_tokens.json
@@ -1,6 +1,6 @@
{
- "access_token": "u-5G.9qZ5QVazXtNeCd0_G9Ql5kUi5k1grMUaaEwA00wC3",
- "refresh_token": "ur-75hAReT7B5hUGua_bRUM74l5mWUBk1OpXEaaUMQ00BCm",
+ "access_token": "u-7C1CncMZl2KpSw4iFE2NlTl5kqqBk1ijMUaaYNM00BO2",
+ "refresh_token": "ur-7M87WoUqRaaWua55KFRkgol5miWBk1MPP8aaVRw00BO6",
"name": "飞书用户",
- "auth_time": "2026-02-20T18:13:31.812446"
+ "auth_time": "2026-02-21T06:25:07.138984"
}
\ No newline at end of file
diff --git a/02_卡人(水)/水桥_平台对接/飞书管理/脚本/106场派对智能纪要_20260221.txt b/02_卡人(水)/水桥_平台对接/飞书管理/脚本/106场派对智能纪要_20260221.txt
new file mode 100644
index 00000000..b8c1e0a6
--- /dev/null
+++ b/02_卡人(水)/水桥_平台对接/飞书管理/脚本/106场派对智能纪要_20260221.txt
@@ -0,0 +1,33 @@
+【卡若智能纪要】106场 2026-02-21
+
+一、嘉宾与主线
+· 退伍军人(刚退伍):问 AI 方向、智能体变现;被建议优先低空经济/无人机培训(补贴 8800)、研学/家政/烧烤等有结果赛道,卖智能体为伪概念除非有流量。
+· 环保行业/国企专员(零基础):问如何切入 AI;建议先用豆包/GPT/Cursor 提效本职工作,AI 是工具,结合现有业务赋能(如私域+AI 客服:一人管 50 个微信,前段 AI 筛选分析、真人后接)。
+· 5 号(分享嘉宾):AI 炒股逻辑——中青宝案例(算力/数据经济/元宇宙/华为概念等),结合财报与 K 线;用 AI 做新政、数据与舆情采集做预判;提到 DeepSeek 在量化/超短线/套利上的优势(秒级成交),普通人炒股空间会变窄。
+· 古币/银元嘉宾:咸丰大钱、银元特殊版别;做过小型线上拍卖行——线下拍卖抽 20 点、自家私域拍卖群抽 5 点,早期流动性好时收益可观;银元近年跌;用 AI 可问某朝代古币涨跌空间;乡下收货、鉴定(如 PCGS 等)重要;全国炒银元约十几二十万人,小圈子变现。
+
+二、核心内容
+· 退伍军人:政策友好(贴息贷款、补贴),更适合低空经济、研学、家政、烧烤等;卖智能体需流量与销售能力,否则不匹配。
+· AI 工作提效:从本职工作切入,用 AI 做流程化、文档、剪辑分发等,3 天活 3 小时完成;私域+AI 客服(朋友圈、点赞、加友分析、分配流量由 AI 做)。
+· AI 炒股:逻辑在预期与预判;国内模型分析逻辑弱,可多用 Claude;DeepSeek 在数据舆情、策略量化、多因子轮动上强,普通人越来越难。
+· 古币/拍卖:线上拍卖抽点低(5 点)、流动性大时可行;乡下收货、鉴定与圈子是关键;银元有下跌周期。
+
+三、热点切片
+· 退伍军人+低空经济/无人机培训(补贴 8800)。
+· 私域+AI 客服:一人管 50 个微信,AI 前置筛选与分析。
+· AI 炒股:中青宝 14.23、DeepSeek 量化与秒级成交。
+· 古币银元+小型线上拍卖行(抽 5 点)、嘉德拍卖一条视频 600 万播放。
+
+四、核心金句
+· 「卖智能体是伪概念,除非你有流量、销售厉害。」
+· 「AI 是工具,配合你原有业务提效、自动化才有用。」
+· 「炒股炒的是预判;用 AI 炒股国内模型别用,逻辑差。」
+· 「超短线、套利谁能打得过 DeepSeek?秒级成交,人做不到。」
+· 「线下拍卖抽 20 点,我们私域拍卖抽 5 点,流动性高时很吓人。」
+
+五、下一步
+· 退伍军人可查当地低空经济/无人机培训补贴,结合烧烤等实体。
+· 零基础先在工作场景用豆包/Cursor 提效,再考虑 AI 项目。
+· 派对内继续 5~10 分钟主题分享,可关注、可快速合作;进资源泡泡群、合作私聊管理。
+
+数据来源:soul 派对 106场 20260221.txt
diff --git a/02_卡人(水)/水桥_平台对接/飞书管理/脚本/feishu_write_minutes_to_sheet.py b/02_卡人(水)/水桥_平台对接/飞书管理/脚本/feishu_write_minutes_to_sheet.py
index ec6db44e..50da6fa1 100644
--- a/02_卡人(水)/水桥_平台对接/飞书管理/脚本/feishu_write_minutes_to_sheet.py
+++ b/02_卡人(水)/水桥_平台对接/飞书管理/脚本/feishu_write_minutes_to_sheet.py
@@ -4,8 +4,9 @@
- 内部会议纪要:写在「内部会议纪要」这一行,按纪要上的日期(如 2月20日)填到该日期列。
- 派对今日总结:写在「今日总结」这一行,按派对日期(如 2月19日)填到该日期列。
不发飞书群。
-用法:python3 feishu_write_minutes_to_sheet.py [内部会议图片路径] [派对总结图片路径]
- 默认:内部会议 20260220-094434.jpg → 2月20日列,派对总结 20260220-094442.png → 2月19日列
+用法:
+ python3 feishu_write_minutes_to_sheet.py [内部会议图片路径] [派对总结图片路径]
+ python3 feishu_write_minutes_to_sheet.py --party-text 21 [纪要txt路径] # 仅将派对智能纪要文本写入 2月21日 今日总结
"""
import os
import sys
@@ -108,6 +109,20 @@ def _resize_image_if_needed(path, max_bytes=MAX_IMAGE_BYTES):
return data
+def update_cell_text(token, range_str, text, value_input_option='USER_ENTERED'):
+ """向单元格写入文本(支持换行)。"""
+ if range_str.count('!') == 1 and ':' not in range_str.split('!')[1]:
+ range_str = range_str + ':' + range_str.split('!')[1]
+ url = f'https://open.feishu.cn/open-apis/sheets/v2/spreadsheets/{WIKI_TOKEN}/values'
+ params = {'valueInputOption': value_input_option}
+ payload = {'valueRange': {'range': range_str, 'values': [[text]]}}
+ r = requests.put(url, params=params, headers={'Authorization': f'Bearer {token}', 'Content-Type': 'application/json'}, json=payload, timeout=15)
+ try:
+ return r.status_code, r.json()
+ except Exception:
+ return r.status_code, {}
+
+
def write_image_to_cell(token, range_str, image_path, name=None):
"""
飞书 v2 写入图片到单元格:POST .../values_image,body 为 JSON,image 为整数数组(字节流)。
@@ -138,6 +153,54 @@ def write_image_to_cell(token, range_str, image_path, name=None):
def main():
+ # 仅写入派对智能纪要到 2月21日 今日总结
+ if len(sys.argv) >= 4 and sys.argv[1] == '--party-text' and sys.argv[2] == '21':
+ summary_path = sys.argv[3].strip()
+ if not os.path.exists(summary_path):
+ print('❌ 纪要文件不存在:', summary_path)
+ sys.exit(1)
+ with open(summary_path, 'r', encoding='utf-8') as f:
+ summary_text = f.read().strip()
+ token = load_token() or refresh_token()
+ if not token:
+ print('❌ 无法获取飞书 Token')
+ sys.exit(1)
+ vals = read_range(token, f'{SHEET_ID}!A1:AG50')
+ if not vals or len(vals) < 2:
+ print('❌ 读取表格失败')
+ sys.exit(1)
+ header = vals[0]
+ col_21 = None
+ for idx, cell in enumerate(header):
+ if str(cell).strip() == '21':
+ col_21 = idx
+ break
+ row_party = None
+ for ri, row in enumerate(vals):
+ a1 = (row[0] if row and len(row) > 0 else '')
+ a1 = str(a1 or '').strip()
+ if '今日总结' in a1:
+ row_party = ri + 1
+ break
+ if col_21 is None or row_party is None:
+ print('❌ 未找到日期列 21 或「今日总结」行')
+ sys.exit(1)
+ range_cell = f'{SHEET_ID}!{_col_letter(col_21)}{row_party}'
+ code, body = update_cell_text(token, range_cell, summary_text)
+ if code == 200 and body.get('code') in (0, None):
+ print(f'✅ 已将派对智能纪要写入「今日总结」2月21日列({range_cell})')
+ else:
+ if code == 401 or body.get('code') in (99991677, 99991663):
+ token = refresh_token()
+ if token:
+ code, body = update_cell_text(token, range_cell, summary_text)
+ if code == 200 and body.get('code') in (0, None):
+ print('✅ 已将派对智能纪要写入「今日总结」2月21日列')
+ sys.exit(0)
+ print('❌ 写入纪要失败:', code, body)
+ sys.exit(1)
+ return
+
image_internal = (sys.argv[1] if len(sys.argv) > 1 else DEFAULT_IMAGE_INTERNAL).strip()
image_party = (sys.argv[2] if len(sys.argv) > 2 else DEFAULT_IMAGE_PARTY).strip()
diff --git a/02_卡人(水)/水桥_平台对接/飞书管理/脚本/generate_party_minutes_image.py b/02_卡人(水)/水桥_平台对接/飞书管理/脚本/generate_party_minutes_image.py
new file mode 100644
index 00000000..5246eb18
--- /dev/null
+++ b/02_卡人(水)/水桥_平台对接/飞书管理/脚本/generate_party_minutes_image.py
@@ -0,0 +1,228 @@
+#!/usr/bin/env python3
+"""
+从「派对智能纪要」txt 生成一张长图(PNG),风格与 101 场一致。
+仅生成图片,不发群。
+
+用法:
+ python3 generate_party_minutes_image.py [纪要txt路径]
+ python3 generate_party_minutes_image.py # 默认使用同目录 106场派对智能纪要_20260221.txt
+
+输出:卡若Ai的文件夹/图片/106场派对智能纪要_20260221.png(或按文件名推导)
+依赖:playwright(与智能纪要 screenshot.py 相同)
+"""
+
+import re
+import sys
+from pathlib import Path
+
+# 脚本与智能纪要目录
+SCRIPT_DIR = Path(__file__).resolve().parent
+# 卡若AI 根目录(脚本在 02_卡人/水桥/飞书管理/脚本,上 4 级为根)
+KARUO_AI_ROOT = Path(__file__).resolve().parents[4]
+INTELLIGENT_MINUTES_SCRIPT = KARUO_AI_ROOT / "04_卡火(火)/火眼_智能追问/智能纪要/脚本"
+OUTPUT_IMAGE_DIR = Path("/Users/karuo/Documents/卡若Ai的文件夹/图片")
+OUTPUT_HTML_DIR = Path("/Users/karuo/Documents/卡若Ai的文件夹/报告/智能纪要")
+
+
+def parse_minutes_txt(content: str) -> tuple[str, list[tuple[str, str]]]:
+ """解析纪要:返回 (标题, [(区块标题, 区块正文), ...])"""
+ lines = content.strip().split("\n")
+ title = ""
+ sections = []
+ current_title = ""
+ current_body: list[str] = []
+
+ def flush():
+ nonlocal current_title, current_body
+ if current_title or current_body:
+ sections.append((current_title, "\n".join(current_body).strip()))
+ current_title = ""
+ current_body = []
+
+ for line in lines:
+ line = line.rstrip()
+ # 首行作为总标题(仅在第一行时)
+ if not title and line.strip() and not re.match(r"^[一二三四五六七八九十]、", line):
+ title = line.strip()
+ continue
+ m = re.match(r"^([一二三四五六七八九十]、[^\s·]+)(.*)$", line)
+ if m:
+ flush()
+ current_title = m.group(1).strip()
+ rest = m.group(2).strip()
+ if rest:
+ current_body.append(rest)
+ continue
+ # 正文行:· 条目 或 数据来源 或 任意非空(在已有区块内)
+ if current_title or current_body:
+ if line.strip():
+ current_body.append(line.strip())
+ flush()
+ if not title and sections:
+ title = sections[0][0] if sections[0][0] else "派对智能纪要"
+ return title, sections
+
+
+def escape_html(s: str) -> str:
+ return s.replace("&", "&").replace("<", "<").replace(">", ">").replace("\n", "
")
+
+
+def build_html(title: str, sections: list[tuple[str, str]]) -> str:
+ """生成 101 场风格的整页 HTML"""
+ section_colors = ["blue", "orange", "green", "purple", "red", "blue"]
+ section_icons = ["👤", "📌", "🔥", "💬", "▶", "📎"]
+
+ sections_html = ""
+ for i, (sec_title, body) in enumerate(sections):
+ color = section_colors[i % len(section_colors)]
+ icon = section_icons[i % len(section_icons)]
+ body_esc = escape_html(body)
+ sections_html += f"""
+
卡若派对智能纪要 · 仅本地生成,不发群
+