diff --git a/.gitignore b/.gitignore index 545be499..e56e8aaa 100644 --- a/.gitignore +++ b/.gitignore @@ -23,6 +23,9 @@ sync_tokens.env # 飞书妙记(用户 token / Cookie,勿提交) **/智能纪要/脚本/feishu_user_token.txt **/智能纪要/脚本/cookie_minutes.txt +# 飞书日志:用户授权 token 与月度文档 token(勿提交) +**/飞书管理/脚本/.feishu_tokens.json +**/飞书管理/脚本/.feishu_month_wiki_tokens.json # 卡若AI 网关:多租户配置与访问日志(不入库) 运营中枢/scripts/karuo_ai_gateway/config/gateway.yaml diff --git a/02_卡人(水)/水桥_平台对接/飞书管理/SKILL.md b/02_卡人(水)/水桥_平台对接/飞书管理/SKILL.md index bf583eaf..04f1db41 100755 --- a/02_卡人(水)/水桥_平台对接/飞书管理/SKILL.md +++ b/02_卡人(水)/水桥_平台对接/飞书管理/SKILL.md @@ -109,6 +109,20 @@ python3 /Users/karuo/Documents/个人/卡若AI/02_卡人(水)/水桥_平台 --- +## Token 命令行(获取 / 写入均用命令行) + +所有 Token 的获取与写入均通过命令行完成,无需手改配置文件。 + +| 命令 | 说明 | +|:---|:---| +| `python3 脚本/feishu_token_cli.py get-access-token` | 刷新并输出 access_token,并写入 `脚本/.feishu_tokens.json` | +| `python3 脚本/feishu_token_cli.py set-march-token ` | 将 3 月文档 wiki token 写入 `脚本/.feishu_month_wiki_tokens.json`,供 auto_log / write_today_three_focus 读取 | +| `python3 脚本/feishu_token_cli.py get-march-token` | 输出当前 3 月 wiki token(优先环境变量 `FEISHU_MARCH_WIKI_TOKEN`,否则读本地文件) | + +**3 月 token 读取顺序**:环境变量 `FEISHU_MARCH_WIKI_TOKEN` → 本地 `脚本/.feishu_month_wiki_tokens.json` → CONFIG。写入用 `set-march-token` 即可,无需改代码或 .env。 + +--- + ## 日志格式规范 ### 1. 插入顺序:倒序 diff --git a/02_卡人(水)/水桥_平台对接/飞书管理/脚本/auto_log.py b/02_卡人(水)/水桥_平台对接/飞书管理/脚本/auto_log.py index f1833e02..8235c7f1 100644 --- a/02_卡人(水)/水桥_平台对接/飞书管理/脚本/auto_log.py +++ b/02_卡人(水)/水桥_平台对接/飞书管理/脚本/auto_log.py @@ -240,17 +240,38 @@ def parse_month_from_date_str(date_str): return None +def _get_month_wiki_token(month): + """当月 wiki token:3 月优先 环境变量 > 本地 .feishu_month_wiki_tokens.json > CONFIG""" + if month == 3: + v = os.environ.get("FEISHU_MARCH_WIKI_TOKEN", "").strip() + if v: + return v + try: + path = os.path.join(os.path.dirname(__file__), ".feishu_month_wiki_tokens.json") + if os.path.exists(path): + with open(path, encoding="utf-8") as f: + v = (json.load(f).get("3") or "").strip() + if v: + return v + except Exception: + pass + return (CONFIG.get("MONTH_WIKI_TOKENS") or {}).get(3) or "" + return (CONFIG.get("MONTH_WIKI_TOKENS") or {}).get(month) or "" + + def resolve_wiki_token_for_date(date_str, explicit_wiki_token=None): """根据日期路由文档token;允许显式覆盖;当月 token 为空时返回 None""" if explicit_wiki_token: return explicit_wiki_token month = parse_month_from_date_str(date_str) - if month and month in CONFIG.get('MONTH_WIKI_TOKENS', {}): - tok = CONFIG['MONTH_WIKI_TOKENS'][month] + if month: + tok = _get_month_wiki_token(month) if tok and str(tok).strip(): return tok - return None # 当月未配置 token(如 3 月需 FEISHU_MARCH_WIKI_TOKEN) - return CONFIG['WIKI_TOKEN'] + if month in (1, 2): + return CONFIG["MONTH_WIKI_TOKENS"].get(month) or CONFIG["WIKI_TOKEN"] + return None # 3 月等未配置时返回 None + return CONFIG["WIKI_TOKEN"] def _find_date_section_block_ids(blocks, date_str, doc_id): """找到某日期区块的 block_id 列表(用于覆盖删除)""" diff --git a/02_卡人(水)/水桥_平台对接/飞书管理/脚本/feishu_token_cli.py b/02_卡人(水)/水桥_平台对接/飞书管理/脚本/feishu_token_cli.py new file mode 100644 index 00000000..664478dc --- /dev/null +++ b/02_卡人(水)/水桥_平台对接/飞书管理/脚本/feishu_token_cli.py @@ -0,0 +1,87 @@ +#!/usr/bin/env python3 +""" +飞书 Token 命令行:获取 access_token、写入/读取月度 wiki token,全部用命令行操作。 +用法: + python3 feishu_token_cli.py get-access-token # 刷新并输出 access_token,写入 .feishu_tokens.json + python3 feishu_token_cli.py set-march-token # 将 3 月文档 token 写入本地,供 auto_log 读取 + python3 feishu_token_cli.py get-march-token # 输出当前 3 月 wiki token(env 或本地文件) +""" +import os +import sys +import json +from pathlib import Path + +SCRIPT_DIR = Path(__file__).resolve().parent +MONTH_TOKENS_FILE = SCRIPT_DIR / ".feishu_month_wiki_tokens.json" + + +def _load_month_tokens(): + if MONTH_TOKENS_FILE.exists(): + try: + with open(MONTH_TOKENS_FILE, "r", encoding="utf-8") as f: + return json.load(f) + except Exception: + pass + return {} + + +def _save_month_tokens(data): + with open(MONTH_TOKENS_FILE, "w", encoding="utf-8") as f: + json.dump(data, f, ensure_ascii=False, indent=2) + + +def cmd_get_access_token(): + sys.path.insert(0, str(SCRIPT_DIR)) + from auto_log import get_token_silent, load_tokens + token = get_token_silent() + if token: + print(token) + return 0 + print("", file=sys.stderr) + return 1 + + +def cmd_set_march_token(token_value): + token_value = (token_value or "").strip() + if not token_value: + print("用法: feishu_token_cli.py set-march-token ", file=sys.stderr) + return 1 + data = _load_month_tokens() + data["3"] = token_value + _save_month_tokens(data) + print(f"✅ 3 月 wiki token 已写入 {MONTH_TOKENS_FILE}") + return 0 + + +def cmd_get_march_token(): + # 优先环境变量 + env_tok = os.environ.get("FEISHU_MARCH_WIKI_TOKEN", "").strip() + if env_tok: + print(env_tok) + return 0 + data = _load_month_tokens() + tok = data.get("3", "").strip() + if tok: + print(tok) + return 0 + print("", file=sys.stderr) + return 1 + + +def main(): + if len(sys.argv) < 2: + print(__doc__.strip(), file=sys.stderr) + return 1 + cmd = sys.argv[1].lower() + if cmd == "get-access-token": + return cmd_get_access_token() + if cmd == "set-march-token": + return cmd_set_march_token(sys.argv[2] if len(sys.argv) > 2 else None) + if cmd == "get-march-token": + return cmd_get_march_token() + print(f"未知命令: {cmd}", file=sys.stderr) + return 1 + + +if __name__ == "__main__": + sys.exit(main()) diff --git a/运营中枢/工作台/gitea_push_log.md b/运营中枢/工作台/gitea_push_log.md index ce44c4b9..b6ea06e6 100644 --- a/运营中枢/工作台/gitea_push_log.md +++ b/运营中枢/工作台/gitea_push_log.md @@ -231,3 +231,4 @@ | 2026-03-05 05:30:03 | 🔄 卡若AI 同步 2026-03-05 05:30 | 更新:水桥平台对接、运营中枢工作台 | 排除 >20MB: 11 个 | | 2026-03-05 05:45:06 | 🔄 卡若AI 同步 2026-03-05 05:45 | 更新:水桥平台对接、运营中枢工作台 | 排除 >20MB: 11 个 | | 2026-03-05 05:46:16 | 🔄 卡若AI 同步 2026-03-05 05:46 | 更新:运营中枢参考资料、运营中枢工作台 | 排除 >20MB: 11 个 | +| 2026-03-05 05:47:24 | 🔄 卡若AI 同步 2026-03-05 05:47 | 更新:Cursor规则、水桥平台对接、运营中枢工作台 | 排除 >20MB: 11 个 | diff --git a/运营中枢/工作台/代码管理.md b/运营中枢/工作台/代码管理.md index c7c64492..b32947a3 100644 --- a/运营中枢/工作台/代码管理.md +++ b/运营中枢/工作台/代码管理.md @@ -234,3 +234,4 @@ | 2026-03-05 05:30:03 | 成功 | 成功 | 🔄 卡若AI 同步 2026-03-05 05:30 | 更新:水桥平台对接、运营中枢工作台 | 排除 >20MB: 11 个 | [仓库](http://open.quwanzhi.com:3000/fnvtk/karuo-ai) [百科](http://open.quwanzhi.com:3000/fnvtk/karuo-ai/wiki) | | 2026-03-05 05:45:06 | 成功 | 成功 | 🔄 卡若AI 同步 2026-03-05 05:45 | 更新:水桥平台对接、运营中枢工作台 | 排除 >20MB: 11 个 | [仓库](http://open.quwanzhi.com:3000/fnvtk/karuo-ai) [百科](http://open.quwanzhi.com:3000/fnvtk/karuo-ai/wiki) | | 2026-03-05 05:46:16 | 成功 | 成功 | 🔄 卡若AI 同步 2026-03-05 05:46 | 更新:运营中枢参考资料、运营中枢工作台 | 排除 >20MB: 11 个 | [仓库](http://open.quwanzhi.com:3000/fnvtk/karuo-ai) [百科](http://open.quwanzhi.com:3000/fnvtk/karuo-ai/wiki) | +| 2026-03-05 05:47:24 | 成功 | 成功 | 🔄 卡若AI 同步 2026-03-05 05:47 | 更新:Cursor规则、水桥平台对接、运营中枢工作台 | 排除 >20MB: 11 个 | [仓库](http://open.quwanzhi.com:3000/fnvtk/karuo-ai) [百科](http://open.quwanzhi.com:3000/fnvtk/karuo-ai/wiki) |