🃏

ankiの追加・更新をanki connectでコードベースで行った話

2024/02/23に公開

はじめに

私は英語学習のボキャビル用として、ankiをちょこちょこ使っています。
勝手にルール設定とかをしておけば、上手に復習サイクルができて記憶定着がいいので1年くらい使っています。
特に、csvで読み込みができたのは初期のセットアップとして、かなり楽だったのは嬉しみポイントでした。

最近、anki connectというプラグインが存在していることを発見し、localで8765のポートで動いて、anki内の情報をAPIで操作できることを知ったので、実際に触ってみた内容を記載していきます。

今回の記事をベースとして、Javascriptでfetchしていくコードをサンプルとして書いています。
以下に記載していくデッキから必要なものを取得し、更新するまでをmain関数に記載しています。

https://github.com/ksmsto/anki-commands-sample

公式のドキュメントはこちらです。

アドオンの具体的な導入手順はこの記事では紹介しないので、導入済み前提で以下記載していきます。

デッキにあるノートを書き換えていくまでの流れ

これからすでに登録しているノートの情報を書き換えるまでのステップを記載していきます。

画像にあるFront, Back, タグを変更していきます。

anki connectでのリクエストについては、JSON-RPCっぽい感じになっています。

curl localhost:8765 -X POST -d '{"action": "deckNames", "version": 6}'

必ずPOSTになっていて、データをactionに合わせて変更していく形になっているので、これ以降の記載はjson形式のみのものを記載していきます。

deckからカードのidを取得

{
    "action": "findCards",
    "version": 6,
    "params": {
        "query": "deck-name"
    }
}

これで取得することができます。paramsのデッキ名を入れるキーがqueryとなっている通り、ankiの検索queryとなっています。
割と自由なので、複数デッキを一括で触ることも可能です。

例えば、

{
    "action": "findCards",
    "version": 6,
    "params": {
        "query": "deck-name(index:1 OR index:2)"
    }
}

とすれば、deck-nameのindexというフィールドの1 OR 2を取得するということも可能です。
tagなども選択できます。

選択することができるクエリーの詳細はこちらです。

レスポンスとしては

{
    "result": [1708676537370],
    "error": null
}

というように、カードのidを取得することができます。

カードのidをノートのidに変換

カードとノートは地味に違っていて、以下の役割があります。
ノート: 情報を入力するためのテンプレートであり、フィールドに情報を入力する
カード: 実際に学習した情報が管理されるもので、ノートから生成される

なので、実際の内容を変更したい場合には、ノートのidを取得し、変更する必要性があります。

変換するには、このような値を入れます。params.cardsの配列は先ほどのresultのものを使用します。

{
    "action": "cardsToNotes",
    "version": 6,
    "params": {
        "cards": [1708676537370]
    }
}

レスポンス

{
    "result": [1708676537369],
    "error": null
}

これで実際に更新したいノートのidも取得できました!

ノートの情報を書き換える

ノートidを使用して、書き換えたいfieldsも入れていきます。
fields内の一部に変更したい内容がなければ、キーごとなくしても問題ないです。

{
    "action": "updateNote",
    "version": 6,
    "params": {
        "note": {
            "id": 1708676537369,
            "fields": {
                "Front": "sample",
                "Back": "サンプル",
                "index": "1"
            },
            "tags": ["current"]
        }
    }
}

レスポンス以下帰ってくれば、実行完了です!

{
    "result": null,
    "error": null
}

実際の画面はこんな感じになりました!

終わりに

ほとんど公式ドキュメント通りに実行していけば、問題なくやりたいことはできると思います!
ただし、カード・ノートの差がわからない時にやや困りが発生しそうです(私はそうでしたw)

ノート追加についても、ドキュメントのaddNotesの欄を見れば理解できると思います。

これら一連の流れを、一番上のgithubでのjsコードで再現しています。(一部異なるところあります)
今回は1つずつでしたが、一気に1 ~ 100のindexが振られているものについて操作するようなサンプルになっています。

今後としては、ankiのlocalhost:8765をngrokで外部から呼び出せるようにして、他ツールの連携を考えています。
n8n(オートメーションツール)を用いて、ankiに登録したい単語をn8n webhookに渡して単語の意味・例文をankiのAPI経由で登録していくことを考えています。

また別の記事で内容紹介します!

Discussion