はじめに
私が運営するシェアハウスではLINE Notify + IFTTT + gasで作ったゴミ出しbotを使っていました。
しかしながら、LINE Notifyが2025年3月末で終了するとのことで、、、
今まで使ってたゴミ出しbotが使えなくなる!
これはやばい!ということで公式でも推奨されていたLINE Messaging APIを使った方法に乗り換えたお話です。
ゴミ出し通知を出すためのgasのソースコードは、ほぼそのまま使えます!
設定を色々と触るだけでできました
用語について
LINEのAPIや公式アカウントを使って開発しようとすると、難しい用語がたくさん出てきますw
LINE NotifyとIFTTTで実装していた頃は公式アカウントを使っていなかったので難しい用語は出てきませんでしたが、このあと色々と難しい用語が出てきます。
特に「プロバイダー」と「チャネル」が最初はよくわからないと思います。
イメージとしてはこちらです。
「プロバイダー」がの下に紐付くのが「チャネル」であり、「チャネル」は各種LINE APIで使える機能たち、という感じでしょうか!
これらの関係性を意識して、この先を読み進めると理解がしやすいかなと思います!
LINE公式アカウントを作る
LINE公式アカウントの作り方は色々なところで解説されていると思うので、詳細な手順についてはここでは省きます。
重要なところをピックアップします。
まずはLINE Official Account Managerにログイン
https://manager.line.biz/
LINE Messaging APIを有効化
👆を参考にLINE Messaging APIを有効化します。
LINE公式アカウントのデフォルト設定を変える
設定 > アカウント設定 > 機能の利用
「グループ・複数人トークへの参加を許可する」を選択
これを設定しないと、グループに公式LINEを招待しても参加できない。
設定 > 応答設定 > Webhook
LINEプラットフォームからWebhook URLにWebhookイベントを送信するようにする。
LINEグループIDの特定
まずはゴミ出し通知を出したいLINEグループに、作ったLINE公式アカウントを入れましょう。
そしてBOTが自ら発信をするためには、LINEのグループを特定する必要があるそうです。
LINEグループIDを取得するため、GASで取得を行います。
参考にする手順はこちら
基本的に👆の通りにすればLINEグループIDの特定はできます。
注意点としては以下2つ
ACCESS_TOKEN
// LINE developers記載のアクセストークン
var ACCESS_TOKEN = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx';
この部分のACCESS_TOKEN
は
LINE Developersのコンソール > プロバイダーを選択 > Messaging APIチャネルを選択 > Messaging API > Channel access token
から取得します。
アクセスできるユーザーは「全員」
gasでウェブアプリとしてデプロイする際に、アクセスできるユーザーは「全員」にしましょう。
もし「全員」が選択肢になかった場合、Google Driveの中からスプシを作るのではなく、スプレッドシートから作ってみましょう。
これでグループ内に何か発言するとLINEグループIDが返ってきます!
今のままでは無限に返信してくるので、IDがわかったらgasのコードを消してまたデプロイしましょう。
デプロイしたら、その度にデプロイURLをLINE DevelopersのWebhook URLに置き換えましょう。
gasを実装する
ではgasを実装していきましょう!
LINE Notifyの頃に使っていたコードをほぼそのまま使い回しています。
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);
}
実行したい関数を週ベースのタイマーで設定します。
設定した時間に公式LINEから通知が来ました!!!
これで完成!