🥨

[続き] Misoca API v3を使って、請求書を複製し続けたくなった

に公開

こんにちは☀️
TRUSTART株式会社のみつです!

前回の記事では、Misoca API v3を使ってみたり、請求書の複製をしてみたりしました。

せっかくなので実際に使いたい〜〜と思い、さらに気分で実装を続けている記事です!

前回書いた記事

https://zenn.dev/trustart_dev/articles/ef4a4ffbf386b4

前回まで

前回は、

  • 認証までしてみる
  • トークンを取得してみる
  • リフレッシュトークンを取得して、使ってみる
  • 請求書を取得してみる
  • 請求書を複製してみる

をしました。

今回は、そのリフレッシュトークンが切れない(ローカルの実行では、.envを更新する処理を入れていますがそこで失敗してしまったりしない)前提で、毎月の請求書を複製し続けるバッチを実装してみたいと思います。

セキュリティとかガン無視な感じで、何やらすみません☺️

リフレッシュトークンに使用したコード
  1. mkdir test & cd test
  2. npm init -y
  3. npm install express axios
  4. touch server.js
  5. 下記のコードを書いておく(ChatGPTで生成しました)
serve.js
const express = require("express");
const axios = require("axios");
const app = express();

const CLIENT_ID = "アプリケーションID";
const CLIENT_SECRET = "シークレット";
const REDIRECT_URI = "http://localhost:3000/callback";

app.get("/callback", async (req, res) => {
  const code = req.query.code;

  try {
    const tokenRes = await axios.post(
      "https://app.misoca.jp/oauth2/token",
      new URLSearchParams({
        grant_type: "authorization_code",
        code: code,
        redirect_uri: REDIRECT_URI,
      }),
      {
        auth: {
          username: CLIENT_ID,
          password: CLIENT_SECRET,
        },
        headers: {
          "Content-Type": "application/x-www-form-urlencoded",
        },
      }
    );

    res.send(`
      <h1>アクセストークン取得成功!</h1>
      <pre>${JSON.stringify(tokenRes.data, null, 2)}</pre>
    `);
  } catch (error) {
    console.error("Token error:", error.response?.data || error.message);
    res.send(
      `<h1>エラー発生</h1><pre>${JSON.stringify(
        error.response?.data || error.message,
        null,
        2
      )}</pre>`
    );
  }
});

app.listen(3000, () => {
  console.log("サーバー起動中: http://localhost:3000");
});

前回使用したURL等

  • Misoca API v3 API ドキュメント

https://doc.misoca.jp/

  • Misoca API v3 アプリケーション管理画面

https://app.misoca.jp/oauth2/applications

今回のゴール

今回のゴールは、

  1. Dockerを立ち上げる
  2. リフレッシュトークンを使ってnode batch.jsが実行される
  3. 請求書を複製する
  4. 再発行されたリフレッシュトークンを持って、.envを更新する

まで一通りやってみたいと思います!

Dockerまで完成すれば、CronやCloud Run Jobなど何かしらの設定をして、毎月請求書を複製し続けることもできそうです。

ちなみにGoogle Cloudで動かすことを前提にDockerfileを作ってみたのですが、AWSでも同じようなことは実現できるかも(あまり深く調査はしていません)

Cloud Storageを利用しているのも深い意味はないですが、ローカルが.envを更新するという感じなので、Secret Managerを使わずCloud Storageのテキストファイルを更新するようにしてみました☺️

xxx@xxx misoca % make run
・・・
Misoca月次請求書複製バッチ開始: Thu Jun 26 04:43:48 UTC 2025
[INFO] 月次請求書複製処理開始: 2025-06-26T04:43:49.024Z
[INFO] リフレッシュトークンを使用してアクセストークンを取得中...
[SUCCESS] リフレッシュによるアクセストークン取得成功
[INFO] 新しいrefresh_tokenが発行されました。.envファイルを自動更新します。
[INFO] .envファイルを更新中...
[SUCCESS] .envファイルの更新が完了しました
[INFO] 新しいREFRESH_TOKEN: Jv0a9xiU...
[INFO] 元請求書を取得中... (ID: XXX)
[SUCCESS] 元請求書取得成功: "4月分 | 請求書"
[INFO] 請求先: 取引先情報なし
[INFO] 明細数: 2[INFO] 請求書を複製中...
[INFO] 複製後タイトル: "6月分 | 請求書"
[INFO] 発行日: 2025-06-30, 支払期限: 2025-07-31
[SUCCESS] 請求書複製成功: "6月分 | 請求書"
[SUCCESS] 新規請求書ID: XXX
[INFO] 請求書URL: https://app.misoca.jp/invoices/XXX
[SUCCESS] 月次請求書複製処理完了: 2025-06-26T04:43:49.652Z
[INFO] 処理時間: 628ms
Misoca月次請求書複製バッチ完了: Thu Jun 26 04:43:49 UTC 2025

xxx@xxx misoca % make run  
・・・
Misoca月次請求書複製バッチ開始: Thu Jun 26 04:43:51 UTC 2025
[INFO] 月次請求書複製処理開始: 2025-06-26T04:43:51.643Z
[INFO] リフレッシュトークンを使用してアクセストークンを取得中...
[SUCCESS] リフレッシュによるアクセストークン取得成功
[INFO] 新しいrefresh_tokenが発行されました。.envファイルを自動更新します。
[INFO] .envファイルを更新中...
[SUCCESS] .envファイルの更新が完了しました
[INFO] 新しいREFRESH_TOKEN: 7xSoz0jY...
[INFO] 元請求書を取得中... (ID: XXX)
[SUCCESS] 元請求書取得成功: "4月分 | 請求書"
[INFO] 請求先: 取引先情報なし
[INFO] 明細数: 2[INFO] 請求書を複製中...
[INFO] 複製後タイトル: "6月分 | 請求書"
[INFO] 発行日: 2025-06-30, 支払期限: 2025-07-31
[SUCCESS] 請求書複製成功: "6月分 | 請求書"
[SUCCESS] 新規請求書ID: YYY
[INFO] 請求書URL: https://app.misoca.jp/invoices/YYY
[SUCCESS] 月次請求書複製処理完了: 2025-06-26T04:43:52.103Z
[INFO] 処理時間: 460ms
Misoca月次請求書複製バッチ完了: Thu Jun 26 04:43:52 UTC 2025

xxx@xxx misoca %

完成したコードたち

こんな感じの構成です。

https://github.com/mitsu0428/misoca-automation/tree/main

処理の流れ

それぞれのファイル

  • .env
    • 環境変数
  • .gitignore
    • .env.DS_Store等を除外しているだけ
  • batch.js
    • 月次請求書複製メイン処理(リフレッシュトークン→請求書取得→複製作成)
  • Dockerfile
    • Node.js 22 Alpine
  • Makefile
    • Docker操作コマンド(build, run等)
  • package-lock.json
    • 依存関係バージョン固定
  • package.json
    • 依存関係とスクリプト定義(axios, dotenv, express)
  • server.js
    • コールバック受信サーバー(初回認証用、今のところ未使用)

.envの中身

.env.sample
CLIENT_ID={アプリケーションID}
CLIENT_SECRET={シークレット}
REDIRECT_URI=http://localhost:3000/callback

# 初回認証用(必要に応じて)
AUTH_CODE=

# 本番運用で必要
REFRESH_TOKEN={リフレッシュトークン}
SOURCE_INVOICE_ID={請求書ID}

# Cloud Run Jobs環境でのGCS設定(オプション)
GCS_BUCKET_NAME={GCSのバケット名}

# 環境識別(本番環境で production に設定)
NODE_ENV=development

あとは、Dockerファイルを動かすとか

ひとまず、ローカル環境で何度か実行しても請求書を複製できる環境が整いました。

実際に動かす時は、Cloud Storageへの読み書きでリフレッシュトークンを利用・更新するようにしてみたり。

本当ならSecret Managerなどを利用するのが良いのだろうかとも思いつつ・・・

ひとまず実装はここまでにして、追加もまたノリと勢いで作っていこうと思います。

まとめ

今回は、Misoca API v3を使って、請求書を複製し続けてみました。

次は、Cloud Run Jobsでバッチの設定を設定して、本当に動かし続けるようにしたいなぁ。

おわり。

参考

https://doc.misoca.jp/

https://app.misoca.jp/oauth2/applications

https://cloud.google.com/security/products/secret-manager?hl=ja

最後に

TRUSTART株式会社は、一緒に働くメンバーを募集しています!
インターンメンバーも大募集中です!
興味を持っていただいた方は、ぜひ弊社のページをご確認ください!!!

https://www.trustart.co.jp/recruit/

TRUSTARTテックブログ

Discussion