見出し画像

カードの使用履歴をLINEに通知して無駄遣いを減らす

私は現在大学生でデビッドカードを持っています。

なぜクレジットカードではないのか?

それは単純に使いすぎて翌月に自己破産するからです(笑)

私以外にもカードだとついつい使いすぎちゃう人は多いと思います。その気軽さがカードの悪い点とも言えますね。

今回はカードの無駄遣いを減らすために、カードを使用するたびにLINEに通知して強制的に罪悪感を植え付けることにします。

作ったもの

私は普段Pythonを使いますが、常時実行するにはサーバーが必要になります。サーバーを持っていない人はレンタル(有料)する必要があるし、持っていたとしても準備が面倒ですよね。

そんなときに便利なのがGoogle Apps Script (略してGAS)です。

これはGoogleのサービスでサイト上でコーディングができるので開発環境を用意する必要がなく、さらに常時実行なども無料でできます。

今回はこれを使います。

ソースコードをこんな感じで作成しました。

function SetTrigger(){
  var today = new Date();
  var year = today.getFullYear();
  var month = today.getMonth();
  var day = today.getDate();
  let date = new Date(year, month, day+1, 0, 1);
  ScriptApp.newTrigger('GetEmailOnDay').timeBased().at(date).create();
}

function DeleteTrigger(){
  let triggers = ScriptApp.getProjectTriggers();
  for (let trigger of triggers){
    let funcName = trigger.getHandlerFunction();
    if(funcName == 'GetEmailOnDay'){
      ScriptApp.deleteTrigger(trigger);
    }
  }
}

function GetEmailOnDay() {
  var today = new Date();
  var yesterday = new Date(today);
  yesterday.setDate(today.getDate() - 1);
  var startOfYesterday = new Date(yesterday.getFullYear(), yesterday.getMonth(), yesterday.getDate(), 0, 0, 0);
  var endOfYesterday = new Date(yesterday.getFullYear(), yesterday.getMonth(), yesterday.getDate(), 23, 59, 59);
  GetEmail(startOfYesterday, endOfYesterday, yesterday);
}

function GetEmail(startTime, endTime, day) {
  var from = "mail@debit.bk.mufg.j";

var threads = GmailApp.getInboxThreads();

  var yesterday = new Date(day);
  var Month = yesterday.getMonth()+1;
  var Day = yesterday.getDate(); 

  outerloop: for (var i = 0; i < threads.length; i++) {
    var messages = threads[i].getMessages();

    for (var j = 0; j < messages.length; j++) {
      var message = messages[j];
      var timestamp = message.getDate();
      if (timestamp >= startTime && timestamp <= endTime) {
        if (message.getFrom() === from){
          var body = message.getBody()
          var amountMatch = body.match(/ご利用金額(円)\s*:\s*([\d,]+)/);
          var shopMatch = body.match(/ご利用先\s*:\s*([^\n\r]+)/);
          var amount = amountMatch[1].replace(/,/g, ''); 
          var shop = shopMatch[1].trim();
          var amount = parseInt(amount).toLocaleString();
          var message = '\n\n【'+ Month + '月' + Day + '日】\n\n利用金額:' + amount + '円\n利用先:' + shop;
          NoticeToLINE(message);
        }
      }else{
        break outerloop;
      }
    }
  }
  message = '\n\n【'+ Month + '月' + Day + '日】\n\nカードの利用はありませんでした'
  NoticeToLINE(message);
  DeleteTrigger();
  SetTrigger();
}

function NoticeToLINE(message) {
  var accessToken = 'LINE NOTIFY ACCESS TOKEN';
  var lineNotifyApi = 'https://notify-api.line.me/api/notify';

  var option = {
    'method': 'post',
    'headers': {
      'Authorization': 'Bearer ' + accessToken, 
    },
    'payload': {
      'message': message
    },
  };
  var response = UrlFetchApp.fetch(lineNotifyApi, option);
  if (parseInt(response.getResponseCode()) != 200){
    Logger.log("message:"+message);
    Logger.log(response.getContentText());
  }
}

最近GASを使い始めましたが、コーディングに関してはJavaScriptとよく似てるので簡単ですね。

72行目にLINE Notifyにトークンを貼り付ければ完成です。

あとはGetEmailOnDay()を実行すれば、前日のカードの使用通知をGmailから取得してきて、LINE Notify経由でメッセージを送信してくれます。

こんな感じ↓↓

ソースコードと使い方についてはGitHubのREADME.mdを見てください。

自由に改良して使ってください。


この記事が気に入ったらサポートをしてみませんか?