LINE Notifyを使った電車遅延通知

普段在宅勤務ですが、通勤時に駅まで行って電車が止まってたら労働意欲を削がれるのであらかじめ遅延情報を知りたい。
怒りの出戻り時に思いついたのでスクリプトはAIに任せたら昼休みに食事しながら作成できました。
普段からGoogleカレンダーに出社日を登録し、チーム内に共有しているのでそれを使うことにしました。

## 流れ
1. Googleカレンダーの勤務場所が「オフィス」の日の指定時間に
![スクリーンショット 2024-06-13 8.20.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/322108/14934e2c-d9cf-ee1b-23a0-90fd9679d864.png)
2. Yahoo路線情報のページから指定路線の情報を取得
![スクリーンショット 2024-06-13 8.15.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/322108/6e2e42a5-08f8-6536-72e4-61fc522c21fd.png)
3. LINE Nortifyで取得したテキストを送信
![Screenshot_20240612-223839.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/322108/bf08d063-8ceb-8797-ec3e-e04e3075d382.png)

となります。
GASで作り、指定時間はトリガーで設定することにします。
LINEを他のメッセージ・チャットアプリに変更するのも可能かと思います。

## 事前準備
LINE Nortifyのトークンを取得します
[LINE Notify アクセストークン発行方法](https://firestorage.jp/business/line-notify/)

Yahoo路線情報のURL
投稿するにあたって複数路線に対応してみたが未検証

## GAS
Yahoo路線情報のページ内容の取得にはCheerioライブラリを使用します。
[GASを使ったスクレイピングのやり方](https://qiita.com/kakakaori830/items/e97882e2d09f3a4f6bac)
ライブラリにCheerioを追加しておきます。

スクリプト作成はAI任せ。
### Googleカレンダーの勤務場所の判定
~~~javascript
function getWorkLocationAndNotify() {
  const calendarId = Session.getActiveUser().getEmail();
  const calendar = CalendarApp.getCalendarById(calendarId);
  
  // 日本時間（JST）に設定
  const timeZone = 'Asia/Tokyo';
  
  // 今日の日付を日本時間で取得
  const today = new Date();
  const startTime = new Date(today.getFullYear(), today.getMonth(), today.getDate());
  const endTime = new Date(today.getFullYear(), today.getMonth(), today.getDate() + 1);
  
  // 今日のイベントを日本時間で取得
  const events = calendar.getEvents(startTime, endTime, { timeZone: timeZone }); 
  let workLocation = '';
  
  events.forEach(event => {
    // イベントのタイトルを取得
    const title = event.getTitle();
    const description = event.getDescription();
    const location = event.getLocation();
    Logger.log('イベントのタイトル: ' + title);
    Logger.log('イベントの説明: ' + description);
    Logger.log('イベントの場所: ' + location);
    if (title.includes('オフィス')) {
      workLocation = title;
    }
  });
~~~

### スクレイピングと通知
~~~javascript
function fetchServiceStatusesAndNotify() {
  const urls = [
    'https://transit.yahoo.co.jp/diainfo/267/0',
    'https://transit.yahoo.co.jp/diainfo/268/0', // ここに追加の路線URLを記入
    // 他の路線URLを追加
  ];
  
  let combinedStatus = '';

  urls.forEach(url => {
    const response = UrlFetchApp.fetch(url);
    const html = response.getContentText();
    
    // Cheerioを使用してHTMLをパース
    const $ = Cheerio.load(html);
    
    // #mdServiceStatusのテキストを取得
    const statusText = $('#mdServiceStatus').text().trim();
    
    Logger.log(statusText);
    
    combinedStatus += `路線情報 (${url}):\n${statusText}\n\n`;
  });
  
  // LINE Notifyトークン
  const lineToken = 'YOUR_LINE_NOTIFY_TOKEN';  // ここにあなたのLINE Notifyトークンを入れてください
  
  // LINE Notifyに通知を送信
  const options = {
    'method': 'post',
    'headers': {
      'Authorization': 'Bearer ' + lineToken
    },
    'payload': {
      'message': combinedStatus
    }
  };
  
  UrlFetchApp.fetch('https://notify-api.line.me/api/notify', options);
}
~~~

### トリガーの作成
![スクリーンショット 2024-06-13 8.42.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/322108/081be338-a1c9-b9df-5f70-6002818862d3.png)
時刻は通知してほしい時間帯に設定
これで毎日指定時刻になるとgoogleカレンダーの勤務場所をチェックし、オフィスならば遅延情報をLINEに送るようになります。