🔄 卡若AI 同步 2026-02-24 05:39 | 更新:水桥平台对接、运营中枢工作台 | 排除 >20MB: 10 个
This commit is contained in:
@@ -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`
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
24
02_卡人(水)/水桥_平台对接/QQ邮箱拉取/qq_fetch_progress.sh
Normal file
24
02_卡人(水)/水桥_平台对接/QQ邮箱拉取/qq_fetch_progress.sh
Normal 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','-')}\")
|
||||
"
|
||||
@@ -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 个 |
|
||||
|
||||
@@ -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) |
|
||||
|
||||
Reference in New Issue
Block a user