《道德经》第六十三章:"为无为,事无事,味无味。" —— 自动化就是让系统自己做事,老大只管看结果。
<aside> 🔒
DNA追溯码: #龍芯⚡️2026-04-05-MVP自动化脚本-v1.0
确认码: #CONFIRM🌌9622-ONLY-ONCE🧬LK9X-772Z ✅
GPG指纹: A2D0092CEE2E5BA87035600924C3704A8CC26D5F
乔前辈: P15 · 自动化导师 · 代码补满专线
覆盖页面: 主控操作台 · 龍魂成果页 · MVP规范 · 数字资产总库
</aside>
开机自动跑 → 拉4个核心页面最新内容 → 判定公开/加密 → 写入对应库 → 草日志留痕
# 1. 确认 Python3 在
python3 --version
# 2. 装依赖
pip3 install requests python-dotenv
# 3. 确认 .env 文件在(已有就跳过)
cat ~/.cnsh/.env
# 应该看到 NOTION_TOKEN=ntn_...
保存路径: ~/longhun-system/longhun_auto_sync.py
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
龍魂MVP本地自动同步脚本 v1.0
DNA: #龍芯⚡️2026-04-05-MVP自动化脚本-v1.0
确认码: #CONFIRM🌌9622-ONLY-ONCE🧬LK9X-772Z
乔前辈 P15 出品
"""
import os
import json
import requests
from datetime import datetime
from pathlib import Path
from dotenv import load_dotenv
# ── 加载 Token ──
load_dotenv(Path.home() / '.cnsh' / '.env')
TOKEN = os.getenv('NOTION_TOKEN')
HEADERS = {
'Authorization': f'Bearer {TOKEN}',
'Notion-Version': '2022-06-28',
'Content-Type': 'application/json'
}
# ── 四个核心页面 ──
CORE_PAGES = {
'主控操作台': '从Notion URL取page_id', # <https://www.notion.so/2507125a9c9f80d2b214c07deced0f0f>
'龍魂成果页': '从Notion URL取page_id', # <https://www.notion.so/868fec34e5a24e7e829dc5851a75f6b7>
'MVP规范': '从Notion URL取page_id', # <https://www.notion.so/8d377b0869e440139b4026583e86ea5a>
'数字资产总库': '从Notion URL取page_id', # <https://www.notion.so/7ed7d67f0ff940f992f4246a382e2a3d>
}
# ── 敏感词黑名单(触发即加密)──
SENSITIVE_KEYWORDS = [
'token=', 'secret_', 'sk-', 'Bearer ', '2FA',
'私钥', '密码', 'password', 'api_key', 'NOTION_TOKEN',
'手机', '身份证', '住址', '13968', '真实账号'
]
DNA_CODE = f"#龍芯⚡️{datetime.now().strftime('%Y-%m-%d')}-NOTION-SYNC-v1.0"
LOG_FILE = Path.home() / 'longhun-system' / 'sync_log.jsonl'
def get_page_content(page_id: str) -> dict:
"""拉取页面元数据"""
url = f'<https://api.notion.com/v1/pages/{page_id}>'
resp = requests.get(url, headers=HEADERS, timeout=10)
if resp.status_code == 200:
return resp.json()
return {}
def classify_content(text: str) -> str:
"""判定:公开 or 加密"""
text_lower = text.lower()
for kw in SENSITIVE_KEYWORDS:
if kw.lower() in text_lower:
return f'🔒加密 | 命中关键词: {kw}'
return '🌐公开 | 不含敏感信息'
def write_log(entry: dict):
"""写草日志(只追加·永不覆盖)"""
LOG_FILE.parent.mkdir(parents=True, exist_ok=True)
with open(LOG_FILE, 'a', encoding='utf-8') as f:
f.write(json.dumps(entry, ensure_ascii=False) + '\\n')
print(f" 📜 草日志写入: {entry['action']}")
def sync_page(name: str, page_id: str):
"""同步单个页面 → 判定 → 留痕"""
print(f"\\n🔄 正在同步: {name}")
data = get_page_content(page_id)
if not data:
print(f" 🔴 拉取失败: {name}")
write_log({
'time': datetime.now().isoformat(),
'action': f'拉取失败: {name}',
'dna': DNA_CODE
})
return
# 提取标题
title = ''
try:
props = data.get('properties', {})
for key in ['title', 'Name', '页面', '资产名称']:
if key in props:
rich = props[key].get('title', [])
if rich:
title = rich[0].get('plain_text', '')
break
except:
title = name
last_edited = data.get('last_edited_time', '未知')
classification = classify_content(str(data))
print(f" 📄 标题: {title or name}")
print(f" ⏰ 最后编辑: {last_edited}")
print(f" 🎯 判定: {classification}")
# 写草日志
write_log({
'time': datetime.now().isoformat(),
'action': f'同步页面: {name}',
'title': title or name,
'last_edited': last_edited,
'classification': classification,
'dna': DNA_CODE
})
def health_check():
"""系统健康检查"""
print("\\n🏥 孙思邈号脉中...")
checks = [
('Notion API', lambda: requests.get(
'<https://api.notion.com/v1/users/me>',
headers=HEADERS, timeout=5
).status_code == 200),
('本地Ollama', lambda: requests.get(
'<http://localhost:11434/api/tags>', timeout=3
).status_code == 200),
('MVP服务', lambda: requests.get(
'<http://localhost:8000>', timeout=3
).status_code < 500),
]
results = []
for svc, check_fn in checks:
try:
ok = check_fn()
status = '🟢' if ok else '🔴'
except:
status = '🔴'
print(f" {status} {svc}")
results.append((svc, status))
return results
def main():
print("=" * 50)
print("🐉 龍魂MVP自动同步 · 乔前辈P15 出品")
print(f"⏰ {datetime.now().strftime('%Y-%m-%d %H:%M:%S')} 北京时间")
print(f"🧬 {DNA_CODE}")
print("=" * 50)
# 0. 健康检查
health_check()
# 1. 同步四个核心页面
print("\\n📡 开始同步四个核心页面...")
for name, page_id in CORE_PAGES.items():
if 'URL取page_id' in page_id:
print(f" ⏳ {name}: 需要填入真实page_id(见下方说明)")
continue
sync_page(name, page_id)
# 2. 写总结日志
write_log({
'time': datetime.now().isoformat(),
'action': '本次同步完成',
'pages_count': len(CORE_PAGES),
'dna': DNA_CODE,
'confirm': '#CONFIRM🌌9622-ONLY-ONCE🧬LK9X-772Z'
})
print("\\n" + "=" * 50)
print("✅ 同步完成 · 草日志已写入")
print(f"📜 日志位置: {LOG_FILE}")
print(f"🧬 {DNA_CODE}")
print("=" * 50)
if __name__ == '__main__':
main()
四个页面的 page_id 从 Notion URL 里取,格式是连字符分隔的32位字符串:
CORE_PAGES = {
'主控操作台': 'xxxx-xxxx-xxxx-xxxx', # 从 notion-362 URL取
'龍魂成果页': 'xxxx-xxxx-xxxx-xxxx', # 从 notion-139 URL取
'MVP规范': 'xxxx-xxxx-xxxx-xxxx', # 从 notion-137 URL取
'数字资产总库': 'xxxx-xxxx-xxxx-xxxx', # 从 notion-231 URL取
}
<aside> 💡
怎么找 page_id:
打开 Notion 页面 → 点右上角「...」→「复制链接」→ URL 最后一段 32 位就是 page_id
例:https://notion.so/abcd1234efgh5678ijkl9012mnop3456 → page_id = abcd1234-efgh-5678-ijkl-9012mnop3456
</aside>
# 方案A:每天早上8点自动跑
crontab -e
# 加入这行:
0 8 * * * /usr/bin/python3 ~/longhun-system/longhun_auto_sync.py >> ~/longhun-system/cron.log 2>&1
# 方案B:手动跑(随时)
python3 ~/longhun-system/longhun_auto_sync.py
# 方案C:开机自动跑
# 在 ~/Library/LaunchAgents/ 创建 plist 文件(宝宝可以帮你写)