🔄 卡若AI 同步 2026-02-24 05:39 | 更新:水桥平台对接、运营中枢工作台 | 排除 >20MB: 10 个

This commit is contained in:
2026-02-24 05:39:39 +08:00
parent b878cb72ea
commit 3b05f72d16
5 changed files with 97 additions and 5 deletions

View File

@@ -108,6 +108,16 @@ updated: "2026-02-23"
---
## 卡若AI 可接入 MCP 的技能清单(参考)
| 技能 | 成员 | 对应能力 | 可选 MCP 方向 |
|:---|:---|:---|:---|
| F11 量化交易 | 火炬 | 量化策略 | 用 MCP 迭代和优化 |
> 其他技能匹配见对话归档或 MCPfinder 搜索。
---
## 触发词
`MCP``找MCP``连接MCP``MCP搜索``发现MCP``添加MCP``需要MCP``MCP安装``MCP发现``查MCP``装MCP`

View File

@@ -1,31 +1,76 @@
#!/usr/bin/env python3
"""全量拉取所有 IMAP 可见文件夹"""
"""全量拉取所有 IMAP 可见文件夹 · 支持进度写入"""
import json
import sys
import imaplib
import os
from datetime import datetime
from pathlib import Path
from qq_mail_fetch import fetch_emails, list_folders, AUTH_CODE
OUT = Path("/Users/karuo/Documents/卡若Ai的文件夹/报告")
OUT.mkdir(parents=True, exist_ok=True)
PROGRESS_FILE = OUT / "qq_fetch_progress.json"
def safe_name(f):
return f.replace("/", "_").replace(" ", "_").replace("&", "x")[:40]
def count_folder(server, folder):
mb = f'"{folder}"' if " " in folder else folder
try:
typ, data = server.select(mb, readonly=True)
if typ == "OK" and data:
n = int(data[0].decode())
server.close()
return n
except Exception:
pass
return 0
def get_folder_counts(folders):
"""预扫各文件夹邮件数"""
from qq_mail_fetch import IMAP_HOST, IMAP_PORT, EMAIL
server = imaplib.IMAP4_SSL(IMAP_HOST, IMAP_PORT)
server.login(EMAIL, AUTH_CODE)
counts = {f: count_folder(server, f) for f in folders}
server.logout()
return counts
def write_progress(progress):
progress["updated_at"] = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
with open(PROGRESS_FILE, "w", encoding="utf-8") as fp:
json.dump(progress, fp, ensure_ascii=False, indent=2)
def main():
if not AUTH_CODE:
print("无授权码")
return 1
folders = list_folders()
counts = get_folder_counts(folders)
total_emails = sum(counts.values())
start_at = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
all_emails = []
stats = {}
for f in folders:
done_emails = 0
for i, f in enumerate(folders):
try:
emails = fetch_emails(days=365*20, limit=0, all_mail=True, progress=False, folder=f)
stats[f] = len(emails)
for e in emails:
e["_folder"] = f
all_emails.extend(emails)
print(f" {f}: {len(emails)}")
done_emails += len(emails)
elapsed = (datetime.now() - datetime.strptime(start_at, "%Y-%m-%d %H:%M:%S")).total_seconds()
eta_sec = (elapsed / done_emails * (total_emails - done_emails)) if done_emails else 0
progress = {
"total_folders": len(folders),
"done_folders": i + 1,
"total_emails": total_emails,
"done_emails": done_emails,
"pct": round(done_emails / total_emails * 100, 1) if total_emails else 0,
"current_folder": f,
"start_at": start_at,
"eta_minutes": round(eta_sec / 60, 1),
}
write_progress(progress)
print(f" [{i+1}/{len(folders)}] {f}: {len(emails)} | 总进度 {done_emails}/{total_emails} ({progress['pct']}%) ETA {progress['eta_minutes']}min")
except Exception as ex:
print(f" {f}: 失败 {ex}")
stats[f] = 0
@@ -33,6 +78,17 @@ def main():
json.dump(all_emails, fp, ensure_ascii=False, indent=None)
with open(OUT / "qq_folders_stats.json", "w", encoding="utf-8") as fp:
json.dump(stats, fp, ensure_ascii=False, indent=2)
write_progress({
"total_folders": len(folders),
"done_folders": len(folders),
"total_emails": total_emails,
"done_emails": len(all_emails),
"pct": 100,
"status": "completed",
"start_at": start_at,
"finished_at": datetime.now().strftime("%Y-%m-%d %H:%M:%S"),
"eta_minutes": 0,
})
print(f"\n合计: {len(all_emails)}")
return 0

View File

@@ -0,0 +1,24 @@
#!/bin/bash
# 查看 QQ 邮箱全量拉取进度
P="/Users/karuo/Documents/卡若Ai的文件夹/报告/qq_fetch_progress.json"
if [ ! -f "$P" ]; then
echo "进度文件不存在,拉取可能未启动或使用旧版脚本"
exit 1
fi
python3 -c "
import json
from pathlib import Path
p = Path('/Users/karuo/Documents/卡若Ai的文件夹/报告/qq_fetch_progress.json')
d = json.load(open(p, encoding='utf-8'))
print('=== QQ 邮箱全量拉取进度 ===')
print(f\"进度: {d.get('done_emails',0)} / {d.get('total_emails',0)} 封 ({d.get('pct',0)}%)\")
print(f\"文件夹: {d.get('done_folders',0)} / {d.get('total_folders',0)}\")
print(f\"当前: {d.get('current_folder','-')}\")
print(f\"开始: {d.get('start_at','-')}\")
print(f\"更新: {d.get('updated_at','-')}\")
eta = d.get('eta_minutes',0)
if eta > 0:
print(f\"预计剩余: {eta} 分钟\")
if d.get('status')=='completed':
print(f\"完成: {d.get('finished_at','-')}\")
"

View File

@@ -119,3 +119,4 @@
| 2026-02-23 21:19:17 | 🔄 卡若AI 同步 2026-02-23 21:19 | 更新:卡木、运营中枢工作台 | 排除 >20MB: 10 个 |
| 2026-02-23 21:31:11 | 🔄 卡若AI 同步 2026-02-23 21:31 | 更新:卡木、运营中枢工作台 | 排除 >20MB: 10 个 |
| 2026-02-23 23:22:09 | 🔄 卡若AI 同步 2026-02-23 23:22 | 更新:总索引与入口、水桥平台对接、卡土、运营中枢工作台 | 排除 >20MB: 10 个 |
| 2026-02-23 23:41:16 | 🔄 卡若AI 同步 2026-02-23 23:41 | 更新:水桥平台对接、运营中枢工作台 | 排除 >20MB: 10 个 |

View File

@@ -122,3 +122,4 @@
| 2026-02-23 21:19:17 | 成功 | 成功 | 🔄 卡若AI 同步 2026-02-23 21:19 | 更新:卡木、运营中枢工作台 | 排除 >20MB: 10 个 | [仓库](http://open.quwanzhi.com:3000/fnvtk/karuo-ai) [百科](http://open.quwanzhi.com:3000/fnvtk/karuo-ai/wiki) |
| 2026-02-23 21:31:11 | 成功 | 成功 | 🔄 卡若AI 同步 2026-02-23 21:31 | 更新:卡木、运营中枢工作台 | 排除 >20MB: 10 个 | [仓库](http://open.quwanzhi.com:3000/fnvtk/karuo-ai) [百科](http://open.quwanzhi.com:3000/fnvtk/karuo-ai/wiki) |
| 2026-02-23 23:22:09 | 成功 | 成功 | 🔄 卡若AI 同步 2026-02-23 23:22 | 更新:总索引与入口、水桥平台对接、卡土、运营中枢工作台 | 排除 >20MB: 10 个 | [仓库](http://open.quwanzhi.com:3000/fnvtk/karuo-ai) [百科](http://open.quwanzhi.com:3000/fnvtk/karuo-ai/wiki) |
| 2026-02-23 23:41:16 | 成功 | 成功 | 🔄 卡若AI 同步 2026-02-23 23:41 | 更新:水桥平台对接、运营中枢工作台 | 排除 >20MB: 10 个 | [仓库](http://open.quwanzhi.com:3000/fnvtk/karuo-ai) [百科](http://open.quwanzhi.com:3000/fnvtk/karuo-ai/wiki) |