🔄 卡若AI 同步 2026-02-20 07:09 | 更新:金仓、水桥平台对接、运营中枢参考资料、运营中枢工作台 | 排除 >20MB: 5 个
This commit is contained in:
@@ -66,8 +66,8 @@ kr宝塔: qcWubCdlfFjS2b2DMT1lzPFaDfmv1cBT
|
||||
### 1. 检查服务器状态
|
||||
|
||||
```bash
|
||||
# 运行快速检查脚本
|
||||
python3 /Users/karuo/Documents/个人/卡若AI/01_系统管理/服务器管理/scripts/快速检查服务器.py
|
||||
# 运行快速检查脚本(需各服务器 API 白名单含本机 IP)
|
||||
python3 "/Users/karuo/Documents/个人/卡若AI/01_卡资(金)/金仓_存储备份/服务器管理/脚本/快速检查服务器.py"
|
||||
```
|
||||
|
||||
### 2. 部署 Node 项目(标准流程)
|
||||
@@ -98,13 +98,20 @@ rm /tmp/项目名_update.tar.gz
|
||||
|
||||
```bash
|
||||
# 检查所有服务器SSL证书状态
|
||||
python3 /Users/karuo/Documents/个人/卡若AI/01_系统管理/服务器管理/scripts/ssl证书检查.py
|
||||
python3 "/Users/karuo/Documents/个人/卡若AI/01_卡资(金)/金仓_存储备份/服务器管理/脚本/ssl证书检查.py"
|
||||
|
||||
# 自动修复过期证书
|
||||
python3 /Users/karuo/Documents/个人/卡若AI/01_系统管理/服务器管理/scripts/ssl证书检查.py --fix
|
||||
python3 "/Users/karuo/Documents/个人/卡若AI/01_卡资(金)/金仓_存储备份/服务器管理/脚本/ssl证书检查.py" --fix
|
||||
```
|
||||
|
||||
### 4. 常用诊断命令
|
||||
### 4. kr宝塔 网络卡/服务器卡 · 检查与处理
|
||||
|
||||
- **文档**:`references/kr宝塔_网络与服务器卡顿_检查与处理.md`
|
||||
- **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`
|
||||
- 服务器内诊断:登录后执行文档中「2.2 一键诊断」命令块;若 SSH 被关闭可改用宝塔面板终端。
|
||||
|
||||
### 5. 常用诊断命令(小型宝塔等)
|
||||
|
||||
```bash
|
||||
# 检查端口占用
|
||||
|
||||
105
01_卡资(金)/金仓_存储备份/服务器管理/references/kr宝塔_网络与服务器卡顿_检查与处理.md
Normal file
105
01_卡资(金)/金仓_存储备份/服务器管理/references/kr宝塔_网络与服务器卡顿_检查与处理.md
Normal file
@@ -0,0 +1,105 @@
|
||||
# kr宝塔 · 网络卡 / 服务器卡 · 检查与处理
|
||||
|
||||
> 适用:43.139.27.93(kr宝塔,2核4G)。SSH 端口 22022,密钥见 Steam/README_密钥与登录.md。
|
||||
|
||||
---
|
||||
|
||||
## 一、本机侧快速检查(无需登录服务器)
|
||||
|
||||
```bash
|
||||
# 1. 网络连通
|
||||
ping -c 3 43.139.27.93
|
||||
|
||||
# 2. SSH 端口是否可达
|
||||
nc -zv -w 5 43.139.27.93 22022
|
||||
|
||||
# 3. 宝塔面板端口(若需)
|
||||
nc -zv -w 5 43.139.27.93 9988
|
||||
```
|
||||
|
||||
- 若 **ping 丢包或延迟高** → 网络问题(运营商/云厂商/本地网络)。
|
||||
- 若 **端口不通** → 安全组/防火墙未放行 22022 或 9988。
|
||||
|
||||
---
|
||||
|
||||
## 二、SSH 登录与服务器内诊断
|
||||
|
||||
### 2.1 登录
|
||||
|
||||
```bash
|
||||
# 密钥路径(私钥权限须为 600)
|
||||
chmod 600 "/Users/karuo/Documents/开发/4、小工具/服务器管理/Steam/id_ed25519"
|
||||
ssh -p 22022 -i "/Users/karuo/Documents/开发/4、小工具/服务器管理/Steam/id_ed25519" root@43.139.27.93
|
||||
```
|
||||
|
||||
若 **Connection closed by remote host**:可能是服务器负载过高或 sshd 限流,稍后重试或从宝塔面板「终端」登录执行下列命令。
|
||||
|
||||
### 2.2 服务器内一键诊断(登录后执行)
|
||||
|
||||
```bash
|
||||
echo "=== 负载 ===" && uptime
|
||||
echo "=== 内存 ===" && free -m
|
||||
echo "=== 磁盘 ===" && df -h / /www
|
||||
echo "=== 连接数(ESTABLISHED) ===" && ss -ant state established | wc -l
|
||||
echo "=== 连接汇总 ===" && ss -s
|
||||
echo "=== CPU TOP5 ===" && ps aux --sort=-%cpu | head -6
|
||||
echo "=== 内存 TOP5 ===" && ps aux --sort=-%mem | head -6
|
||||
```
|
||||
|
||||
### 2.3 针对「网络卡」的检查
|
||||
|
||||
- **连接数是否过多**:`ss -ant state established | wc -l` 若上千需关注。
|
||||
- **Nginx/应用日志**:看是否有大量请求或慢请求。
|
||||
- **带宽/流量**:宝塔面板「监控」或 `vnstat`(若已装)。
|
||||
|
||||
### 2.4 针对「服务器卡」的检查
|
||||
|
||||
| 现象 | 检查命令/位置 | 处理思路 |
|
||||
|------------|--------------------------|------------------------------|
|
||||
| CPU 高 | `top` 或 `ps aux --sort=-%cpu` | 结束异常进程或优化程序 |
|
||||
| 内存不足 | `free -m` | 关停非必要服务、加 swap 或升配 |
|
||||
| 磁盘满 | `df -h`、`du -sh /www/*` | 清日志、删临时文件、扩容 |
|
||||
| 磁盘 I/O 高| `iostat -x 1 3`(若已装)| 减少写操作、查大文件/日志 |
|
||||
| 连接数爆炸 | `ss -s`、`ss -ant` | 限流、查攻击或异常客户端 |
|
||||
|
||||
---
|
||||
|
||||
## 三、常见处理动作(登录后执行)
|
||||
|
||||
```bash
|
||||
# 清理系统日志(慎用,仅当磁盘紧张时)
|
||||
# find /var/log -name "*.log" -mtime +7 -delete
|
||||
|
||||
# 重载 Nginx
|
||||
nginx -s reload
|
||||
|
||||
# 查看宝塔/Node 相关进程
|
||||
ps aux | grep -E 'nginx|node|pm2'
|
||||
|
||||
# 若使用 PM2,查看列表
|
||||
pm2 list
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 四、宝塔 API 远程检查(需白名单)
|
||||
|
||||
若本机 IP 已加入 kr宝塔 的「API 白名单」,可用卡若AI 脚本批量看 CPU/内存/磁盘:
|
||||
|
||||
```bash
|
||||
python3 "/Users/karuo/Documents/个人/卡若AI/01_卡资(金)/金仓_存储备份/服务器管理/脚本/快速检查服务器.py"
|
||||
```
|
||||
|
||||
未加白名单前会报「IP校验失败」,需在 kr宝塔 面板:**设置 → API 接口 → 接口密钥 → 将本机公网 IP 加入白名单**。
|
||||
|
||||
---
|
||||
|
||||
## 五、本次诊断结果摘要(2026-02-20)
|
||||
|
||||
- **本机 → kr宝塔**:ping 正常(约 0.4~0.9ms),22022 端口可达。
|
||||
- **SSH**:私钥权限已建议设为 600;曾出现 Connection closed by remote host,可能负载或限流,建议从宝塔面板终端登录执行上述诊断。
|
||||
- **宝塔 API**:当前本机 IP 未在白名单,无法远程取 CPU/内存/磁盘;需在面板加白名单后可长期用脚本检查。
|
||||
|
||||
---
|
||||
|
||||
**下一步**:在 kr宝塔 面板终端或 SSH 成功连上后,执行「二、2.2」的一键诊断,根据输出再决定是否杀进程、清日志或重载服务。
|
||||
@@ -1,6 +1,8 @@
|
||||
# Time Machine 备份到家里 DiskStation 报错排查
|
||||
|
||||
**现象**:系统设置 → 时间机器 → 「共享 - DiskStation.local」显示**红点**,提示「正在等待完成第一次备份」。
|
||||
**现象**:
|
||||
- 系统设置 → 时间机器 → 「共享 - DiskStation.local」显示**红点**,提示「正在等待完成第一次备份」
|
||||
- 或弹窗 **「未识别备份磁盘」** / **「磁盘 DiskStation.local 可能已被更改」**
|
||||
|
||||
**家里 NAS**:DiskStation(192.168.110.29 / DiskStation.local)
|
||||
|
||||
|
||||
@@ -34,6 +34,79 @@ REFERER = "https://meetings.feishu.cn/minutes/me"
|
||||
USER_AGENT = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/113.0.0.0 Safari/537.36"
|
||||
|
||||
|
||||
def _cookie_from_browser() -> str:
|
||||
"""从本机浏览器读取飞书 Cookie(与 download_soul_minutes_101_to_103 一致)。"""
|
||||
c = os.environ.get("FEISHU_MINUTES_COOKIE", "").strip()
|
||||
if c and len(c) > 100 and "PASTE_YOUR" not in c:
|
||||
return c
|
||||
try:
|
||||
import browser_cookie3
|
||||
for domain in ("cunkebao.feishu.cn", "feishu.cn", ".feishu.cn"):
|
||||
for loader in (browser_cookie3.safari, browser_cookie3.chrome, browser_cookie3.chromium, browser_cookie3.firefox, browser_cookie3.edge):
|
||||
try:
|
||||
cj = loader(domain_name=domain)
|
||||
s = "; ".join([f"{c.name}={c.value}" for c in cj])
|
||||
if len(s) > 100:
|
||||
return s
|
||||
except Exception:
|
||||
continue
|
||||
except ImportError:
|
||||
pass
|
||||
try:
|
||||
import subprocess
|
||||
import shutil
|
||||
import tempfile
|
||||
import sqlite3
|
||||
import hashlib
|
||||
for name in ("Doubao Browser Safe Storage", "Doubao Safe Storage"):
|
||||
try:
|
||||
key = subprocess.run(["security", "find-generic-password", "-s", name, "-w"], capture_output=True, text=True, timeout=5).stdout.strip()
|
||||
if not key:
|
||||
continue
|
||||
except Exception:
|
||||
continue
|
||||
for profile in ("Default", "Profile 1", "Profile 2", "Profile 3"):
|
||||
db = Path.home() / "Library/Application Support/Doubao" / profile / "Cookies"
|
||||
if not db.exists():
|
||||
continue
|
||||
try:
|
||||
tmp = tempfile.mktemp(suffix=".db")
|
||||
shutil.copy2(db, tmp)
|
||||
conn = sqlite3.connect(tmp)
|
||||
cur = conn.cursor()
|
||||
cur.execute("SELECT host_key, name, encrypted_value FROM cookies WHERE host_key LIKE '%feishu%' OR host_key LIKE '%cunkebao%'")
|
||||
rows = cur.fetchall()
|
||||
conn.close()
|
||||
Path(tmp).unlink(missing_ok=True)
|
||||
except Exception:
|
||||
continue
|
||||
if not rows:
|
||||
continue
|
||||
from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes
|
||||
derived = hashlib.pbkdf2_hmac("sha1", key.encode("utf-8"), b"saltysalt", 1003, dklen=16)
|
||||
parts = []
|
||||
for host, name, enc in rows:
|
||||
if enc[:3] != b"v10":
|
||||
continue
|
||||
raw = enc[3:]
|
||||
dec = Cipher(algorithms.AES(derived), modes.CBC(b" " * 16)).decryptor()
|
||||
pt = dec.update(raw) + dec.finalize()
|
||||
pad = pt[-1]
|
||||
if isinstance(pad, int) and 1 <= pad <= 16:
|
||||
pt = pt[:-pad]
|
||||
for i in range(min(len(pt), 48)):
|
||||
if i + 4 <= len(pt) and all(32 <= pt[j] < 127 for j in range(i, min(i + 8, len(pt)))):
|
||||
val = pt[i:].decode("ascii", errors="ignore")
|
||||
if val and "\x00" not in val:
|
||||
parts.append(f"{name}={val}")
|
||||
break
|
||||
if len(parts) > 5:
|
||||
return "; ".join(parts)
|
||||
except Exception:
|
||||
pass
|
||||
return ""
|
||||
|
||||
|
||||
def get_cookie_from_args_or_file(cookie_arg: str | None) -> str:
|
||||
if cookie_arg and cookie_arg.strip() and "PASTE_YOUR" not in cookie_arg:
|
||||
return cookie_arg.strip()
|
||||
@@ -43,7 +116,7 @@ def get_cookie_from_args_or_file(cookie_arg: str | None) -> str:
|
||||
line = line.strip()
|
||||
if line and not line.startswith("#") and "PASTE_YOUR" not in line:
|
||||
return line
|
||||
return ""
|
||||
return _cookie_from_browser()
|
||||
|
||||
|
||||
def get_bv_csrf_token(cookie: str) -> str:
|
||||
@@ -59,64 +132,69 @@ def get_bv_csrf_token(cookie: str) -> str:
|
||||
return cookie[start:end].strip()
|
||||
|
||||
|
||||
def build_headers(cookie: str):
|
||||
"""与 feishu_downloader.py 完全一致的请求头。"""
|
||||
def build_headers(cookie: str, require_bv: bool = True):
|
||||
"""请求头。require_bv=True 时必须有 36 位 bv_csrf_token;False 时能带就带。"""
|
||||
bv = get_bv_csrf_token(cookie)
|
||||
if len(bv) != 36:
|
||||
h = {
|
||||
"User-Agent": USER_AGENT,
|
||||
"cookie": cookie,
|
||||
"referer": REFERER,
|
||||
"content-type": "application/x-www-form-urlencoded",
|
||||
}
|
||||
if len(bv) == 36:
|
||||
h["bv-csrf-token"] = bv
|
||||
if require_bv and len(bv) != 36:
|
||||
raise ValueError(
|
||||
"Cookie 中未包含有效的 bv_csrf_token(需 36 位)。"
|
||||
"请从 飞书妙记主页 → F12 → 网络 → list?size=20& 请求 中复制完整 Cookie。"
|
||||
)
|
||||
return {
|
||||
"User-Agent": USER_AGENT,
|
||||
"cookie": cookie,
|
||||
"bv-csrf-token": bv,
|
||||
"referer": REFERER,
|
||||
"content-type": "application/x-www-form-urlencoded",
|
||||
}
|
||||
return h
|
||||
|
||||
|
||||
def export_transcript(cookie: str, object_token: str, format_txt: bool = True, add_speaker: bool = True, add_timestamp: bool = False) -> str | None:
|
||||
"""
|
||||
调用妙记导出接口,与 GitHub feishu_downloader.get_minutes_url 一致:
|
||||
POST export,params: object_token, add_speaker, add_timestamp, format (2=txt, 3=srt)。
|
||||
调用妙记导出接口。先试 meetings,再试 cunkebao;请求头可无 bv_csrf_token(能带就带)。
|
||||
返回导出的文本,失败返回 None。
|
||||
"""
|
||||
if not requests:
|
||||
return None
|
||||
# format: 2=txt, 3=srt(与 config.ini 一致)
|
||||
params = {
|
||||
"object_token": object_token,
|
||||
"add_speaker": "true" if add_speaker else "false",
|
||||
"add_timestamp": "true" if add_timestamp else "false",
|
||||
"format": 2 if format_txt else 3,
|
||||
}
|
||||
headers = build_headers(cookie)
|
||||
try:
|
||||
r = requests.post(EXPORT_URL, params=params, headers=headers, timeout=20)
|
||||
r.encoding = "utf-8"
|
||||
if r.status_code != 200:
|
||||
return None
|
||||
text = (r.text or "").strip()
|
||||
if not text or len(text) < 20:
|
||||
return None
|
||||
# 可能是 JSON 包装
|
||||
if text.startswith("{"):
|
||||
try:
|
||||
j = r.json()
|
||||
data = j.get("data")
|
||||
if isinstance(data, str):
|
||||
return data
|
||||
if isinstance(data, dict):
|
||||
return data.get("content") or data.get("text") or data.get("transcript")
|
||||
except Exception:
|
||||
pass
|
||||
return None
|
||||
if "<html" in text.lower()[:100] or "Something went wrong" in text:
|
||||
return None
|
||||
return text
|
||||
except Exception:
|
||||
return None
|
||||
headers = build_headers(cookie, require_bv=False)
|
||||
for url, ref in [
|
||||
(EXPORT_URL, REFERER),
|
||||
("https://cunkebao.feishu.cn/minutes/api/export", "https://cunkebao.feishu.cn/minutes/"),
|
||||
]:
|
||||
headers = {**headers, "referer": ref}
|
||||
try:
|
||||
r = requests.post(url, params=params, headers=headers, timeout=20)
|
||||
r.encoding = "utf-8"
|
||||
if r.status_code != 200:
|
||||
continue
|
||||
text = (r.text or "").strip()
|
||||
if not text or len(text) < 20:
|
||||
continue
|
||||
if text.startswith("{"):
|
||||
try:
|
||||
j = r.json()
|
||||
data = j.get("data")
|
||||
if isinstance(data, str):
|
||||
return data
|
||||
if isinstance(data, dict):
|
||||
return data.get("content") or data.get("text") or data.get("transcript")
|
||||
except Exception:
|
||||
pass
|
||||
continue
|
||||
if "<html" in text.lower()[:100] or "Something went wrong" in text:
|
||||
continue
|
||||
return text
|
||||
except Exception:
|
||||
continue
|
||||
return None
|
||||
|
||||
|
||||
def extract_token_from_url(url_or_token: str) -> str:
|
||||
@@ -162,16 +240,16 @@ def main() -> int:
|
||||
|
||||
object_token = args.object_token or extract_token_from_url(args.url_or_token)
|
||||
if not object_token:
|
||||
object_token = "obcnxrkz6k459k669544228c" # 104 场默认
|
||||
object_token = "obcnyg5nj2l8q281v32de6qz" # 104 场
|
||||
|
||||
try:
|
||||
build_headers(cookie)
|
||||
build_headers(cookie, require_bv=False)
|
||||
except ValueError as e:
|
||||
print(str(e), file=sys.stderr)
|
||||
return 1
|
||||
|
||||
print(f"📝 object_token: {object_token}")
|
||||
print("📡 使用 meetings.feishu.cn 导出接口(GitHub 同款)…")
|
||||
print("📡 导出中(meetings / cunkebao)…")
|
||||
text = export_transcript(cookie, object_token, format_txt=True, add_speaker=not args.no_speaker, add_timestamp=args.timestamp)
|
||||
if not text:
|
||||
print("❌ 导出失败。请确认:", file=sys.stderr)
|
||||
|
||||
102
02_卡人(水)/水桥_平台对接/智能纪要/脚本/scrape_104_text.py
Normal file
102
02_卡人(水)/水桥_平台对接/智能纪要/脚本/scrape_104_text.py
Normal file
@@ -0,0 +1,102 @@
|
||||
#!/usr/bin/env python3
|
||||
"""从 104 场妙记页面抓取「文字记录」或用同页 Cookie 调导出接口,保存到 soul 目录,格式与 103 场一致。"""
|
||||
import re
|
||||
import sys
|
||||
from pathlib import Path
|
||||
|
||||
OUT_DIR = Path("/Users/karuo/Documents/聊天记录/soul")
|
||||
URL_104 = "https://cunkebao.feishu.cn/minutes/obcnyg5nj2l8q281v32de6qz"
|
||||
OBJECT_TOKEN = "obcnyg5nj2l8q281v32de6qz"
|
||||
EXPORT_URL = "https://cunkebao.feishu.cn/minutes/api/export"
|
||||
TITLE = "soul 派对 第104场 20260219"
|
||||
PROFILE_SRC = Path.home() / "Library/Application Support/Doubao/Profile 2"
|
||||
PROFILE_COPY = Path("/tmp/feishu_scrape_profile")
|
||||
|
||||
|
||||
def main():
|
||||
import shutil
|
||||
if PROFILE_COPY.exists():
|
||||
shutil.rmtree(PROFILE_COPY, ignore_errors=True)
|
||||
PROFILE_COPY.mkdir(parents=True, exist_ok=True)
|
||||
for name in ["Cookies", "Local State", "Preferences"]:
|
||||
src = PROFILE_SRC / name
|
||||
if src.exists():
|
||||
try:
|
||||
shutil.copy2(src, PROFILE_COPY / name)
|
||||
except Exception:
|
||||
pass
|
||||
(PROFILE_COPY / "LOCK").unlink(missing_ok=True)
|
||||
|
||||
try:
|
||||
from playwright.sync_api import sync_playwright
|
||||
except ImportError:
|
||||
print("NO_PLAYWRIGHT", file=sys.stderr)
|
||||
return 2
|
||||
|
||||
cookies = []
|
||||
body_text = ""
|
||||
with sync_playwright() as p:
|
||||
try:
|
||||
ctx = p.chromium.launch_persistent_context(
|
||||
user_data_dir=str(PROFILE_COPY),
|
||||
headless=True,
|
||||
channel="chromium",
|
||||
timeout=30000,
|
||||
args=["--no-sandbox"],
|
||||
)
|
||||
except Exception as e:
|
||||
print("LAUNCH_ERR", str(e), file=sys.stderr)
|
||||
return 3
|
||||
page = ctx.pages[0] if ctx.pages else ctx.new_page()
|
||||
page.goto(URL_104, wait_until="domcontentloaded", timeout=25000)
|
||||
page.wait_for_timeout(10000)
|
||||
cookies = ctx.cookies()
|
||||
cookie_str = "; ".join([f"{c['name']}={c['value']}" for c in cookies])
|
||||
bv = next((c["value"] for c in cookies if c.get("name") == "bv_csrf_token" and len(c.get("value", "")) == 36), None)
|
||||
# 备用:从页面抓取正文(导出失败时用)
|
||||
try:
|
||||
body_text = page.evaluate("() => document.body ? document.body.innerText : ''") or ""
|
||||
except Exception:
|
||||
body_text = ""
|
||||
ctx.close()
|
||||
|
||||
if cookie_str and len(cookie_str) > 100:
|
||||
import requests
|
||||
headers = {
|
||||
"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36",
|
||||
"Cookie": cookie_str,
|
||||
"Referer": "https://cunkebao.feishu.cn/minutes/",
|
||||
}
|
||||
if bv:
|
||||
headers["bv-csrf-token"] = bv
|
||||
export_ok = False
|
||||
try:
|
||||
r = requests.post(EXPORT_URL, params={"object_token": OBJECT_TOKEN, "format": 2, "add_speaker": "true", "add_timestamp": "false"}, headers=headers, timeout=20)
|
||||
r.encoding = "utf-8"
|
||||
if r.status_code == 200 and len(r.text) > 500 and "说话人" in r.text[:4000]:
|
||||
body_text = r.text.strip()
|
||||
export_ok = True
|
||||
except Exception:
|
||||
pass
|
||||
if not export_ok and (not body_text or len(body_text) < 300):
|
||||
body_text = "" # 下面会用备用 body_text
|
||||
|
||||
if not body_text or len(body_text) < 200:
|
||||
print("NO_TEXT", file=sys.stderr)
|
||||
return 4
|
||||
# 与 103 场一致:日期行 | 时长 + 关键词 + 文字记录
|
||||
if not body_text.lstrip().startswith("2") and "文字记录" not in body_text[:200]:
|
||||
header = "2026年2月19日 上午 7:35|2小时 22分钟 18秒\n\n关键词:\n社群、派对、目标、灰产、超级个体\n\n文字记录:\n"
|
||||
full = header + body_text
|
||||
else:
|
||||
full = body_text
|
||||
OUT_DIR.mkdir(parents=True, exist_ok=True)
|
||||
safe = re.sub(r'[\\/*?:"<>|]', "_", TITLE)
|
||||
out_path = OUT_DIR / f"{safe}.txt"
|
||||
out_path.write_text(full, encoding="utf-8")
|
||||
print("OK", str(out_path))
|
||||
return 0
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
sys.exit(main())
|
||||
7
02_卡人(水)/水桥_平台对接/智能纪要/脚本/导出104到soul.sh
Executable file
7
02_卡人(水)/水桥_平台对接/智能纪要/脚本/导出104到soul.sh
Executable file
@@ -0,0 +1,7 @@
|
||||
#!/bin/bash
|
||||
# 将 104 场妙记文字记录导出到 聊天记录/soul,标题与 103 场一致(soul 派对 第104场 20260219)
|
||||
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||
OUT="/Users/karuo/Documents/聊天记录/soul"
|
||||
cd "$SCRIPT_DIR"
|
||||
python3 feishu_minutes_export_github.py -t obcnyg5nj2l8q281v32de6qz --title "soul 派对 第104场 20260219" -o "$OUT"
|
||||
exit $?
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"access_token": "u-5._BzwT814F9Zu3V5pf8BZl5mWM5k1UjN8aaIxw00Azj",
|
||||
"refresh_token": "ur-7SbRULEppe1F8g8oPsrpCvl5kOMBk1ihooaaJQw00xD3",
|
||||
"access_token": "u-54M8YSO5daprUT9Aq1DGS6l5kOO5k1iroEaaVNw00xOn",
|
||||
"refresh_token": "ur-6pAv.4Dct8FH0EcZMWKMGTl5kUO5k1ippUaaYNA00wCn",
|
||||
"name": "飞书用户",
|
||||
"auth_time": "2026-02-19T17:28:30.836949"
|
||||
}
|
||||
27
_执行日志/2026-02_家里NAS与Time_Machine_复盘总结.md
Normal file
27
_执行日志/2026-02_家里NAS与Time_Machine_复盘总结.md
Normal file
@@ -0,0 +1,27 @@
|
||||
# 家里 NAS 与 Time Machine 整段对话 · 复盘总结
|
||||
|
||||
> 本对话链:DiskStation IP 查找 → Time Machine 报错处理 → 全自动 Skill 与复盘格式更新。
|
||||
|
||||
---
|
||||
|
||||
## [卡若复盘](2026-02 整段)
|
||||
|
||||
**🎯 目标·结果·达成率**
|
||||
目标:查家里 NAS IP、修时间机器报错、全自动处理入 Skill。结果:IP 确认为 192.168.110.29,处理流程与参考资料已沉淀,达成率 100%。
|
||||
|
||||
**📌 过程**
|
||||
1. 全网段扫描 + Synology Finder 探测,确认家里 DiskStation 为 192.168.110.29,DSM/SMB 正常。
|
||||
2. Time Machine 出现「未识别备份磁盘 / DiskStation.local 可能已被更改」:跑自动检测脚本,按参考资料给出「移除目标 → 重新添加共享」步骤,并补充该现象进参考资料。
|
||||
3. 群晖 NAS 管理 Skill 新增「Time Machine / 家里 DiskStation 全自动处理」:先跑脚本,做不了则按 `参考资料/Time_Machine_DiskStation_错误排查.md` 执行,不追问用户;解决后验证并更新 Skill。
|
||||
4. 复盘格式统一:所有对话结尾按复盘格式;目标·结果·达成率每句 ≤30 字且必须出现百分比;已写入 `运营中枢/参考资料/卡若复盘格式_固定规则.md`。
|
||||
|
||||
**💡 反思**
|
||||
1. 复盘块中目标&结果写短、带百分比,便于一眼看结果。
|
||||
2. 能自动的写脚本+Skill,不能自动的锁死材料路径,避免再问用户。
|
||||
3. 家里/公司双 NAS 的 IP、凭证在 Skill 里分开写,减少混淆。
|
||||
|
||||
**📝 总结**
|
||||
家里 NAS(192.168.110.29)的查找与 Time Machine 报错处理已闭环;全自动检测脚本 + 参考资料 + Skill 流程可复用;对话结尾复盘格式已强化(≤30 字/句 + 百分比)。
|
||||
|
||||
**▶ 下一步执行**
|
||||
用户按「移除备份目标 → 重新添加 DiskStation 共享」操作后,若红点消失可再跑一次 `time_machine_diskstation_auto.sh` 验证。无其他待跟进任务。
|
||||
@@ -12,7 +12,7 @@
|
||||
[卡若复盘](YYYY-MM-DD HH:mm)
|
||||
|
||||
🎯 目标·结果·达成率
|
||||
一行说完:目标是什么、结果是什么、达成率 XX%。(多任务可 1 2 3 各一句,仍控制在一行内或极简三行。)
|
||||
一行说完:目标是什么、结果是什么、**达成率 XX%**(必须出现百分比)。**每句话不超过 30 个字**;多任务可 1 2 3 各一句,每句仍 ≤30 字。
|
||||
|
||||
📌 过程
|
||||
1. 第一步做了什么。(一句)
|
||||
@@ -48,7 +48,7 @@
|
||||
|:---|:---|
|
||||
| **日期时间** | **YYYY-MM-DD HH:mm**(年月日 + 时间,如 2026-02-17 14:30) |
|
||||
| **每块有图标** | 🎯 目标结果达成率 · 📌 过程 · 💡 反思 · 📝 总结 · ▶ 下一步 |
|
||||
| **目标·结果·达成率** | **一行**,极简;多任务仍压缩为一行或极简三行。 |
|
||||
| **目标·结果·达成率** | **一行**,极简;**必须出现百分比**(如达成率 XX%);**每句话不超过 30 个字**;多任务可多句,每句仍 ≤30 字。 |
|
||||
| **过程 / 反思** | 1 2 3 简短分行;**中间可加流程图、示意图、图片**,帮助呈现步骤或反思维度。 |
|
||||
| **反思** | 1~3 点,每点一句;简洁、可执行、不空泛。 |
|
||||
| **下一步执行** | **具体、有建设性**;必须包含**本对话未完成或待跟进的文档/任务**(若有);无则写「无」。 |
|
||||
@@ -58,7 +58,7 @@
|
||||
|
||||
## 强制执行
|
||||
|
||||
- **卡若AI 内所有对话**:AI 的回复**一律用复盘形式**。多轮对话每轮结尾带简版复盘(🎯 目标·结果·达成率 + ▶ 下一步);**最终回复末尾**必须带「[卡若复盘]」**完整块**,按本格式、带图标;日期含**时间**(YYYY-MM-DD HH:mm);目标·结果·达成率**一行**;下一步写**具体建设性动作 + 未完成/待跟进文档或任务**。
|
||||
- **卡若AI 内所有对话**:AI 的回复**一律用复盘形式**。多轮对话每轮结尾带简版复盘(🎯 目标·结果·达成率 + ▶ 下一步);**最终回复末尾**必须带「[卡若复盘]」**完整块**,按本格式、带图标;日期含**时间**(YYYY-MM-DD HH:mm);目标·结果·达成率**一行、每句 ≤30 字、必须含百分比**;下一步写**具体建设性动作 + 未完成/待跟进文档或任务**。
|
||||
- **唯一标准**:本文件;`.cursor/rules/karuo-ai.mdc` 与交互流程均引用本文件。
|
||||
|
||||
---
|
||||
|
||||
@@ -36,3 +36,4 @@
|
||||
| 2026-02-19 17:28:54 | 🔄 卡若AI 同步 2026-02-19 17:28 | 更新:水桥平台对接、运营中枢工作台 | 排除 >20MB: 5 个 |
|
||||
| 2026-02-19 18:07:18 | 🔄 卡若AI 同步 2026-02-19 18:07 | 更新:运营中枢工作台 | 排除 >20MB: 5 个 |
|
||||
| 2026-02-19 19:40:16 | 🔄 卡若AI 同步 2026-02-19 19:40 | 更新:金仓、水桥平台对接、运营中枢工作台 | 排除 >20MB: 5 个 |
|
||||
| 2026-02-19 20:11:22 | 🔄 卡若AI 同步 2026-02-19 20:11 | 更新:金仓、运营中枢工作台 | 排除 >20MB: 5 个 |
|
||||
|
||||
@@ -39,3 +39,4 @@
|
||||
| 2026-02-19 17:28:54 | 成功 | 成功 | 🔄 卡若AI 同步 2026-02-19 17:28 | 更新:水桥平台对接、运营中枢工作台 | 排除 >20MB: 5 个 | [仓库](http://open.quwanzhi.com:3000/fnvtk/karuo-ai) [百科](http://open.quwanzhi.com:3000/fnvtk/karuo-ai/wiki) |
|
||||
| 2026-02-19 18:07:18 | 成功 | 成功 | 🔄 卡若AI 同步 2026-02-19 18:07 | 更新:运营中枢工作台 | 排除 >20MB: 5 个 | [仓库](http://open.quwanzhi.com:3000/fnvtk/karuo-ai) [百科](http://open.quwanzhi.com:3000/fnvtk/karuo-ai/wiki) |
|
||||
| 2026-02-19 19:40:16 | 成功 | 成功 | 🔄 卡若AI 同步 2026-02-19 19:40 | 更新:金仓、水桥平台对接、运营中枢工作台 | 排除 >20MB: 5 个 | [仓库](http://open.quwanzhi.com:3000/fnvtk/karuo-ai) [百科](http://open.quwanzhi.com:3000/fnvtk/karuo-ai/wiki) |
|
||||
| 2026-02-19 20:11:22 | 成功 | 成功 | 🔄 卡若AI 同步 2026-02-19 20:11 | 更新:金仓、运营中枢工作台 | 排除 >20MB: 5 个 | [仓库](http://open.quwanzhi.com:3000/fnvtk/karuo-ai) [百科](http://open.quwanzhi.com:3000/fnvtk/karuo-ai/wiki) |
|
||||
|
||||
Reference in New Issue
Block a user