API GAS

GASでfreee会計にログインして「口座を同期する」ボタンを押下する

freee会計の機能で、銀行口座のデータを同期・取得することができます。

しかし、同期の頻度が不定期となっていて「(ほぼ)リアルタイムの情報を取得」というニーズには合致しません。

(ほぼ)リアルタイムの情報を取得するためにはデータ取得前にfreee会計画面にある「口座を同期」ボタンを押下する必要がありますが、この機能はfreee会計APIに実装されていません。

RPAやプログラムで「口座を同期」ボタンを押下する必要があり、前提条件として「定期実行が可能」で「サーバーレスな実行が可能」というものがありました。

そこで「GASの定期実行」で「口座を同期」ボタンを押下することにしました。

完成コード

//freeeへのログイン処理
function loginAndSync() {
  var today = new Date();
  var hours = today.getHours();
  //処理実施の時間帯を限定(夜間は実施しない)
  if(9 <= hours && hours <= 18){
    //ログインページ
    var response = UrlFetchApp.fetch('https://accounts.secure.freee.co.jp/login/accounting')
    var cookies = response.getAllHeaders()["Set-Cookie"];
    var c_freee_accounts_session = cookies[2]
    var token = Parser.data(response.getContentText("UTF-8")).from('name="authenticity_token" value="').to('" autocomplete').build()
    
    Utilities.sleep(1000)

    //ログイン処理
    headers = {
      'cookie': c_freee_accounts_session,
      'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36'
    }
    payload = {
      'authenticity_token': token,
      'email': 'ここにはログインID',
      //パスワードは暗号化されたもの
      'password': 'ここにはログインパスワード'
    }
    options = {
      'method': 'POST',
      'headers': headers,
      'payload': payload,
      'followRedirects': false
    }
    response = UrlFetchApp.fetch('https://accounts.secure.freee.co.jp/login/accounting', options)
    cookies = response.getAllHeaders()["Set-Cookie"];
    var c_n_auth_session_id = cookies[0]
    c_freee_accounts_session = cookies[2]

    Utilities.sleep(1000)

    //リダイレクト
    headers = {
      'cookie': c_n_auth_session_id,
      'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36',
    }
    options = {
      'method': 'GET',
      'headers': headers,
      'followRedirects': false,
    }
    response = UrlFetchApp.fetch('https://secure.freee.co.jp/users/after_login', options)
    cookies = response.getAllHeaders()["Set-Cookie"];

    Utilities.sleep(1000)

    //会計トップへ
    response = UrlFetchApp.fetch('https://secure.freee.co.jp', options)
    var c_session_id = response.getAllHeaders()["Set-Cookie"];
    var csrf_token = Parser.data(response.getContentText("UTF-8")).from('name="csrf-token" content="').to('" />').build()
    headers = {
      'cookie': c_n_auth_session_id + "; " + c_session_id,
      'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36',
      'X-Company-Id': 'ここには会社コードを入力',
      'X-Csrf-Token': csrf_token,
      'X-Xhr-From': 'request'
    }
    options = {
      'method': 'PUT',
      'headers': headers,
      'muteHttpExceptions': true
    }
    id = 'ここにはwalletableIDを入力'
    type = 'ここにはwalletableTypeを入力'
    response = UrlFetchApp.fetch('https://secure.freee.co.jp/api/p/walletables/' + id + '/sync?walletable_type=' + type +'', options)
  }
  else{
    return
  }
}

-API, GAS