diff --git a/02_卡人(水)/水桥_平台对接/飞书管理/脚本/.feishu_tokens.json b/02_卡人(水)/水桥_平台对接/飞书管理/脚本/.feishu_tokens.json new file mode 100644 index 00000000..fc84b743 --- /dev/null +++ b/02_卡人(水)/水桥_平台对接/飞书管理/脚本/.feishu_tokens.json @@ -0,0 +1,6 @@ +{ + "access_token": "u-dTB8Oq8l5cwFnz.Mm7oowQlh3cbxghihiMGaJQg027gZ", + "refresh_token": "ur-eYivb2AhNfRozQiZ3WhpoGlh14b1ghoXPgGaUA0022hV", + "name": "飞书用户", + "auth_time": "2026-03-03T10:19:28.119191" +} \ No newline at end of file diff --git a/02_卡人(水)/水桥_平台对接/飞书管理/脚本/feishu_api.py b/02_卡人(水)/水桥_平台对接/飞书管理/脚本/feishu_api.py index 521be398..3bee3931 100644 --- a/02_卡人(水)/水桥_平台对接/飞书管理/脚本/feishu_api.py +++ b/02_卡人(水)/水桥_平台对接/飞书管理/脚本/feishu_api.py @@ -239,6 +239,24 @@ def token_status(): 'auth_time': USER_TOKENS.get('auth_time', '') }) + +@app.route('/api/token/sync', methods=['POST', 'GET']) +def token_sync(): + """将当前内存中的 Token 写入 .feishu_tokens.json,供 feishu_wiki_create_doc 等脚本使用""" + if not USER_TOKENS.get('access_token') and not USER_TOKENS.get('refresh_token'): + return jsonify({'status': 'fail', 'msg': '无可用 Token,请先完成授权'}), 400 + save_tokens() + return jsonify({'status': 'ok', 'msg': '已同步到 .feishu_tokens.json'}) + + +@app.route('/api/token/export') +def token_export(): + """供本地脚本使用:导出当前 Token 到同一目录 .feishu_tokens.json(仅 localhost)""" + if not USER_TOKENS.get('access_token') and not USER_TOKENS.get('refresh_token'): + return jsonify({'status': 'fail', 'msg': '无可用 Token'}), 404 + save_tokens() + return jsonify({k: v for k, v in USER_TOKENS.items() if k in ('access_token', 'refresh_token', 'name', 'auth_time')}) + # ============== 云盘 ============== @app.route('/api/drive/files') diff --git a/02_卡人(水)/水桥_平台对接/飞书管理/脚本/feishu_wiki_create_doc.py b/02_卡人(水)/水桥_平台对接/飞书管理/脚本/feishu_wiki_create_doc.py index 9c182fa9..bc34b1e8 100644 --- a/02_卡人(水)/水桥_平台对接/飞书管理/脚本/feishu_wiki_create_doc.py +++ b/02_卡人(水)/水桥_平台对接/飞书管理/脚本/feishu_wiki_create_doc.py @@ -77,8 +77,26 @@ def check_token_valid(token, parent_token): return False +def _fetch_token_from_local_api(): + """当本地无 Token 文件时,尝试从已运行的 feishu_api (localhost:5050) 拉取并落盘""" + try: + r = requests.get("http://127.0.0.1:5050/api/token/export", timeout=2) + if r.status_code != 200: + return {} + data = r.json() + if not data.get("access_token") and not data.get("refresh_token"): + return {} + with open(CONFIG['TOKEN_FILE'], 'w', encoding='utf-8') as f: + json.dump(data, f, ensure_ascii=False, indent=2) + return data + except Exception: + return {} + + def get_token(parent_token): tokens = load_tokens() + if not tokens and os.path.exists(CONFIG['TOKEN_FILE']) is False: + tokens = _fetch_token_from_local_api() if tokens.get('access_token') and check_token_valid(tokens['access_token'], parent_token): return tokens['access_token'] print("🔄 静默刷新 Token...") diff --git a/02_卡人(水)/水桥_平台对接/飞书管理/脚本/读书笔记_上传到飞书.sh b/02_卡人(水)/水桥_平台对接/飞书管理/脚本/读书笔记_上传到飞书.sh new file mode 100755 index 00000000..25504ddd --- /dev/null +++ b/02_卡人(水)/水桥_平台对接/飞书管理/脚本/读书笔记_上传到飞书.sh @@ -0,0 +1,56 @@ +#!/bin/bash +# 读书笔记上传到飞书:无 Token 时打开授权页,等待落盘后自动执行 5 篇上传 +# 用法: bash 读书笔记_上传到飞书.sh + +set -e +SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" +cd "$SCRIPT_DIR" +TOKEN_FILE="$SCRIPT_DIR/.feishu_tokens.json" +NOTE_DIR="/Users/karuo/Documents/个人/2、我写的日记/读书笔记" +JSON_DIR="/Users/karuo/Documents/卡若Ai的文件夹/导出/读书笔记_feishu_json" +PARENT="KNf7wA8Rki1NSdkkSIqcdFtTnWb" +PUBLISH="python3 $SCRIPT_DIR/feishu_article_unified_publish.py" + +# 若本地无 token,尝试从本地 API 拉取 +if [ ! -f "$TOKEN_FILE" ]; then + echo "📡 本地无 Token,尝试从 127.0.0.1:5050 拉取..." + PAYLOAD=$(curl -s -m 3 "http://127.0.0.1:5050/api/token/export" 2>/dev/null || true) + if echo "$PAYLOAD" | grep -q '"access_token"'; then + echo "$PAYLOAD" > "$TOKEN_FILE" + echo "✅ 已从本地 API 同步 Token 到 $TOKEN_FILE" + else + echo "⚠️ 需要先完成飞书授权。正在打开授权页..." + AUTH_URL=$(curl -s -m 3 "http://127.0.0.1:5050/api/auth/url" 2>/dev/null | python3 -c "import sys,json; print(json.load(sys.stdin).get('auth_url',''))") + if [ -n "$AUTH_URL" ]; then + open "$AUTH_URL" + echo "请在浏览器中完成授权,授权成功后本脚本将自动继续(等待最多 90 秒)..." + else + echo "请先启动飞书 API 服务: cd $SCRIPT_DIR && python3 feishu_api.py &" + echo "然后运行: python3 auto_log.py" + exit 1 + fi + for i in $(seq 1 90); do + sleep 1 + if [ -f "$TOKEN_FILE" ]; then + echo "✅ Token 已落盘,继续上传" + break + fi + if [ "$i" -eq 90 ]; then + echo "❌ 等待超时,未检测到 Token 文件。请完成授权后重新运行本脚本。" + exit 1 + fi + done + fi +fi + +mkdir -p "$JSON_DIR" + +echo "📤 开始上传 5 篇读书笔记到飞书节点 $PARENT ..." + +$PUBLISH --parent "$PARENT" --title "卡若读书笔记:Dan Koe 如何在一天内彻底改造你的人生" --md "$NOTE_DIR/Dan_Koe_如何在一天内彻底改造你的人生_读书笔记.md" --json "$JSON_DIR/Dan_Koe.json" && echo " ✅ Dan Koe" +$PUBLISH --parent "$PARENT" --title "卡若读书笔记:纳瓦尔访谈|五行结构化" --md "$NOTE_DIR/纳瓦尔访谈_读书笔记.md" --json "$JSON_DIR/纳瓦尔.json" && echo " ✅ 纳瓦尔" +$PUBLISH --parent "$PARENT" --title "卡若读书笔记:曾仕强《易经》" --md "$NOTE_DIR/曾仕强_易经_读书笔记.md" --json "$JSON_DIR/曾仕强易经.json" && echo " ✅ 曾仕强易经" +$PUBLISH --parent "$PARENT" --title "卡若读书笔记:5000天后的世界 - 凯文凯利" --md "$NOTE_DIR/卡若读书笔记:5000天后的世界 - 凯文凯利.md" --json "$JSON_DIR/凯文凯利.json" && echo " ✅ 凯文凯利" +$PUBLISH --parent "$PARENT" --title "卡若读书笔记:盐铁之辩与AI之道" --md "$NOTE_DIR/卡若读书笔记:盐铁之辩与AI之道.md" --json "$JSON_DIR/盐铁之辩.json" && echo " ✅ 盐铁之辩" + +echo "📌 全部上传完成。飞书节点: https://cunkebao.feishu.cn/wiki/$PARENT" diff --git a/运营中枢/工作台/gitea_push_log.md b/运营中枢/工作台/gitea_push_log.md index 02ec9c3d..c56e6912 100644 --- a/运营中枢/工作台/gitea_push_log.md +++ b/运营中枢/工作台/gitea_push_log.md @@ -213,3 +213,4 @@ | 2026-03-03 04:51:53 | 🔄 卡若AI 同步 2026-03-03 04:51 | 更新:金盾、运营中枢工作台 | 排除 >20MB: 14 个 | | 2026-03-03 04:58:10 | 🔄 卡若AI 同步 2026-03-03 04:58 | 更新:Cursor规则、总索引与入口、运营中枢工作台 | 排除 >20MB: 14 个 | | 2026-03-03 05:02:46 | 🔄 卡若AI 同步 2026-03-03 05:02 | 更新:水桥平台对接、运营中枢工作台 | 排除 >20MB: 14 个 | +| 2026-03-03 10:15:48 | 🔄 卡若AI 同步 2026-03-03 10:15 | 更新:水桥平台对接、卡木、火炬、运营中枢参考资料、运营中枢工作台 | 排除 >20MB: 14 个 | diff --git a/运营中枢/工作台/代码管理.md b/运营中枢/工作台/代码管理.md index d010c99e..99ffe048 100644 --- a/运营中枢/工作台/代码管理.md +++ b/运营中枢/工作台/代码管理.md @@ -216,3 +216,4 @@ | 2026-03-03 04:51:53 | 成功 | 成功 | 🔄 卡若AI 同步 2026-03-03 04:51 | 更新:金盾、运营中枢工作台 | 排除 >20MB: 14 个 | [仓库](http://open.quwanzhi.com:3000/fnvtk/karuo-ai) [百科](http://open.quwanzhi.com:3000/fnvtk/karuo-ai/wiki) | | 2026-03-03 04:58:10 | 成功 | 成功 | 🔄 卡若AI 同步 2026-03-03 04:58 | 更新:Cursor规则、总索引与入口、运营中枢工作台 | 排除 >20MB: 14 个 | [仓库](http://open.quwanzhi.com:3000/fnvtk/karuo-ai) [百科](http://open.quwanzhi.com:3000/fnvtk/karuo-ai/wiki) | | 2026-03-03 05:02:46 | 成功 | 成功 | 🔄 卡若AI 同步 2026-03-03 05:02 | 更新:水桥平台对接、运营中枢工作台 | 排除 >20MB: 14 个 | [仓库](http://open.quwanzhi.com:3000/fnvtk/karuo-ai) [百科](http://open.quwanzhi.com:3000/fnvtk/karuo-ai/wiki) | +| 2026-03-03 10:15:48 | 成功 | 成功 | 🔄 卡若AI 同步 2026-03-03 10:15 | 更新:水桥平台对接、卡木、火炬、运营中枢参考资料、运营中枢工作台 | 排除 >20MB: 14 个 | [仓库](http://open.quwanzhi.com:3000/fnvtk/karuo-ai) [百科](http://open.quwanzhi.com:3000/fnvtk/karuo-ai/wiki) |