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
}
}