python 更新Obsidian

js 复制代码
import requests
import urllib.parse
import urllib3
import os
from dotenv import load_dotenv

# 忽略 HTTPS 警告
urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)
load_dotenv("../.env")
LOCAL_REST_API_KEY = os.getenv("LOCAL_REST_KEY")
BASE_URL = "https://127.0.0.1:27124"

def update_obsidian_locator_via_put(logical_id, new_selector):
    # 路径和 URL 编码保持不变
    file_path = f"LogicAnchors/{logical_id}.md"
    encoded_path = urllib.parse.quote(file_path, safe='')
    url = f"{BASE_URL}/vault/{encoded_path}"

    # PUT 模式通常只需要 Target-Type
    headers = {
        "Authorization": f"Bearer {LOCAL_REST_API_KEY}",
        "Content-Type": "application/json",
        "Target-Type": "frontmatter",
        "Target": "frontmatter"
    }

    # 注意:PUT 会根据这些 Key 自动匹配并更新
    payload = {
        "locator": new_selector,
        "status": "✅ Stable",
        "last_updated": "2026-04-16"
    }

    try:
        # 改用 PUT 方法
        response = requests.put(url, json=payload, headers=headers, verify=False)

        if response.status_code in [200, 204]:
            print(f"✅ 成功!通过 PUT 更新了 [[{logical_id}]]")
        else:
            print(f"❌ 还是失败 (PUT): {response.status_code}, {response.text}")
    except Exception as e:
        print(f"异常: {e}")


# 测试执行
update_obsidian_locator_via_put("LOGIN_INPUT_EMAIL", 'input[aria-label="New Email"]')

若是执行有问题的话,首先运行排查脚本:

python 复制代码
import requests
from dotenv import load_dotenv
import json
import os
load_dotenv("../.env")

# 配置你的 Obsidian 接口信息
LOCAL_REST_API_KEY = os.getenv("LOCAL_REST_KEY")
BASE_URL = "https://127.0.0.1:27124"
HEADERS = {
    "Authorization": f"Bearer {LOCAL_REST_API_KEY}",
    "Content-Type": "application/json"
}

def debug_list_files():
    # 尝试列出 Logic_Anchors01 文件夹下的所有文件
    debug_url = f"{BASE_URL}/vault/LogicAnchors/"
    response = requests.get(debug_url, headers=HEADERS, verify=False)

    if response.status_code == 200:
        files = response.json()
        print("📂 文件夹下的文件列表:")
        for f in files['files']:
            print(f" - {f}")
    else:
        print(f"❌ 无法读取文件夹,错误码: {response.status_code}")


# debug_list_files()
def get_vault_root_structure():
    # 重点:直接请求 /vault/,不要加任何文件夹名
    url = f"{BASE_URL}/vault/"

    # 禁用证书警告(本地测试)
    import urllib3
    urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)

    response = requests.get(url, headers=HEADERS, verify=False)

    if response.status_code == 200:
        data = response.json()
        print("📁 当前库根目录下的内容:")
        # API 返回通常是一个包含 'files' 键的列表
        for item in data.get('files', []):
            print(f" - {item}")
    else:
        print(f"❌ 根目录访问失败: {response.status_code}, {response.text}")


# get_vault_root_structure()
复制代码
相关推荐
老白干11 分钟前
jjwt 0.9.1 在 JDK 11+ 上的两个“坑”与完整解决方案
java·python·log4j
笨鸟先飞,勤能补拙7 小时前
AI 赋能网络安全:技术全景、成熟度评估与实战案例
人工智能·python·安全·web安全·网络安全·sqlite·github
长和信泰光伏储能8 小时前
京津冀光伏发电:绿色能源的未来之路
python·能源
浦信仿真大讲堂8 小时前
从重复操作到自动化闭环:如何让 CST 与 Python 真正协同起来
python·自动化·cst·仿真软件·达索软件
Gu Gu Study8 小时前
ScoutLoop开放域深度研究引擎(agent的初步设计想法)
人工智能·python
卷无止境9 小时前
写代码这件事,到底该讲究点什么?
后端·python
卷无止境9 小时前
循环复杂度到底在算什么,Python 代码怎么才能写得让人一看就懂
后端·python
lpfasd1239 小时前
MediaCrawler 项目深度分析
chrome·python·chrome devtools
Dxy123931021610 小时前
Python项目打包成EXE完整教程(PyInstaller实战避坑)
开发语言·python
bamb0010 小时前
一个项目带你入门AI应用开发01
python