🔄 卡若AI 同步 2026-02-16 06:56 | 变更 21 个文件 | 排除 >20MB: 4 个
Some checks failed
Sync GitHub to CKB NAS Gitea / sync (push) Has been cancelled
Some checks failed
Sync GitHub to CKB NAS Gitea / sync (push) Has been cancelled
This commit is contained in:
@@ -4,6 +4,18 @@
|
||||
|
||||
---
|
||||
|
||||
## ⚡ 执行原则(飞书相关必守)
|
||||
|
||||
| 原则 | 说明 |
|
||||
|:---|:---|
|
||||
| **命令行 + API + TOKEN 优先** | 有飞书 API、有 TOKEN 的任务,一律先用命令行处理,不额外打开网页操作 |
|
||||
| **先查已有经验** | 执行前查 `_共享模块/references/飞书任务_命令行与API优先_经验总结.md` 与 `_共享模块/工作台/00_账号与API索引.md`(飞书 Token) |
|
||||
| **统一用命令行** | 妙记拉取、批量下载、产研日报等均提供一键命令,复用已完成过的 TOKEN/会议流程 |
|
||||
|
||||
飞书 TOKEN 与妙记/会议已完成流程见:`_共享模块/references/飞书任务_命令行与API优先_经验总结.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
|
||||
```
|
||||
|
||||
## 四、输出说明
|
||||
|
||||
48
02_卡人(水)/_团队成员/水桥/智能纪要/scripts/README_完全下载.md
Normal file
48
02_卡人(水)/_团队成员/水桥/智能纪要/scripts/README_完全下载.md
Normal file
@@ -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 方式或手动整理链接获得。
|
||||
@@ -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
|
||||
|
||||
@@ -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())
|
||||
164
02_卡人(水)/_团队成员/水桥/智能纪要/scripts/feishu_api_collect_minutes.py
Normal file
164
02_卡人(水)/_团队成员/水桥/智能纪要/scripts/feishu_api_collect_minutes.py
Normal file
@@ -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())
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
109
02_卡人(水)/_团队成员/水桥/智能纪要/scripts/fetch_minutes_list_by_cookie.py
Normal file
109
02_卡人(水)/_团队成员/水桥/智能纪要/scripts/fetch_minutes_list_by_cookie.py
Normal file
@@ -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())
|
||||
25
02_卡人(水)/_团队成员/水桥/智能纪要/scripts/run_minutes_download_full.sh
Executable file
25
02_卡人(水)/_团队成员/水桥/智能纪要/scripts/run_minutes_download_full.sh
Executable file
@@ -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
|
||||
@@ -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())
|
||||
2
02_卡人(水)/_团队成员/水桥/智能纪要/scripts/urls_soul_party.txt
Normal file
2
02_卡人(水)/_团队成员/水桥/智能纪要/scripts/urls_soul_party.txt
Normal file
@@ -0,0 +1,2 @@
|
||||
# 妙记链接每行一个(# 为注释)。以下为示例,可追加更多。
|
||||
https://cunkebao.feishu.cn/minutes/obcnjnsx2mz7vj5q843172p8
|
||||
28
02_卡人(水)/_团队成员/水桥/智能纪要/scripts/获取100场链接-浏览器控制台.txt
Normal file
28
02_卡人(水)/_团队成员/水桥/智能纪要/scripts/获取100场链接-浏览器控制台.txt
Normal file
@@ -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
|
||||
@@ -0,0 +1,12 @@
|
||||
日期: 20260216
|
||||
标题: 产研团队 第20场 20260128 许永平
|
||||
时长: 01:17:03
|
||||
|
||||
关键词:
|
||||
会议纪要、产研团队、技术分享
|
||||
|
||||
文字记录:
|
||||
标题: 产研团队 第20场 20260128 许永平
|
||||
时长: 01:17:03
|
||||
|
||||
(文字记录需在飞书妙记页面「…」→ 导出文字记录,或为应用开通权限后重试本命令)
|
||||
@@ -86,11 +86,14 @@
|
||||
- 在已有资料与知识中搜索、思考,扩展出可执行方案(子步骤、依赖、验收标准)。
|
||||
- 明确「目标结果」与「完成标准」后再分配任务。
|
||||
|
||||
3. **分配后必须执行并验证**
|
||||
3. **有 API、有 TOKEN 则命令行优先**
|
||||
- 凡飞书/第三方提供 API 且已有 TOKEN(见 `00_账号与API索引` 或技能内置)的任务,**先查 references 中对应经验**(如 `飞书任务_命令行与API优先_经验总结.md`),统一用命令行完成,不额外打开网页操作;已完成过的流程直接复用。
|
||||
|
||||
4. **分配后必须执行并验证**
|
||||
- 按 理解→拆解→执行→每步总结→验证 执行。
|
||||
- 验证不通过则回溯,最多 5 轮。
|
||||
|
||||
4. **必须拿到目标结果**
|
||||
5. **必须拿到目标结果**
|
||||
- 交付须与「目标结果」一致。
|
||||
- 若无法达成,须明确说明:差距、原因、可选下一步。
|
||||
|
||||
|
||||
94
_共享模块/references/飞书任务_命令行与API优先_经验总结.md
Normal file
94
_共享模块/references/飞书任务_命令行与API优先_经验总结.md
Normal file
@@ -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 | 归属:水桥 · 智能纪要 · 飞书
|
||||
@@ -170,6 +170,8 @@
|
||||
| refresh_token | `ur-6Wu3DdR8h4TGJErCFjTarE5lhbzk5kirpO0aiN6000SA` |
|
||||
| 说明 | 飞书用户,授权时间 2026-01-29;过期后需重新授权或刷新 |
|
||||
|
||||
**飞书任务优先命令行+API+TOKEN**:妙记/会议等流程与一键命令见 `_共享模块/references/飞书任务_命令行与API优先_经验总结.md`。应用凭证(APP_ID/APP_SECRET)在智能纪要脚本内置或环境变量。
|
||||
|
||||
### 飞书项目(玩值电竞 · 账号金融 · 存客宝)
|
||||
|
||||
> 用于玩值电竞任务同步到飞书项目需求管理。任务安排见:`玩值电竞/水:流程规划/玩值电竞_双月任务安排(飞书项目版).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 个 |
|
||||
|
||||
@@ -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) |
|
||||
|
||||
72
_执行日志/2026-02-15_对话总结_同步与DiskStation.md
Normal file
72
_执行日志/2026-02-15_对话总结_同步与DiskStation.md
Normal file
@@ -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` 即可。
|
||||
20
_经验库/已整理/飞书与会议/飞书妙记与Soul批量下载_命令行API优先.md
Normal file
20
_经验库/已整理/飞书与会议/飞书妙记与Soul批量下载_命令行API优先.md
Normal file
@@ -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 则命令行优先、先查经验」
|
||||
Reference in New Issue
Block a user