9
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

LINEに本日開催のインフラ勉強会を通知する

Posted at

対象者

  • インフラ勉強会に参加している人
  • インフラ勉強会に興味がある人
  • とりあえずGASでなにか作ってみたい人

背景

最近インフラ勉強会(Discordを使用して行われるオンラインの勉強会)に参加することが増えてきたので、その日開催される勉強会のタイトルと時間を毎日LINEに通知するようにGoogleAppsScriptとLineNotifyを使って組んでみました。

準備

Googleアカウントの発行

Googleアカウントの発行(GmailもっていればOK)をしましょう。

アクセストークン取得

まずLineNotifyのアクセストークンをこちらから発行してください。

実装

Googleスプレッドシートで新規シートを開いてツールからスクリプトエディタを選択します。Google Apps Scriptのエディタが開きますので、下記コードを実装します。

infra.gs
var LINE_NOTIFY_TOKEN = [取得したアクセストークン];
var LINE_NOTIFY_API = "https://notify-api.line.me/api/notify";
var INFRA_CALENDAR = "https://wp.infra-workshop.tech/events/";

function sendInfraSchedule() {
  var today = new Date();
  var targetYMD = today.getYear() + "-" + ("0" + (today.getMonth()+1)).slice(-2) + "-" + ("0" + today.getDate()).slice(-2); //YYYY-MM-DD形式
  var bodyItem = ["-本日のインフラ勉強会-"];
  var targetURL = INFRA_CALENDAR + targetYMD;
  
  var searchTagTitle = "<h3 class=\"tribe-events-list-event-title summary\">";
  var searchTagTitleStart = " rel=\"bookmark\">";
  var searchTagA = "\t</a>";
  var searchTagDateStart = "<span class=\"tribe-event-date-start\">";
  var searchTagDateEnd = "\t</div>";
  
  var response = UrlFetchApp.fetch(targetURL);
  var html = response.getContentText("UTF-8");
  
  //タイトルの個数取得
  var num = html.split(searchTagTitle).length - 1;
  
  var index = 0;
  
  for (var i = 0; i < num; i++) {
    //タイトルの取得
    index = html.indexOf(searchTagTitle);
    if (index !== -1) {
      html = html.substring(index + searchTagTitle.length);
      index = html.indexOf(searchTagTitleStart);
      if (index !== -1) {
        html = html.substring(index + searchTagTitleStart.length);
        index = html.indexOf(searchTagA);
        var title = "";
        if (index !== -1) {
          title = html.substring(0, index).trim();
        }
      }
    }
    
    //開始時刻の取得
    index = html.indexOf(searchTagDateStart);
    if (index !== -1) {
      html = html.substring(index + searchTagDateStart.length);
      index = html.indexOf(searchTagDateEnd);
      var date = "";
      if (index !== -1) {
        //タグを削除した状態の時刻を抽出
        date = html.substring(0, index).trim().replace(/<("[^"]*"|'[^']*'|[^'">])*>/g,"");
      }
    }
    bodyItem.push(date + " > " + title);
  }
  if (bodyItem.length == 1) {
    bodyItem.push("今日の予定はありません。");
  }
  _sendMessage(bodyItem.join("\n"));
}

function _sendMessage(msg) {
  // 認証情報のセット
  var headers = {
    "Authorization": "Bearer " + LINE_NOTIFY_TOKEN
  };
  // メッセージをセット
  var payload = {
    "message": msg
  };
  // 送信情報をまとめる
  var options = {
    'method' : 'post',
    'contentType' : 'application/x-www-form-urlencoded',
    'headers': headers,
    'payload' : payload
  };
  Logger.log(options);
  // 実際に送信する
  var response = UrlFetchApp.fetch(LINE_NOTIFY_API, options);
  Logger.log(response);
}

なんかスマートじゃないコードですが、とりあえず動きます^^;
ご指摘いただければリファクタリングしたいと思います。

トリガーの設定

  • Google Apps Script の「編集」 - 「現在のプロジェクトのトリガー」を選択
  • 新しいトリガーを追加
  • 実行欄にsendInfraSchedule
  • イベントに 「時間主導型」「日タイマー」「午前8時~9時」に設定 ※時間はお好みで

以上で完了です!

それでは良いインフラ勉強会ライフを!

9
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?