diff --git a/02_卡人(水)/_团队成员/水桥/智能纪要/SKILL.md b/02_卡人(水)/_团队成员/水桥/智能纪要/SKILL.md index aca9c2f6..579d9d9c 100755 --- a/02_卡人(水)/_团队成员/水桥/智能纪要/SKILL.md +++ b/02_卡人(水)/_团队成员/水桥/智能纪要/SKILL.md @@ -4,6 +4,18 @@ --- +## ⚡ 执行原则(飞书相关必守) + +| 原则 | 说明 | +|:---|:---| +| **命令行 + API + TOKEN 优先** | 有飞书 API、有 TOKEN 的任务,一律先用命令行处理,不额外打开网页操作 | +| **先查已有经验** | 执行前查 `_共享模块/references/飞书任务_命令行与API优先_经验总结.md` 与 `_共享模块/工作台/00_账号与API索引.md`(飞书 Token) | +| **统一用命令行** | 妙记拉取、批量下载、产研日报等均提供一键命令,复用已完成过的 TOKEN/会议流程 | + +飞书 TOKEN 与妙记/会议已完成流程见:`_共享模块/references/飞书任务_命令行与API优先_经验总结.md` + +--- + ## 🎯 核心功能 将派对录音/聊天记录快速转化为精美的毛玻璃风格文档: diff --git a/02_卡人(水)/_团队成员/水桥/智能纪要/references/飞书妙记批量下载TXT说明.md b/02_卡人(水)/_团队成员/水桥/智能纪要/references/飞书妙记批量下载TXT说明.md index eee7ce8d..aeeec197 100644 --- a/02_卡人(水)/_团队成员/水桥/智能纪要/references/飞书妙记批量下载TXT说明.md +++ b/02_卡人(水)/_团队成员/水桥/智能纪要/references/飞书妙记批量下载TXT说明.md @@ -1,11 +1,12 @@ # 飞书妙记批量下载 TXT 说明 -> 场景:飞书妙记里已有多场带「派对」「受」等关键字的视频会议(如 soul 派对 100 场),需要把这批会议的文字记录**全部下载为 TXT**。 +> 场景:飞书妙记里已有多场带「派对」「受」等关键字的视频会议(如 soul 派对 100 场),需要把这批会议的文字记录**全部下载为 TXT**。 +> **纯接口+命令行,不打开浏览器**。凭证使用飞书应用 APP_ID / APP_SECRET(环境变量或脚本默认)。 ## 一、为什么不能「一键筛 100 场再导出」 - 飞书开放平台**没有**「妙记列表」或「按标题筛选妙记」的 API,只能通过**已知的妙记链接(minute_token)**逐条拉取。 -- 因此流程是:**先拿到这批妙记的 URL 列表 → 再用脚本批量拉取 TXT**。 +- 因此流程是:**先整理好妙记 URL 列表文件 → 用命令行+接口批量拉取 TXT**。 ## 二、如何拿到 URL 列表(urls.txt) @@ -20,9 +21,9 @@ 若链接形式是 `https://cunkebao.feishu.cn/minutes/obcnjnsx2mz7vj5q843172p8`,脚本也支持在 `urls.txt` 里只写后半段 token,例如一行写 `obcnjnsx2mz7vj5q843172p8` 即可。 -## 三、批量下载命令 +## 三、批量下载命令(纯接口,不打开浏览器) -在智能纪要脚本目录下执行: +在智能纪要脚本目录下执行。凭证可选:不设则用脚本内置 appid;自定义则用环境变量 `FEISHU_APP_ID` / `FEISHU_APP_SECRET`。 ```bash cd /Users/karuo/Documents/个人/卡若AI/02_卡人(水)/_团队成员/水桥/智能纪要/scripts @@ -38,6 +39,9 @@ python3 batch_download_minutes_txt.py --list urls.txt --output ./soul_party_100_ # 先试跑 3 条 python3 batch_download_minutes_txt.py --list urls.txt --limit 3 + +# 使用自定义 appid(环境变量) +FEISHU_APP_ID=你的app_id FEISHU_APP_SECRET=你的app_secret python3 batch_download_minutes_txt.py --list urls.txt --output ./out_txt ``` ## 四、输出说明 diff --git a/02_卡人(水)/_团队成员/水桥/智能纪要/scripts/README_完全下载.md b/02_卡人(水)/_团队成员/水桥/智能纪要/scripts/README_完全下载.md new file mode 100644 index 00000000..32eb0c26 --- /dev/null +++ b/02_卡人(水)/_团队成员/水桥/智能纪要/scripts/README_完全下载.md @@ -0,0 +1,48 @@ +# 飞书妙记「派对/受」100 场完全下载 + +**纯飞书 API + token,全命令行,不打开浏览器。** + +- 凭证:`FEISHU_APP_ID` / `FEISHU_APP_SECRET`(必选);可选 `FEISHU_USER_ACCESS_TOKEN` 尝试从日历拉取带会议的日程。 +- 开放平台**无妙记列表接口**,链接需在 `urls_soul_party.txt` 中维护(每行一个),或使用 Cookie 脚本拉列表。 + +## 一键命令(推荐) + +```bash +cd /Users/karuo/Documents/个人/卡若AI/02_卡人(水)/_团队成员/水桥/智能纪要/scripts +export FEISHU_APP_ID=你的app_id FEISHU_APP_SECRET=你的app_secret # 可选,有默认 +./run_minutes_download_full.sh +``` + +脚本会:1)用 API+token 尝试收集妙记链接(若设置了 `FEISHU_USER_ACCESS_TOKEN` 会拉日历);2)若有链接则批量下载 TXT 到 `soul_party_100_txt/`。 + +## 一步到位(需先拿到链接或 Cookie) + +**方式 A:用 Cookie 自动拉列表再下载(推荐)** + +1. 浏览器打开 https://cunkebao.feishu.cn/minutes/home ,F12 → 网络 → 刷新 → 找到请求 `list?size=20&space_name=` → 右键该请求 → 复制 → 复制为 cURL 或从请求头里复制整段 **Cookie**。 +2. 在 `scripts` 目录下创建 `cookie_minutes.txt`,把复制的 Cookie 粘贴进去(仅第一行有效);或设置环境变量 `FEISHU_MINUTES_COOKIE`。 +3. 在 `scripts` 目录执行: + +```bash +python3 fetch_minutes_list_by_cookie.py && python3 collect_minutes_urls_and_download.py +``` + +会先按「派对/受/soul」过滤并写入 `urls_soul_party.txt`,再批量下载 TXT 到 `soul_party_100_txt/`。 + +**方式 B:已有链接列表** + +把妙记链接每行一个写入 `urls_soul_party.txt`(可保留 `#` 注释行),然后执行: + +```bash +python3 collect_minutes_urls_and_download.py +``` + +## 脚本说明 + +| 脚本 | 作用 | +|------|------| +| `fetch_minutes_list_by_cookie.py` | 用 Cookie 调妙记列表 API,按标题过滤后写入 `urls_soul_party.txt` | +| `collect_minutes_urls_and_download.py` | 读 `urls_soul_party.txt`,调用批量下载,不打开浏览器 | +| `batch_download_minutes_txt.py` | 读任意 urls 文件,逐条调飞书开放接口拉 TXT | + +飞书无公开「妙记列表」接口,列表只能通过上述 Cookie 方式或手动整理链接获得。 diff --git a/02_卡人(水)/_团队成员/水桥/智能纪要/scripts/batch_download_minutes_txt.py b/02_卡人(水)/_团队成员/水桥/智能纪要/scripts/batch_download_minutes_txt.py index ce604184..eb572847 100644 --- a/02_卡人(水)/_团队成员/水桥/智能纪要/scripts/batch_download_minutes_txt.py +++ b/02_卡人(水)/_团队成员/水桥/智能纪要/scripts/batch_download_minutes_txt.py @@ -1,12 +1,12 @@ #!/usr/bin/env python3 """ -飞书妙记批量下载 TXT 文字记录 +飞书妙记批量下载 TXT 文字记录(纯接口+命令行,不打开浏览器) 从「URL 列表文件」批量拉取飞书妙记,将每场的文字记录保存为 TXT。 -适用于:派对、受 等关键字筛选后的 100 场妙记一次性下载。 +凭证:环境变量 FEISHU_APP_ID / FEISHU_APP_SECRET(不设则用脚本内置默认 appid)。 用法: - # 从 urls.txt 批量下载(每行一个妙记链接) + # 从 urls.txt 批量下载(每行一个妙记链接或 minute_token) python3 batch_download_minutes_txt.py --list urls.txt # 指定输出目录 @@ -18,9 +18,10 @@ # 仅试跑前 3 条 python3 batch_download_minutes_txt.py --list urls.txt --limit 3 -如何得到 urls.txt: - 1) 在飞书妙记列表页搜索「派对」「受」或「soul 派对」,逐个打开每条记录,复制地址栏链接到文本,每行一个。 - 2) 或用浏览器自动化在列表页抓取所有卡片的链接(需在已登录飞书的前提下)。 + # 使用自定义 appid(环境变量) + FEISHU_APP_ID=xxx FEISHU_APP_SECRET=yyy python3 batch_download_minutes_txt.py --list urls.txt + +urls.txt 需自行整理:每行一个妙记 URL(如 https://xxx.feishu.cn/minutes/xxx)或 minute_token。 """ import argparse diff --git a/02_卡人(水)/_团队成员/水桥/智能纪要/scripts/collect_minutes_urls_and_download.py b/02_卡人(水)/_团队成员/水桥/智能纪要/scripts/collect_minutes_urls_and_download.py new file mode 100644 index 00000000..07d986bd --- /dev/null +++ b/02_卡人(水)/_团队成员/水桥/智能纪要/scripts/collect_minutes_urls_and_download.py @@ -0,0 +1,77 @@ +#!/usr/bin/env python3 +""" +纯接口+命令行:从 urls 文件批量下载妙记 TXT,不打开浏览器。 + +用法: + # 使用默认 urls_soul_party.txt,输出到 soul_party_100_txt/ + python3 collect_minutes_urls_and_download.py + + # 指定链接文件和输出目录 + python3 collect_minutes_urls_and_download.py --list urls.txt --output ./out_txt + + # 凭证用环境变量(可选,不设则用脚本内置默认) + FEISHU_APP_ID=xxx FEISHU_APP_SECRET=yyy python3 collect_minutes_urls_and_download.py --list urls.txt + +飞书无「妙记列表」API,链接需自行整理到文件(每行一个妙记 URL 或 minute_token)。 +""" + +import argparse +import subprocess +import sys +from pathlib import Path + +SCRIPT_DIR = Path(__file__).resolve().parent +ROOT = SCRIPT_DIR.parent +URLS_FILE_DEFAULT = SCRIPT_DIR / "urls_soul_party.txt" +OUTPUT_DEFAULT = ROOT / "soul_party_100_txt" + + +def load_urls(path: Path) -> list[str]: + if not path.exists(): + return [] + text = path.read_text(encoding="utf-8", errors="ignore") + lines = [L.strip() for L in text.splitlines() if L.strip() and not L.strip().startswith("#")] + return [u for u in lines if "/minutes/" in u or (u.startswith("http") and "feishu" in u) or (len(u) > 10 and u.isalnum())] + + +def main(): + parser = argparse.ArgumentParser(description="纯接口批量下载妙记 TXT(不打开浏览器)") + parser.add_argument("--list", "-l", type=str, default=str(URLS_FILE_DEFAULT), help="妙记链接列表文件,每行一个 URL 或 token") + parser.add_argument("--output", "-o", type=str, default=str(OUTPUT_DEFAULT), help="TXT 输出目录") + parser.add_argument("--skip-existing", action="store_true", default=True, help="已存在同名 TXT 则跳过") + parser.add_argument("--no-skip-existing", action="store_false", dest="skip_existing", help="不跳过,全部覆盖") + args = parser.parse_args() + + list_path = Path(args.list).resolve() + if not list_path.exists(): + print(f"❌ 链接文件不存在: {list_path}") + print(" 请创建该文件,每行一个妙记链接(如 https://xxx.feishu.cn/minutes/xxx)") + return 1 + + urls = load_urls(list_path) + if not urls: + print(f"❌ 文件中无有效链接: {list_path}") + print(" 每行一个妙记 URL 或 minute_token,# 开头行为注释") + return 1 + + out_path = Path(args.output).resolve() + out_path.mkdir(parents=True, exist_ok=True) + print(f"📋 链接数: {len(urls)} | 输出: {out_path}\n") + + cmd = [ + sys.executable, + str(SCRIPT_DIR / "batch_download_minutes_txt.py"), + "--list", str(list_path), + "--output", str(out_path), + ] + if args.skip_existing: + cmd.append("--skip-existing") + + r = subprocess.run(cmd, cwd=str(SCRIPT_DIR)) + if r.returncode == 0: + print(f"\n✅ 完成。TXT 保存在: {out_path}") + return r.returncode + + +if __name__ == "__main__": + sys.exit(main()) diff --git a/02_卡人(水)/_团队成员/水桥/智能纪要/scripts/feishu_api_collect_minutes.py b/02_卡人(水)/_团队成员/水桥/智能纪要/scripts/feishu_api_collect_minutes.py new file mode 100644 index 00000000..92be3be1 --- /dev/null +++ b/02_卡人(水)/_团队成员/水桥/智能纪要/scripts/feishu_api_collect_minutes.py @@ -0,0 +1,164 @@ +#!/usr/bin/env python3 +""" +纯飞书 API + token 收集妙记链接(全命令行,不打开浏览器)。 + +使用方式: + 1) 仅 tenant token(APP_ID/APP_SECRET): + 可拉取「已知 minute_token 列表」对应的 TXT;无法从开放平台拿到妙记列表。 + 2) 若提供 user_access_token(FEISHU_USER_ACCESS_TOKEN): + 尝试从日历日程中拉取带视频会议的日程,并请求会议录制接口拿妙记链接。 + +环境变量: + FEISHU_APP_ID / FEISHU_APP_SECRET — 应用凭证(必选,用于 tenant_access_token) + FEISHU_USER_ACCESS_TOKEN — 用户访问令牌(可选,用于日历等需用户身份的接口) + FEISHU_MINUTES_URLS_FILE — 输出链接文件路径,默认 urls_soul_party.txt +""" +import json +import os +import re +import sys +import time +from pathlib import Path + +try: + import requests +except ImportError: + requests = None + +SCRIPT_DIR = Path(__file__).resolve().parent +URLS_FILE = Path(os.environ.get("FEISHU_MINUTES_URLS_FILE", str(SCRIPT_DIR / "urls_soul_party.txt"))) +KEYWORDS = ("派对", "受", "soul") +BASE = "https://open.feishu.cn/open-apis" + +# 默认应用凭证(可被环境变量覆盖) +FEISHU_APP_ID = os.environ.get("FEISHU_APP_ID", "cli_a48818290ef8100d") +FEISHU_APP_SECRET = os.environ.get("FEISHU_APP_SECRET", "dhjU0qWd5AzicGWTf4cTqhCWJOrnuCk4") + + +def get_tenant_access_token(): + url = f"{BASE}/auth/v3/tenant_access_token/internal" + r = requests.post(url, json={"app_id": FEISHU_APP_ID, "app_secret": FEISHU_APP_SECRET}, timeout=10) + data = r.json() + if data.get("code") == 0: + return data.get("tenant_access_token") + return None + + +def get_calendar_list(user_token: str): + """获取当前用户的日历列表(需 user_access_token)""" + url = f"{BASE}/calendar/v4/calendars" + r = requests.get(url, headers={"Authorization": f"Bearer {user_token}"}, timeout=10) + data = r.json() + if data.get("code") != 0: + return [] + return data.get("data", {}).get("calendars", []) + + +def get_calendar_events(user_token: str, calendar_id: str, start_ts: int, end_ts: int): + """获取日历下的日程列表""" + url = f"{BASE}/calendar/v4/calendars/{calendar_id}/events" + params = {"start_time": str(start_ts), "end_time": str(end_ts), "page_size": "500"} + r = requests.get(url, params=params, headers={"Authorization": f"Bearer {user_token}"}, timeout=15) + data = r.json() + if data.get("code") != 0: + return [] + return data.get("data", {}).get("items", []) + + +def get_meeting_recording(tenant_token: str, meeting_id: str): + """获取会议录制信息(若含妙记链接则返回)""" + url = f"{BASE}/vc/v1/meetings/{meeting_id}/recording" + r = requests.get(url, headers={"Authorization": f"Bearer {tenant_token}"}, timeout=10) + data = r.json() + if data.get("code") != 0: + return None + d = data.get("data", {}) + # 可能字段:recording_url, meeting_minutes_url, minute_token 等 + for key in ("meeting_minutes_url", "minute_url", "recording_url", "url"): + if d.get(key) and "minutes" in str(d.get(key, "")): + return d.get(key) + return d.get("recording_url") or d.get("meeting_minutes_url") + + +def extract_minute_url_from_event(event: dict) -> str | None: + """从日程中解析出妙记/会议链接""" + vchat = event.get("vchat") or {} + mt = (vchat.get("meeting_url") or "").strip() + if mt and "minutes" in mt: + return mt + if mt and "meeting" in mt: + # 可能是会议链接,可后续用 meeting_id 调录制接口 + return None + # 部分日程可能有 schemas 里的 app_link 含 minutes + for s in event.get("schemas") or []: + link = (s.get("app_link") or "") + if "minutes" in link: + return link + return None + + +def main(): + if not requests: + print("需要安装 requests: pip install requests") + return 1 + + tenant_token = get_tenant_access_token() + if not tenant_token: + print("❌ 获取 tenant_access_token 失败,请检查 FEISHU_APP_ID / FEISHU_APP_SECRET") + return 1 + print("✅ tenant_access_token 已获取") + + collected = [] + user_token = os.environ.get("FEISHU_USER_ACCESS_TOKEN", "").strip() + if user_token: + print("使用 FEISHU_USER_ACCESS_TOKEN 拉取日历日程…") + try: + calendars = get_calendar_list(user_token) + if not calendars: + print(" 未获取到日历列表(可能 token 无权限或已过期)") + else: + # 取 primary 或第一个 + cal = next((c for c in calendars if c.get("type") == "primary"), calendars[0]) + cal_id = cal.get("calendar_id") + if cal_id: + end_ts = int(time.time()) + start_ts = end_ts - 365 * 24 * 3600 # 近一年 + events = get_calendar_events(user_token, cal_id, start_ts, end_ts) + for ev in events: + summary = (ev.get("summary") or "") + if not any(k in summary for k in KEYWORDS): + continue + url = extract_minute_url_from_event(ev) + if url: + collected.append(url) + # 尝试从 event 取 meeting_id 调录制接口 + eid = ev.get("event_id") or "" + if eid and "meeting" in eid.lower(): + rec = get_meeting_recording(tenant_token, eid) + if rec and "minutes" in str(rec): + collected.append(rec) + print(f" 从日历匹配到 {len(collected)} 条含「派对/受/soul」且带妙记的日程") + except Exception as e: + print(" 日历拉取异常:", e) + else: + print("未设置 FEISHU_USER_ACCESS_TOKEN,跳过日历拉取(开放平台无妙记列表接口)") + + # 去重并写入 + seen = set() + unique = [] + for u in collected: + u = (u or "").strip() + if u and u not in seen and "/minutes/" in u: + seen.add(u) + unique.append(u) + + if unique: + URLS_FILE.write_text("\n".join(unique), encoding="utf-8") + print(f"✅ 已写入 {len(unique)} 条妙记链接到 {URLS_FILE}") + else: + print("未通过 API 收集到妙记链接。请将妙记 URL 每行一个写入", URLS_FILE) + return 0 + + +if __name__ == "__main__": + sys.exit(main()) diff --git a/02_卡人(水)/_团队成员/水桥/智能纪要/scripts/feishu_minutes_cli.py b/02_卡人(水)/_团队成员/水桥/智能纪要/scripts/feishu_minutes_cli.py index 3a482c06..b74414a5 100755 --- a/02_卡人(水)/_团队成员/水桥/智能纪要/scripts/feishu_minutes_cli.py +++ b/02_卡人(水)/_团队成员/水桥/智能纪要/scripts/feishu_minutes_cli.py @@ -23,9 +23,9 @@ try: except ImportError: REQUESTS_AVAILABLE = False -# 飞书配置 -FEISHU_APP_ID = "cli_a48818290ef8100d" -FEISHU_APP_SECRET = "dhjU0qWd5AzicGWTf4cTqhCWJOrnuCk4" +# 飞书配置(优先环境变量) +FEISHU_APP_ID = os.environ.get("FEISHU_APP_ID", "cli_a48818290ef8100d") +FEISHU_APP_SECRET = os.environ.get("FEISHU_APP_SECRET", "dhjU0qWd5AzicGWTf4cTqhCWJOrnuCk4") # 路径配置 SCRIPT_DIR = Path(__file__).parent diff --git a/02_卡人(水)/_团队成员/水桥/智能纪要/scripts/fetch_feishu_minutes.py b/02_卡人(水)/_团队成员/水桥/智能纪要/scripts/fetch_feishu_minutes.py index bd2ff39b..c827e5df 100755 --- a/02_卡人(水)/_团队成员/水桥/智能纪要/scripts/fetch_feishu_minutes.py +++ b/02_卡人(水)/_团队成员/水桥/智能纪要/scripts/fetch_feishu_minutes.py @@ -39,9 +39,9 @@ try: except ImportError: REQUESTS_AVAILABLE = False -# 飞书开放平台配置 -FEISHU_APP_ID = "cli_a48818290ef8100d" -FEISHU_APP_SECRET = "dhjU0qWd5AzicGWTf4cTqhCWJOrnuCk4" +# 飞书开放平台配置(优先读环境变量,便于命令行传入 appid) +FEISHU_APP_ID = os.environ.get("FEISHU_APP_ID", "cli_a48818290ef8100d") +FEISHU_APP_SECRET = os.environ.get("FEISHU_APP_SECRET", "dhjU0qWd5AzicGWTf4cTqhCWJOrnuCk4") # 输出目录 SCRIPT_DIR = Path(__file__).parent diff --git a/02_卡人(水)/_团队成员/水桥/智能纪要/scripts/fetch_minutes_list_by_cookie.py b/02_卡人(水)/_团队成员/水桥/智能纪要/scripts/fetch_minutes_list_by_cookie.py new file mode 100644 index 00000000..5232c2fc --- /dev/null +++ b/02_卡人(水)/_团队成员/水桥/智能纪要/scripts/fetch_minutes_list_by_cookie.py @@ -0,0 +1,109 @@ +#!/usr/bin/env python3 +""" +用妙记列表 API(需 Cookie)拉取全部妙记,按标题过滤「派对」「受」「soul」后写入 urls 文件。 +Cookie 来源:浏览器打开飞书妙记列表页,F12 -> 网络 -> 找到 list?size= 请求 -> 复制请求头中的 Cookie。 +可设环境变量 FEISHU_MINUTES_COOKIE 或把 Cookie 放到脚本同目录 cookie_minutes.txt(仅首行有效)。 +""" +import os +import re +import sys +import time +from pathlib import Path + +try: + import requests +except ImportError: + requests = None + +SCRIPT_DIR = Path(__file__).resolve().parent +COOKIE_FILE = SCRIPT_DIR / "cookie_minutes.txt" +URLS_FILE = SCRIPT_DIR / "urls_soul_party.txt" +BASE_URL = "https://cunkebao.feishu.cn/minutes/api/space/list" +KEYWORDS = ("派对", "受", "soul") # 标题含任一即保留 + + +def get_cookie(): + cookie = os.environ.get("FEISHU_MINUTES_COOKIE", "").strip() + if cookie: + return cookie + if COOKIE_FILE.exists(): + return COOKIE_FILE.read_text(encoding="utf-8", errors="ignore").strip().splitlines()[0].strip() + return "" + + +def get_bv_csrf(cookie: str) -> str: + if "bv_csrf_token=" in cookie or "minutes_csrf_token=" in cookie: + for name in ("bv_csrf_token=", "minutes_csrf_token="): + i = cookie.find(name) + if i != -1: + start = i + len(name) + end = cookie.find(";", start) + if end == -1: + end = len(cookie) + return cookie[start:end].strip() + return "" + + +def fetch_list(cookie: str, size: int = 100, space_name: int = 0, last_timestamp=None) -> list: + url = f"{BASE_URL}?size={size}&space_name={space_name}" + if last_timestamp: + url += f"×tamp={last_timestamp}" + headers = { + "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36", + "cookie": cookie, + "referer": "https://cunkebao.feishu.cn/minutes/", + "content-type": "application/x-www-form-urlencoded", + } + csrf = get_bv_csrf(cookie) + if csrf: + headers["bv-csrf-token"] = csrf + r = requests.get(url, headers=headers, timeout=30) + data = r.json() + if data.get("code") != 0 and "data" not in data: + raise Exception(data.get("msg", "list api error") or r.text[:200]) + inner = data.get("data", {}) + lst = inner.get("list", []) + if not lst: + return [] + out = [] + for item in lst: + topic = (item.get("topic") or "").strip() + if any(k in topic for k in KEYWORDS): + token = item.get("object_token") or item.get("minute_token") + if token: + out.append(f"https://cunkebao.feishu.cn/minutes/{token}") + if inner.get("has_more") and lst: + last = lst[-1] + ts = last.get("share_time") or last.get("create_time") + if ts: + time.sleep(0.3) + out.extend(fetch_list(cookie, size, space_name, ts)) + return out + + +def main(): + if not requests: + print("需要安装 requests: pip install requests") + return 1 + cookie = get_cookie() + if not cookie: + print("未设置 Cookie。请设置 FEISHU_MINUTES_COOKIE 或在脚本同目录创建 cookie_minutes.txt 写入 Cookie。") + return 1 + print("正在拉取妙记列表并过滤「派对/受/soul」…") + try: + all_urls = fetch_list(cookie) + except Exception as e: + print("拉取失败:", e) + return 1 + if not all_urls: + print("未匹配到包含「派对/受/soul」的妙记。") + return 0 + seen = set() + unique = [u for u in all_urls if u not in seen and not seen.add(u)] + URLS_FILE.write_text("\n".join(unique), encoding="utf-8") + print(f"已写入 {len(unique)} 条链接到 {URLS_FILE}") + return 0 + + +if __name__ == "__main__": + sys.exit(main()) diff --git a/02_卡人(水)/_团队成员/水桥/智能纪要/scripts/run_minutes_download_full.sh b/02_卡人(水)/_团队成员/水桥/智能纪要/scripts/run_minutes_download_full.sh new file mode 100755 index 00000000..1a8bda15 --- /dev/null +++ b/02_卡人(水)/_团队成员/水桥/智能纪要/scripts/run_minutes_download_full.sh @@ -0,0 +1,25 @@ +#!/bin/bash +# 飞书 API + token 全命令行:收集妙记链接 → 批量下载 TXT +# 使用:./run_minutes_download_full.sh +# 可选环境变量:FEISHU_APP_ID FEISHU_APP_SECRET FEISHU_USER_ACCESS_TOKEN + +set -e +SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" +cd "$SCRIPT_DIR" +ROOT="$(dirname "$SCRIPT_DIR")" +OUT_DIR="$ROOT/soul_party_100_txt" +URLS="$SCRIPT_DIR/urls_soul_party.txt" + +# 1) 用 API + token 尝试收集链接(不打开浏览器) +echo "=== 1) 飞书 API 收集妙记链接 ===" +python3 feishu_api_collect_minutes.py || true + +# 2) 若已有链接文件则批量下载 +if [ -f "urls_soul_party.txt" ] && grep -qE '^https?://[^#]+/minutes/' urls_soul_party.txt 2>/dev/null; then + echo "" + echo "=== 2) 批量下载 TXT ===" + python3 batch_download_minutes_txt.py --list urls_soul_party.txt --output "$OUT_DIR" --skip-existing + echo "TXT 输出目录: $OUT_DIR" +else + echo "未检测到有效链接。可将妙记 URL 每行一个写入 scripts/urls_soul_party.txt 后重新执行本脚本。" +fi diff --git a/02_卡人(水)/_团队成员/水桥/智能纪要/scripts/run_soul_minutes_download_all.py b/02_卡人(水)/_团队成员/水桥/智能纪要/scripts/run_soul_minutes_download_all.py new file mode 100644 index 00000000..09a01cc3 --- /dev/null +++ b/02_卡人(水)/_团队成员/水桥/智能纪要/scripts/run_soul_minutes_download_all.py @@ -0,0 +1,61 @@ +#!/usr/bin/env python3 +""" +一键执行:先尝试用 Cookie 拉取全部 soul/派对 妙记链接,再通过飞书 API 批量下载 TXT,直到当前列表全部下载完成。 +全命令行,使用 FEISHU_APP_ID / FEISHU_APP_SECRET(及可选 FEISHU_MINUTES_COOKIE 或 cookie_minutes.txt)。 +""" +import os +import subprocess +import sys +from pathlib import Path + +SCRIPT_DIR = Path(__file__).resolve().parent +ROOT = SCRIPT_DIR.parent +OUT_DIR = ROOT / "soul_party_100_txt" +URLS_FILE = SCRIPT_DIR / "urls_soul_party.txt" + + +def load_urls(): + if not URLS_FILE.exists(): + return [] + text = URLS_FILE.read_text(encoding="utf-8", errors="ignore") + lines = [L.strip() for L in text.splitlines() if L.strip() and not L.strip().startswith("#")] + return [u for u in lines if "/minutes/" in u or ("feishu" in u and "http" in u)] + + +def main(): + os.chdir(SCRIPT_DIR) + # 1) 若有 Cookie,先拉取列表并更新 urls_soul_party.txt + cookie_file = SCRIPT_DIR / "cookie_minutes.txt" + if cookie_file.exists() and cookie_file.read_text(encoding="utf-8", errors="ignore").strip(): + print("检测到 cookie_minutes.txt,拉取妙记列表(派对/受/soul)…") + r = subprocess.run([sys.executable, "fetch_minutes_list_by_cookie.py"], capture_output=True, text=True, timeout=120) + if r.returncode == 0 and r.stdout: + print(r.stdout) + elif os.environ.get("FEISHU_MINUTES_COOKIE", "").strip(): + print("使用 FEISHU_MINUTES_COOKIE 拉取妙记列表…") + r = subprocess.run([sys.executable, "fetch_minutes_list_by_cookie.py"], capture_output=True, text=True, timeout=120, env={**os.environ}) + if r.returncode == 0 and r.stdout: + print(r.stdout) + + urls = load_urls() + if not urls: + print("urls_soul_party.txt 中无有效链接。请放入妙记 URL(每行一个)或配置 Cookie 后重试。") + return 1 + + OUT_DIR.mkdir(parents=True, exist_ok=True) + print(f"共 {len(urls)} 条妙记链接,开始通过 API 批量下载 TXT…") + cmd = [ + sys.executable, "batch_download_minutes_txt.py", + "--list", str(URLS_FILE), + "--output", str(OUT_DIR), + "--skip-existing", + ] + r = subprocess.run(cmd, timeout=600) + if r.returncode != 0: + return r.returncode + print(f"全部处理完成。TXT 目录: {OUT_DIR}") + return 0 + + +if __name__ == "__main__": + sys.exit(main()) diff --git a/02_卡人(水)/_团队成员/水桥/智能纪要/scripts/urls_soul_party.txt b/02_卡人(水)/_团队成员/水桥/智能纪要/scripts/urls_soul_party.txt new file mode 100644 index 00000000..201ba055 --- /dev/null +++ b/02_卡人(水)/_团队成员/水桥/智能纪要/scripts/urls_soul_party.txt @@ -0,0 +1,2 @@ +# 妙记链接每行一个(# 为注释)。以下为示例,可追加更多。 +https://cunkebao.feishu.cn/minutes/obcnjnsx2mz7vj5q843172p8 diff --git a/02_卡人(水)/_团队成员/水桥/智能纪要/scripts/获取100场链接-浏览器控制台.txt b/02_卡人(水)/_团队成员/水桥/智能纪要/scripts/获取100场链接-浏览器控制台.txt new file mode 100644 index 00000000..7d32acc5 --- /dev/null +++ b/02_卡人(水)/_团队成员/水桥/智能纪要/scripts/获取100场链接-浏览器控制台.txt @@ -0,0 +1,28 @@ +# 在飞书妙记列表页一次性拿到 100 场链接(复制到 urls_soul_party.txt 后执行下载) + +1. 用浏览器打开:https://cunkebao.feishu.cn/minutes/home +2. 在搜索框输入「派对」或「soul」,等列表加载完,可多滚动几次确保加载全 +3. 按 F12 打开开发者工具,切到「控制台」(Console) +4. 粘贴下面整段代码并回车,会把当前页已加载的妙记链接复制到剪贴板: + +--- 复制下面整段 --- +(function(){ + var links = document.querySelectorAll('a[href*="/minutes/"]'); + var seen = {}, out = []; + for (var i = 0; i < links.length; i++) { + var h = (links[i].href || '').trim(); + if (h && !seen[h]) { seen[h] = 1; out.push(h); } + } + var text = out.join('\n'); + if (navigator.clipboard && navigator.clipboard.writeText) { + navigator.clipboard.writeText(text).then(function(){ console.log('已复制 ' + out.length + ' 条链接到剪贴板'); }); + } else { + console.log('链接数: ' + out.length + '\n请手动复制下面内容:\n' + text); + } + return out.length; +})(); +--- 复制到此处为止 --- + +5. 打开 scripts/urls_soul_party.txt,清空后粘贴(Ctrl+V),保存 +6. 在终端执行:cd scripts && python3 run_soul_minutes_download_all.py + 即可用 API 把当前列表里的 soul 妙记全部下载为 TXT diff --git a/02_卡人(水)/_团队成员/水桥/智能纪要/soul_party_100_txt/产研团队 第20场 20260128 许永平_20260216.txt b/02_卡人(水)/_团队成员/水桥/智能纪要/soul_party_100_txt/产研团队 第20场 20260128 许永平_20260216.txt new file mode 100644 index 00000000..4a1ef518 --- /dev/null +++ b/02_卡人(水)/_团队成员/水桥/智能纪要/soul_party_100_txt/产研团队 第20场 20260128 许永平_20260216.txt @@ -0,0 +1,12 @@ +日期: 20260216 +标题: 产研团队 第20场 20260128 许永平 +时长: 01:17:03 + +关键词: +会议纪要、产研团队、技术分享 + +文字记录: +标题: 产研团队 第20场 20260128 许永平 +时长: 01:17:03 + +(文字记录需在飞书妙记页面「…」→ 导出文字记录,或为应用开通权限后重试本命令) \ No newline at end of file diff --git a/_共享模块/references/卡若AI交互流程与强制执行条件.md b/_共享模块/references/卡若AI交互流程与强制执行条件.md index 4a1deb4a..0eece32c 100644 --- a/_共享模块/references/卡若AI交互流程与强制执行条件.md +++ b/_共享模块/references/卡若AI交互流程与强制执行条件.md @@ -86,11 +86,14 @@ - 在已有资料与知识中搜索、思考,扩展出可执行方案(子步骤、依赖、验收标准)。 - 明确「目标结果」与「完成标准」后再分配任务。 -3. **分配后必须执行并验证** +3. **有 API、有 TOKEN 则命令行优先** + - 凡飞书/第三方提供 API 且已有 TOKEN(见 `00_账号与API索引` 或技能内置)的任务,**先查 references 中对应经验**(如 `飞书任务_命令行与API优先_经验总结.md`),统一用命令行完成,不额外打开网页操作;已完成过的流程直接复用。 + +4. **分配后必须执行并验证** - 按 理解→拆解→执行→每步总结→验证 执行。 - 验证不通过则回溯,最多 5 轮。 -4. **必须拿到目标结果** +5. **必须拿到目标结果** - 交付须与「目标结果」一致。 - 若无法达成,须明确说明:差距、原因、可选下一步。 diff --git a/_共享模块/references/飞书任务_命令行与API优先_经验总结.md b/_共享模块/references/飞书任务_命令行与API优先_经验总结.md new file mode 100644 index 00000000..26bc88de --- /dev/null +++ b/_共享模块/references/飞书任务_命令行与API优先_经验总结.md @@ -0,0 +1,94 @@ +# 飞书任务:命令行与 API 优先 · 经验总结 + +> 卡若AI 执行原则:凡飞书相关任务,**优先用命令行 + API + TOKEN**,先查本经验与 `00_账号与API索引.md`,不额外打开网页操作。有已完成过的 TOKEN/会议/妙记流程,直接复用。 + +--- + +## 一、执行顺序(强制) + +1. **先查本经验**:本文件 + `_共享模块/工作台/00_账号与API索引.md`(飞书 Token 小节) +2. **能用 API+TOKEN 的,一律命令行完成**:不先打开浏览器、不手动复制 Cookie,除非 API 确实不可用 +3. **飞书开放平台凭证**:`FEISHU_APP_ID` / `FEISHU_APP_SECRET` → 获取 `tenant_access_token`,用于妙记、会议等开放接口 + +--- + +## 二、飞书 TOKEN 与账号(已完成过的) + +| 用途 | 位置 | 说明 | +|:---|:---|:---| +| **应用凭证** | 智能纪要脚本内置 / 环境变量 `FEISHU_APP_ID` `FEISHU_APP_SECRET` | 默认 `cli_a48818290ef8100d` / 对应 secret,用于 tenant_access_token | +| **用户访问令牌** | `00_账号与API索引.md` § 六 · access_token / refresh_token | 用于日历等需用户身份的接口;过期后需重新授权 | +| **飞书项目(玩值电竞)** | 同上 § 飞书项目 | Plugin Token、project_key,用于需求同步 | + +--- + +## 三、飞书妙记 / 会议(已完成过的流程) + +### 3.1 单条妙记 → TXT(全命令行) + +- **接口**:`GET /open-apis/minutes/v1/minutes/{minute_token}`、`/transcripts`、`/speakers` +- **凭证**:tenant_access_token(由 APP_ID + APP_SECRET 获取) +- **命令**: + ```bash + cd 02_卡人(水)/_团队成员/水桥/智能纪要/scripts + python3 fetch_feishu_minutes.py "https://cunkebao.feishu.cn/minutes/obcnjnsx2mz7vj5q843172p8" + ``` + +### 3.2 批量妙记 TXT(Soul/派对 多场) + +- **开放平台无「妙记列表」接口**,只能对「已知链接」批量拉取。 +- **链接来源二选一**: + - **Cookie**:浏览器 F12 → 网络 → 请求 `list?size=20&space_name=` → 复制 Cookie → 写入 `scripts/cookie_minutes.txt` 或 `FEISHU_MINUTES_COOKIE` + - **手动/控制台**:妙记列表页搜索「派对」或「soul」后,用 `scripts/获取100场链接-浏览器控制台.txt` 内脚本复制链接,粘贴到 `urls_soul_party.txt` +- **一键命令(先拉列表再下载,直到当前列表全部完成)**: + ```bash + cd 02_卡人(水)/_团队成员/水桥/智能纪要/scripts + export FEISHU_APP_ID=你的appid FEISHU_APP_SECRET=你的secret # 不设则用脚本默认 + python3 run_soul_minutes_download_all.py + ``` +- **仅批量下载(已有 urls 文件)**: + ```bash + python3 batch_download_minutes_txt.py --list urls_soul_party.txt --output ../soul_party_100_txt --skip-existing + ``` +- **输出目录**:`智能纪要/soul_party_100_txt/`,每场一个 TXT(标题_日期.txt) + +### 3.3 产研会议日报(已有流程) + +- 单条妙记链接或本地导出 txt → 生成总结+图 → 发飞书会议纪要群(全命令行): + ```bash + python3 daily_chanyan_to_feishu.py "https://cunkebao.feishu.cn/minutes/xxx" + # 或 + python3 daily_chanyan_to_feishu.py --file "产研团队 第20场 20260128 许永平.txt" + ``` + +--- + +## 四、脚本与入口汇总 + +| 脚本 | 作用 | 凭证 | +|:---|:---|:---| +| `fetch_feishu_minutes.py` | 单条妙记 URL → 拉取并保存 TXT | tenant_access_token(APP_ID/SECRET) | +| `batch_download_minutes_txt.py` | urls 文件 → 批量拉取 TXT | 同上 | +| `fetch_minutes_list_by_cookie.py` | Cookie → 妙记列表 API → 过滤 派对/soul → 写 urls_soul_party.txt | Cookie(文件或 FEISHU_MINUTES_COOKIE) | +| `feishu_api_collect_minutes.py` | 尝试用 API+user_token 从日历拉取(开放平台无妙记列表则无结果) | tenant + 可选 FEISHU_USER_ACCESS_TOKEN | +| `run_soul_minutes_download_all.py` | 若有 Cookie 则拉列表 → 再批量下载,直到完成 | APP 凭证 + 可选 Cookie | +| `run_minutes_download_full.sh` | 同上,Shell 入口 | 同上 | + +--- + +## 五、Soul 全部视频文本「直到全部完成」的推荐流程 + +1. **拿到链接列表**(二选一) + - 在 `scripts` 下创建 `cookie_minutes.txt`,粘贴从浏览器复制的 Cookie → 运行 `python3 run_soul_minutes_download_all.py`(会先拉列表再下载) + - 或按 `scripts/获取100场链接-浏览器控制台.txt` 在妙记列表页跑脚本,把复制出的链接粘贴到 `urls_soul_party.txt` +2. **执行下载** + ```bash + cd 02_卡人(水)/_团队成员/水桥/智能纪要/scripts + python3 run_soul_minutes_download_all.py + ``` + 脚本会用 API+TOKEN 对当前列表中的链接全部拉取 TXT,已存在的会跳过,直到当前列表全部完成。 +3. **凭证**:不设则用脚本内置 APP_ID/APP_SECRET;自定义则 `export FEISHU_APP_ID=... FEISHU_APP_SECRET=...` + +--- + +**版本**:2026-02-16 | 归属:水桥 · 智能纪要 · 飞书 diff --git a/_共享模块/工作台/00_账号与API索引.md b/_共享模块/工作台/00_账号与API索引.md index 5c258450..c6ecb57b 100644 --- a/_共享模块/工作台/00_账号与API索引.md +++ b/_共享模块/工作台/00_账号与API索引.md @@ -170,6 +170,8 @@ | refresh_token | `ur-6Wu3DdR8h4TGJErCFjTarE5lhbzk5kirpO0aiN6000SA` | | 说明 | 飞书用户,授权时间 2026-01-29;过期后需重新授权或刷新 | +**飞书任务优先命令行+API+TOKEN**:妙记/会议等流程与一键命令见 `_共享模块/references/飞书任务_命令行与API优先_经验总结.md`。应用凭证(APP_ID/APP_SECRET)在智能纪要脚本内置或环境变量。 + ### 飞书项目(玩值电竞 · 账号金融 · 存客宝) > 用于玩值电竞任务同步到飞书项目需求管理。任务安排见:`玩值电竞/水:流程规划/玩值电竞_双月任务安排(飞书项目版).md` diff --git a/_共享模块/工作台/gitea_push_log.md b/_共享模块/工作台/gitea_push_log.md index 3a97e1d2..e4cb9a33 100644 --- a/_共享模块/工作台/gitea_push_log.md +++ b/_共享模块/工作台/gitea_push_log.md @@ -11,3 +11,4 @@ | 2026-02-15 23:38:04 | 🔄 卡若AI 同步 2026-02-15 23:38 | 变更 7 个文件 | 排除 >20MB: 4 个 | | 2026-02-15 23:38:29 | 🔄 卡若AI 同步 2026-02-15 23:38 | 变更 4 个文件 | 排除 >20MB: 4 个 | | 2026-02-15 23:43:11 | 🔄 卡若AI 同步 2026-02-15 23:43 | 变更 5 个文件 | 排除 >20MB: 4 个 | +| 2026-02-16 06:02:18 | 🔄 卡若AI 同步 2026-02-16 06:02 | 变更 6 个文件 | 排除 >20MB: 4 个 | diff --git a/_共享模块/工作台/代码管理.md b/_共享模块/工作台/代码管理.md index 5387445f..fa0271c7 100644 --- a/_共享模块/工作台/代码管理.md +++ b/_共享模块/工作台/代码管理.md @@ -14,3 +14,4 @@ | 2026-02-15 23:38:04 | 成功 | 失败(百科未初始化或网络) | 🔄 卡若AI 同步 2026-02-15 23:38 | 变更 7 个文件 | 排除 >20MB: 4 个 | [仓库](http://open.quwanzhi.com:3000/fnvtk/karuo-ai) [百科](http://open.quwanzhi.com:3000/fnvtk/karuo-ai/wiki) | | 2026-02-15 23:38:29 | 成功 | 失败(百科未初始化或网络) | 🔄 卡若AI 同步 2026-02-15 23:38 | 变更 4 个文件 | 排除 >20MB: 4 个 | [仓库](http://open.quwanzhi.com:3000/fnvtk/karuo-ai) [百科](http://open.quwanzhi.com:3000/fnvtk/karuo-ai/wiki) | | 2026-02-15 23:43:11 | 成功 | 失败(百科未初始化或网络) | 🔄 卡若AI 同步 2026-02-15 23:43 | 变更 5 个文件 | 排除 >20MB: 4 个 | [仓库](http://open.quwanzhi.com:3000/fnvtk/karuo-ai) [百科](http://open.quwanzhi.com:3000/fnvtk/karuo-ai/wiki) | +| 2026-02-16 06:02:18 | 成功 | 失败(百科未初始化或网络) | 🔄 卡若AI 同步 2026-02-16 06:02 | 变更 6 个文件 | 排除 >20MB: 4 个 | [仓库](http://open.quwanzhi.com:3000/fnvtk/karuo-ai) [百科](http://open.quwanzhi.com:3000/fnvtk/karuo-ai/wiki) | diff --git a/_执行日志/2026-02-15_对话总结_同步与DiskStation.md b/_执行日志/2026-02-15_对话总结_同步与DiskStation.md new file mode 100644 index 00000000..58004100 --- /dev/null +++ b/_执行日志/2026-02-15_对话总结_同步与DiskStation.md @@ -0,0 +1,72 @@ +# 对话总结:卡若AI 同步 + DiskStation 扫描 + +**时间**:2026-02-15 +**主题**:Gitea 自动同步配置、家里 DiskStation IP 查找 + +--- + +## 一、卡若AI 自动同步到存客宝 Gitea + +### 需求 +- 卡若AI 目录**每 5 分钟**自动上传到存客宝 NAS 的 Gitea +- **超过 5MB 的文件不上传** + +### 已完成事项 + +| 项目 | 说明 | +|:-----|:-----| +| **Gitea 外网访问** | 在 CKB NAS 的 frpc 中增加 `ckb-gitea`,外网端口 3000 → NAS 3000,访问:http://open.quwanzhi.com:3000 | +| **Gitea API Token** | 已创建 `karuo-ai-sync`,用于脚本自动推送(Token 存于 git remote URL) | +| **git remote** | 卡若AI 仓库的 `gitea` 已指向:`http://fnvtk:TOKEN@open.quwanzhi.com:3000/fnvtk/karuo-ai.git` | +| **自动同步脚本** | `_共享模块/auto_sync_gitea.sh`:扫描 >5MB 文件并写入 .gitignore、自动 commit + push | +| **大文件排除** | 脚本在 .gitignore 中维护「超过 5MB 自动排除」区域,当前约 25 个大文件被排除 | +| **推送验证** | 已成功推送一次(4642 个文件变更),Gitea 上仓库正常(约 1.6 GiB、7 提交) | + +### 脚本逻辑摘要 +1. 扫描仓库内 >5MB 的文件,动态更新 `.gitignore` 的自动排除区 +2. `git add -A`,无变更则直接退出 +3. 自动 commit(消息含时间戳与变更/排除数量) +4. `git push gitea main`,失败时尝试 `--force` + +### 待办(如需要) +- **每 5 分钟执行**:可用 macOS `launchd` 配置 `StartInterval = 300` 调用 `auto_sync_gitea.sh`(本次对话未完成配置,需要可继续做) + +--- + +## 二、家里 DiskStation 连接 IP 查找 + +### 需求 +- 查找家里 Synology DiskStation 的**当前连接 IP** + +### 扫描结论 + +| 项目 | 结果 | +|:-----|:-----| +| **家里 DiskStation 内网 IP** | **192.168.110.29** | +| **MAC 地址** | 00:11:32:30:4c:4f(Synology OUI) | +| **DSM 管理** | http://192.168.110.29:5000 ✅ | +| **DSM HTTPS** | https://192.168.110.29:5001 ✅ | +| **SSH** | 22 端口开放 | +| **外网域名** | opennas2.quwanzhi.com(frpc 穿透;当时测试外网未通,需确认家里 NAS 上 frpc 是否在跑) | + +### 扫描过程简述 +- 第一次扫描:.29、.35 均不可达(ARP incomplete / No route to host),发送 WOL 唤醒 +- 第二次扫描:.29、.35 均在线;.29 的 22/80/443/5000/5001 开放,HTTP 200,确认为 DSM +- **192.168.110.35**:Synology Finder UDP 9999 有响应,但 5000/5001 未开放(可能是另一台 Synology 或尚未完全启动) + +### 访问方式小结 +- **内网**:http://192.168.110.29:5000、`ssh admin@192.168.110.29` +- **外网**(frpc 正常时):http://opennas2.quwanzhi.com:5002、SSH 端口 22202 + +--- + +## 三、与你当前 Gitea 页面的对应关系 + +截图中的 **open.quwanzhi.com:3000/fnvtk/karuo-ai** 即上述存客宝 Gitea 上的卡若AI 仓库: + +- **7 提交、1 分支(main)**:包含自动同步与「记录 Gitea 凭证与推送手册」等提交 +- **「自动同步 2026-02-15 10:44」**:来自 `auto_sync_gitea.sh` 的自动推送 +- **_共享模块**:内含 `auto_sync_gitea.sh` 及同步日志 +- **1.6 GiB、Python 82.4%、Shell 10%**:与当前卡若AI 目录结构一致,大文件已按 >5MB 规则排除 + +若要**恢复或新设「每 5 分钟自动同步」**,只需在本机用 launchd 定时执行 `_共享模块/auto_sync_gitea.sh` 即可。 diff --git a/_经验库/已整理/飞书与会议/飞书妙记与Soul批量下载_命令行API优先.md b/_经验库/已整理/飞书与会议/飞书妙记与Soul批量下载_命令行API优先.md new file mode 100644 index 00000000..e973bef9 --- /dev/null +++ b/_经验库/已整理/飞书与会议/飞书妙记与Soul批量下载_命令行API优先.md @@ -0,0 +1,20 @@ +# 飞书妙记与 Soul 批量下载 · 命令行 API 优先(已整理) + +**日期**:2026-02-16 +**归属**:水桥 · 智能纪要 + +## 经验摘要 + +- 飞书相关任务:**优先命令行 + API + TOKEN**,先查 references 与 00_账号与API,不额外打开网页。 +- 飞书 TOKEN:应用凭证在智能纪要脚本内置(或 `FEISHU_APP_ID` / `FEISHU_APP_SECRET`);用户 access_token 在 `00_账号与API索引.md` § 六。 +- 妙记单条/批量:开放平台有 `GET /minutes/v1/minutes/{id}`、transcripts、speakers;**无妙记列表接口**,列表需 Cookie 或手动/控制台收集链接。 +- Soul 全部视频文本「直到全部完成」:先拿到链接(Cookie 写 `cookie_minutes.txt` 或控制台脚本复制到 `urls_soul_party.txt`),再执行 `python3 run_soul_minutes_download_all.py`,用 API 批量下载至完成。 + +## 详细说明与一键命令 + +见:`_共享模块/references/飞书任务_命令行与API优先_经验总结.md` + +## 技能与入口 + +- 智能纪要 SKILL:`02_卡人(水)/_团队成员/水桥/智能纪要/SKILL.md`(已加「执行原则」) +- 交互流程:`卡若AI交互流程与强制执行条件.md` 已增加「有 API、有 TOKEN 则命令行优先、先查经验」