paloma blog

NWエンジニアやってます。主に自宅環境のお遊びを書きます。Pythonもちょっと。タイトルは好きなカクテルから。

マネートラッキングをFireflyに一本化する API探す編

家の収支管理にFirefly iiiを使い始めて半年ちょい。 支出のトラッキングでしか使ってませんが自動で集計してくれるのはありがたい。

私のFirefly iiiを使ったキャッシュフロー確認 - paloma blog

Fireflyは現金払いの集計、クレジット払いの集計は自作ツールという使い分けをしていましたが、Fireflyの方が何かと便利なのでこちらに集約して一本化したいと思います。

クレジットの集計ツールは昔作りました。

月次の支払い集計ツールを作る SQL準備編 - paloma blog

クレジットの明細はcsvでダウンロード出来ますが、Fireflyには直接インポートはできないようで個別にインポート用のサーバを用意する必要があるみたいです。

これは面倒だと思っていましたが、どうやらJSONAPIが提供されているようなのでこちらを使ってクレジットの明細をimportできるようにしたいと思います。

まずは公式ドキュメント

https://docs.Firefly-iii.org/Firefly-iii/api/

APIのページしては短いなと思ったら別のリンクがありました。

Firefly III API documentation

Firefly iiiのAPIはswaggerというAPIフレームワークが使われているようです。
Web系の業務はあまり関わりが無いですが、swaggerなんて聞いたことも無く初耳でした。

APIアクセスする方法は2通りあるようです。

OAuth2.0

名前は聞いたことあるけどよくわからなったもの。
認可フレームワークらしいです。
アクセス許可用のトークンを発行してリソースにアクセスできるようになるという仕組みらしいです。

サイトがあるので説明は割愛します。
使うにはいろいろサーバ、アプリが必要らしい。

The OAuth 2.0 Authorization Framework

Personal token

OAuth2.0環境を使わない人向けに個人token発行の機能もあるようです。 家で使うのでわざわざOAuth2.0の環境は作らずこちらを使いましょう。

リクエストヘッダ

APIを叩く際はヘッダを埋め込むと思うのですがフォーマットが書いてない。
これも標準仕様としてあると言うことか。
再度ドキュメントを読みます。

APIドキュメントのサンプルコマンドは以下になっていました。
サンプルは他にもありますが、以下のコマンドはサーバ情報を取得します。

curl -X GET "https://demo.Firefly-iii.org/api/v1/about" -H  "accept: application/vnd.api+json" -H  "Authorization: Bearer トークン(長いので割愛)

必要なヘッダは

  • accept: application/vnd.api+json
  • Authorization: Bearer

で、Authorizationヘッダにトークンを書けばいい様です。
頭についているBearerって何だ?

Bearer認証

The OAuth 2.0 Authorization Framework: Bearer Token Usage(日本語)

OAuth2.0の仕様の1つで署名無しトークンという意味らしいです。
本人確認はせず、このトークンを持っていれば使えるということです。
他の人の手に渡ったら使われてしまうということですね。

他の認証方法もあるんでしょうか。今回は調べませんが、気になります。

ちなみにBearer認証でもOAuthはトークン発効前にクライアントの認証があるし、私の個人トークン発効でも今回の環境では問題なさそうです。

アクセス

本題。
自分のFirefly iiiのトークンを発行したのでお試しでユーザ情報を取ってみます。

ドキュメントの文法そのまま。

masashi@DESKTOP-986MNSO:/mnt/c/Users/tsuru$ curl -X GET http://192.168.0.10/api/v1/users -H "accept: application/vnd.api+json" -H "Authorization: Bearer $(cat 'Firefly token.txt')" | jq .
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   578    0   578    0     0  10181      0 --:--:-- --:--:-- --:--:-- 10321
{
  "data": [
    {
      "type": "users",
      "id": "1",
      "attributes": {
        "created_at": "2021-02-06T10:49:23+09:00",
        "updated_at": "2021-02-06T10:49:23+09:00",
        "email": "XXXXXXXX@gmail.com",
        "blocked": false,
        "blocked_code": null,
        "role": "owner"
      },
      "links": {
        "self": "http://192.168.0.10/api/v1/users/1",
        "0": {
          "rel": "self",
          "uri": "/users/1"
        }
      }
    }
  ],
  "meta": {
    "pagination": {
      "total": 1,
      "count": 1,
      "per_page": 50,
      "current_page": 1,
      "total_pages": 1
    }
  },
  "links": {
    "self": "http://192.168.0.10/api/v1/users?&page=1",
    "first": "http://192.168.0.10/api/v1/users?&page=1",
    "last": "http://192.168.0.10/api/v1/users?&page=1"
  }
}

ちゃんと取れてます。
一応伏せましたが、emailの値がユーザ情報でログインに使います。

まとめ

OAuth関連の仕組みを使うのは初めてだったのでドキュメント探しに手こずりましたが、とりあえずAPIは突ける様になりました。
もちろんPOSTもできるので、またcsvからの変換ツールを作らないといけないですね。
shellでやるかpythonでやるか悩みます。