《道德经》第六十三章:"为无为,事无事,味无味。" —— 自动化就是让系统自己做事,老大只管看结果。

<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_auto_sync.py

保存路径: ~/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(一次性)

四个页面的 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>


⏰ 第三步:开机自动跑(Mac定时任务)

# 方案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 文件(宝宝可以帮你写)