準備するもの
- freeeのアカウント(API使えるようにDeveloper Accountも)
- エディタ(自分はpyCharmでやってます)
- コマンドラインツール(Macユーザならターミナル)
- pip(今回はseleniumとrequestsを利用)
作業Steps
- freeeアカウントの登録
- アクセストークンの取得(ここがメイン)
- APIを利用して、事務所データの取得
ゴールイメージ
{'companies': [{'display_name': '表示名',
'id': 会社id,
'name': '会社名',
'name_kana': '会社名(カナ)',
'role': 'admin/read_only等の役割'},
{'display_name': 'テストユース',
'id': 1099128,
'name': None,
'name_kana': None,
'role': 'admin'}]}
freeeアカウント関係
freeeの会計アカウントを保持していただいている前提で、以下の開発ポータルに登録・ログインしてください。

以下のチュートリアルの流れにそって、アプリの新規登録まで実施します。
アプリ登録が完了すると、以下のようにアプリの情報が表示されます。
今回の場合、LocalのPythonからアクセスするので、コールバックURLはそのままで大丈夫です。
この画面を下にスライドさせていくと以下の情報がありますので、メモしておいてください。
・Client ID
・Client Secret
・Webアプリ認証用URL
・モバイル、JS用認証用URL(今回は利用しません)
ちなみにではありますが、freeeAPIはWeb認証については、OAuth2.0で言われる所の認可コードフローを採用しているようです。ただ、PKCEは採用されていないようなので、取引登録等の更新系のフローを採用することは現段階のセキュリティ水準だとあまりおすすめできない気がします。

アクセストークンの取得
認可コードの取得
from selenium import webdriver
import chromedriver_binary
url = "freeeで表示されるWebアプリ認証用URLを挿入"
driver = webdriver.Chrome()
driver.get(url)
seleniumを別に使う必要はなく、Webアプリ認証用URLをブラウザに打ち込むだけでもいけますが、継続して利用することを想定してSeleniumで対応しています。
実行すると、Webブラウザ(今回はクローム)が立ち上がりますので、そこでfreeeのアカウントIDとパスワードを入力してログインしてください。認可コードがブラウザ上に表示されます。
アクセストークンの取得
import requests
token_url = "https://accounts.secure.freee.co.jp/public_api/token"
redirect_uri = "urn:ietf:wg:oauth:2.0:oob" ###今回はLocalのPythonを利用するので変更不要
client_id = "アプリ詳細画面に表示されるClient Idを入力"
client_secret = "アプリ詳細画面に表示されるClient Secretを入力"
code = "先ほど取得した認可コードを入力"
### API URL
# トークン取得用API
AUTHORIZE_API_URL = 'https://accounts.secure.freee.co.jp/public_api/token'
params = {
'grant_type' : 'authorization_code',
'client_id' : client_id,
'client_secret' : client_secret,
'code' : code,
'redirect_uri' : redirect_uri
}
headers = {
'Content-Type': 'application/x-www-form-urlencoded'
}
r = requests.post(AUTHORIZE_API_URL, params=params, headers=headers)
data = r.json()
print(data)
先ほどらいで保存した一式のデータ(Client ID, Client Secret, 認可コード)を設定して、request処理をするとアクセストークン関連の情報がJSON形式で払い出されます。
{'access_token': '複数の文字数値列', 'token_type': 'bearer', 'expires_in': 86400, 'refresh_token': '複数の文字数値列', 'scope': 'read write default_read', 'created_at': 1559239562}
access_tokenに記載された文字数値列が今回取得しようとしてるアクセストークンとなります。トークンってシステム的には様々な情報を織り込んだ数値文字列(ハッシュ化されたもの)のことです。
expires_inに86400とありますが、これは86400秒(24時間)でこのアクセストークンが失効する(有効でなくなる)ということを意味しています。すぐにアクセストークンが使えなくなるので、その際は別途記事にしますが、refresh_tokenを利用してaccess_tokenを再度利用できるようにする必要があります。
事業所一覧の取得
import requests
import pprint
# 事業所一覧の取得用API
COMPANY_API_URL = 'https://api.freee.co.jp/api/1/companies'
# カンパニーIDの取得(他のどの情報を取得するのにもユーザーIDかカンパニーIDが必須らしい)
headers = {
'Content-Type': 'application/json',
'Authorization': 'Bearer ' + "アクセストークンの文字数値列を入力"
}
r = requests.get(COMPANY_API_URL, headers=headers)
data = r.json()
pprint.pprint(data)
先ほど取得したアクセストークンを利用して、事業所取得用APIエンドポイントにrequest処理を投げ込むと、JSON形式で事業所一覧の情報が返却されます。
{'companies': [{'display_name': '表示名',
'id': 会社id,
'name': '会社名',
'name_kana': '会社名(カナ)',
'role': 'admin/read_only等の役割'},
{'display_name': 'テストユース',
'id': 1099128,
'name': None,
'name_kana': None,
'role': 'admin'}]}
これは自身の会計freeeアカウントに紐づけられている事業所情報の一覧となります。そのため、複数の事業所が登録されている場合、JSONの中に複数事業所情報が入ってきます。
まとめ
今回はfreeeAPIをローカルのpython環境から利用して、アクセストークンと事業所一覧を取得しました。
事業所一覧を取得するだけでは、特段業務に役立つものではないですが、freeeAPIには参照系(データを取得するAPI)・更新系(データを登録するAPI)含めて、いろいろなAPIが提供されていますので、ぜひドキュメントを読んでみてもらえればと思います。
ただ、現時点で以下の問題がまだfreeeAPIにはありそうです。
・APIの設計やドキュメントの更新が不十分で、ちょっと使いにくい(適切なAPIを選び出すのに手間取る)
・PKCEが採用されていないようで、トークンの奪い取りに対するリスクがあるため、更新系の利用は個人的にはおすすめできない
まだまだこれからのAPIという感じですが、今ある参照系のAPIを利用するだけでも、予実分析用の実績データを毎回csvで吐き出して、整形して、予算と比較するみたいな作業だったら、比較結果までは一括で表示できるようになると思います(もちろん別途ローカルでのpython開発は必要ですが)。リスクが薄い部分であれば、積極的に利用して業務効率化を進めてもらえればと思います。