LINE Notifyが終了するのでゴミ出しbotをLINE Messaging APIに乗り換えた話

# はじめに

私が運営するシェアハウスではLINE Notify + [IFTTT](https://ifttt.com/line) + gasで作ったゴミ出しbotを使っていました。

![スクリーンショット 2025-03-23 13.51.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/167220/048dae6d-b7a7-45e1-9ddf-537cb2ab6e93.png)

しかしながら、LINE Notifyが2025年3月末で終了するとのことで、、、

https://notify-bot.line.me/closing-announce

今まで使ってたゴミ出しbotが使えなくなる！

これはやばい！ということで公式でも推奨されていたLINE Messaging APIを使った方法に乗り換えたお話です。

**ゴミ出し通知を出すためのgasのソースコードは、ほぼそのまま使えます！**
設定を色々と触るだけでできました:raised_hands:

# 用語について
LINEのAPIや公式アカウントを使って開発しようとすると、難しい用語がたくさん出てきますw
LINE NotifyとIFTTTで実装していた頃は公式アカウントを使っていなかったので難しい用語は出てきませんでしたが、このあと色々と難しい用語が出てきます。

特に「プロバイダー」と「チャネル」が最初はよくわからないと思います。

イメージとしてはこちらです。

![スクリーンショット 2025-03-23 14.15.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/167220/f4b7f6eb-1654-407f-9bcb-2a9c793b11c3.png)

https://blog.socialplus.jp/knowledge/line-developers/

「プロバイダー」がの下に紐付くのが「チャネル」であり、「チャネル」は各種LINE APIで使える機能たち、という感じでしょうか！

これらの関係性を意識して、この先を読み進めると理解がしやすいかなと思います！


# LINE公式アカウントを作る
LINE公式アカウントの作り方は色々なところで解説されていると思うので、詳細な手順についてはここでは省きます。
重要なところをピックアップします。

まずはLINE Official Account Managerにログイン
https://manager.line.biz/

## LINE Messaging APIを有効化

https://qiita.com/course_k/items/00804420e61b7514bf30#messaging-apiの有効化

👆を参考にLINE Messaging APIを有効化します。

## LINE公式アカウントのデフォルト設定を変える
設定 > アカウント設定 > 機能の利用

「グループ・複数人トークへの参加を許可する」を選択
![スクリーンショット 2025-03-23 14.22.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/167220/726ef437-5998-43d4-ae99-f329078d08c7.png)
**これを設定しないと、グループに公式LINEを招待しても参加できない。**

設定 > 応答設定 > Webhook
LINEプラットフォームからWebhook URLにWebhookイベントを送信するようにする。
![スクリーンショット 2025-03-23 14.27.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/167220/b4fd7d1d-6163-48c8-8237-9f5bb6660f17.png)

# LINEグループIDの特定
まずはゴミ出し通知を出したいLINEグループに、作ったLINE公式アカウントを入れましょう。

そしてBOTが自ら発信をするためには、LINEのグループを特定する必要があるそうです。
LINEグループIDを取得するため、GASで取得を行います。

参考にする手順はこちら

https://qiita.com/enbanbunbun123/items/2504687e4b6c13a289db#2gasでgroup-idを取得するプロジェクトをデプロイ

基本的に👆の通りにすればLINEグループIDの特定はできます。
注意点としては以下２つ

### `ACCESS_TOKEN`

```javascript
// LINE developers記載のアクセストークン
var ACCESS_TOKEN = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx';
```

この部分の`ACCESS_TOKEN`は

[LINE Developers](https://developers.line.biz/ja/services/messaging-api/)のコンソール > プロバイダーを選択 > Messaging APIチャネルを選択 > Messaging API > Channel access token

から取得します。

![スクリーンショット 2025-03-23 14.56.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/167220/5216ea0a-4f76-4c9e-a08b-95da70723f8d.png)



### アクセスできるユーザーは「全員」
gasでウェブアプリとしてデプロイする際に、アクセスできるユーザーは「全員」にしましょう。
![スクリーンショット 2025-03-18 18.51.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/167220/858691ed-c1c2-4468-abbd-99ce8182fbc3.png)
もし「全員」が選択肢になかった場合、Google Driveの中からスプシを作るのではなく、スプレッドシートから作ってみましょう。
![スクリーンショット 2025-03-23 14.49.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/167220/df216178-d8da-461a-8913-f108f4d6b63c.png)

これでグループ内に何か発言するとLINEグループIDが返ってきます！

![スクリーンショット 2025-03-23 15.11.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/167220/e173484b-382c-4c55-943d-844c70b8a86e.png)

今のままでは無限に返信してくるので、IDがわかったらgasのコードを消してまたデプロイしましょう。
デプロイしたら、その度にデプロイURLをLINE DevelopersのWebhook URLに置き換えましょう。

![スクリーンショット 2025-03-23 15.15.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/167220/9e4d1148-580c-4890-a3dd-dc2da7d3c2b0.png)

![スクリーンショット 2025-03-23 15.23.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/167220/8f46818e-d622-415a-bad3-0a31d7ea80b0.png)



# gasを実装する

ではgasを実装していきましょう！
LINE Notifyの頃に使っていたコードをほぼそのまま使い回しています。

```javascript
const ACCESS_TOKEN = 'xxxxxx'; // LINE developers記載のアクセストークン
const GROUP_ID = 'xxxxxx'; // 取得したLINEグループのID

function getDayAndCount(date) {
  return { day: date.getDay(), count: Math.floor((date.getDate() - 1) / 7) + 1 };
}

function mondayFunction() {
  var content = "月曜日は資源ゴミの日です！\n";
  content += "\n資源ごみは瓶缶ダンボールです。\n外に置いときましょう！";
  content = sameMessage(content);
  
  sendLineMessage(content);
}

function tuesdayFunction() {
  var content = "火曜日は燃やすゴミの日です！\n";
  content += "燃やせるやつを捨てましょう！燃えるゴミは朝8時までです。\n庭にあるデカいゴミ箱も確認して出してね( ^ω^ )";

  sendLineMessage(content);
}

function wednesdayFunction() {
  var content = "";
  let dt = new Date();

  dt.setDate(dt.getDate() + 1);

  let day = getDayAndCount(dt);
  if (day.count == 5) {
    content += "今日は第五週目の水曜日なのでゴミ出ししなくていいよ！ありがとう！\n";
  } else if (day.count == 1 || day.count == 3) {
    content += "第一第三水曜は不燃ごみの日です！不要なガラクタを出しましょう！\n";
    content = sameMessage(content);
  } else if (day.count == 2 || day.count == 4) {
    content += "第二第四水曜はペットボトルのゴミの日です！よく溜まってるから頑張って！！\n";
    content = sameMessage(content);
  } else {
    return;
  }

  sendLineMessage(content);
}

function fridayFunction() {
  var content = "金曜日は燃やすゴミの日です！\n";
  content += "\n土日が来るから頑張って捨てよう！全部燃やし尽くすよ！！！\n庭にあるデカいゴミ箱も確認して出してね( ^ω^ )";

  sendLineMessage(content);
}

function sameMessage(message) {
  message += '近くにいる人にも声を掛けて、みんなで協力して捨てに行きましょう！一人だと大変なのよ( ；∀；)';
  return message;
}

function sendLineMessage(message) {
  const url = 'https://api.line.me/v2/bot/message/push';
  const headers = {
    "Content-Type": "application/json",
    "Authorization": "Bearer " + LINE_CHANNEL_ACCESS_TOKEN
  };

  const payload = {
    to: GROUP_ID,
    messages: [{ type: "text", text: message }]
  };

  const options = {
    method: 'post',
    headers: headers,
    payload: JSON.stringify(payload)
  };

  UrlFetchApp.fetch(url, options);
}
```

スクリプトをデプロイしたらトリガーを設定します。
![スクリーンショット 2025-03-23 17.33.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/167220/5cee0068-fc78-48da-bb47-2abbb539cec7.png)

実行したい関数を週ベースのタイマーで設定します。

![スクリーンショット 2025-03-23 17.34.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/167220/2b5246c3-f0cb-4e65-9601-2a91ea4df059.png)

![スクリーンショット 2025-03-23 17.39.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/167220/4a0f83b8-649a-44e7-9d75-b42b0a2eee1a.png)

設定した時間に公式LINEから通知が来ました！！！
これで完成！