元学习

AnkiConnect

一个将 Anki 与其他软件连接的非常基础的 Anki 插件。

官方页面

AnkiConnect - AnkiWeb

安装需遵照官方说明。

连接方法

AnkiConnect 可以让其他软件通过 HTTP 实现和 Anki 的连接,包括读取 Anki 卡片、向 Anki 中添加卡片、更新 Anki 已有卡片等。

示例代码

import json
import requests

def request(action, **params):
    """
    一个使用 requests 库调用 AnkiConnect API 的辅助函数
    """
    # 构建请求体
    request_payload = {
        'action': action,
        'params': params,
        'version': 6
    }
    
    # AnkiConnect 的 API 端点
    url = 'http://localhost:8765'
    
    try:
        # 发送 POST 请求
        response = requests.post(url, data=json.dumps(request_payload))
        
        # 确保请求成功
        response.raise_for_status()
        
        # 解析 JSON 响应
        response_data = response.json()
        
        # 检查 AnkiConnect 返回的错误字段
        if response_data.get('error'):
            raise Exception(response_data['error'])
            
        return response_data.get('result')

    except requests.exceptions.RequestException as e:
        # 处理网络层面的错误 (如连接失败)
        raise Exception(f"无法连接到 AnkiConnect: {e}")
    except json.JSONDecodeError:
        # 处理无法解析的响应
        raise Exception("无法解析 AnkiConnect 的响应,它可能没有正确启动或配置。")

# --- 例子开始 ---
try:
    note_id_to_update = 1752472164551 # 这是一个示例ID,请务必替换

    update_data = {
        "id": note_id_to_update,
        "fields": {
            "word": "Hello",
            "rubytextHtml": "ハロー",
            "exampleSentence": "Hello, everyone!"
        }
    }
    
    # 在更新前,先检查卡片是否存在
    if note_id_to_update in request('findNotes', query=f'nid:{note_id_to_update}'):
        result = request('updateNoteFields', note=update_data)
        print(f"成功更新卡片 ID: {note_id_to_update}。")
    else:
        print(f"错误:找不到要更新的卡片 ID: {note_id_to_update}。请确保ID正确。")

except Exception as e:
    print(f"更新卡片时发生错误: {e}")

invoke 封装

在多数情况下,可以创建函数 invoke,封装一次与 AnkiConnect 的操作。

def invoke(action, **params):
    """
    一个辅助函数,用于向 AnkiConnect 发送请求。
    
    Args:
        action (str): 要执行的 AnkiConnect 操作。
        **params: 传递给操作的参数。
        
    Returns:
        dict: 从 AnkiConnect API 返回的 JSON 响应。
    """
    payload = {"action": action, "version": 6, "params": params}
    try:
        response = requests.post(ANKICONNECT_URL, data=json.dumps(payload))
        response.raise_for_status()  # 如果请求失败(例如 404, 500),则引发异常
        response_json = response.json()
        if response_json.get('error'):
            raise Exception(f"AnkiConnect Error: {response_json['error']}")
        return response_json['result']
    except requests.exceptions.RequestException as e:
        raise Exception(f"无法连接到 AnkiConnect。请确保 Anki 正在运行并且 AnkiConnect 插件已安装。\n错误详情: {e}")

这样只要每次传入动作和参数就可以更新。

常用命令

findNotes

寻找指定的笔记。

参数:

  • query:按 Anki 的格式搜索和晒先,例如 "deck:Japanese" 就只筛选 Japanese 牌组的笔记。

返回值:一个列表,包含搜索到的笔记的 Note ID

BEYOND THE ARTICLE

读完了,有什么想法?

阅读已保存的问答示例,并循着引用回到原文。

查看公开问答示例
— 本文完 — 返回文章列表