LINE Notify の終了に伴うLINE 公式アカウントへの切り替えの話 

## LINE Notify の終了に伴うLINE 公式アカウントへの切り替え

2024年11月、LINE Notify の提供が終了することが公式に発表されました。
![スクリーンショット 2024-11-29 22.14.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/65992/94cddddd-92c1-e066-aa3c-cffeb7b48a01.png)


これにより、通知機能を活用していた多くのシステムやアプリケーションで変更が必要になります。本記事では、LINE Notify の代替手段として「LINE 公式アカウント」を活用する方法を解説します。実際のコード例も交えながら、設定から実装までを紹介します。

### LINE Notify の終了が意味すること

LINE Notify は、API を介して特定のLINEアカウントにメッセージを送信できるサービスです。この終了により、以下の影響があります。

#### 1.通知の停止
LINE Notify を利用したシステムでは通知が行えなくなります。
#### 2.代替手段の模索
公式アカウントのWebhookやMessaging API を利用した通知に移行する必要があります。

## LINE 公式アカウントを活用した代替手段

LINE 公式アカウントを使えば、LINE Notify のように通知を送信する仕組みを構築できます。具体的には Messaging API を使用します。

## 実装：Google Apps Script を使った通知システム
### 必要な準備
##### 1. LINE Developers コンソールでアカウント作成
・LINE Developers にログイン。
・チャネルを作成し、必要な設定を行う。
##### 2. チャネルアクセストークンの取得
・チャネル設定画面で「チャネルアクセストークン」を発行します。
##### 3. ユーザーIDの取得 (Webhook URL の設定)
・Webhookを受信するサーバーを準備し、そのURLを設定します。サンプルコードの下に詳細は記述しております。

##### 4. Google ドライブで新規の Google Apps Script プロジェクトを作成します。

### サンプルコード
```javascript
// LINE公式アカウントのアクセストークン
const ACCESS_TOKEN = 'YOUR_CHANNEL_ACCESS_TOKEN';

/**
 * LINEにメッセージを送信する関数
 * @param {string} userId - 送信先のユーザーID
 * @param {string} message - 送信するメッセージ
 */
function sendLineMessage(userId, message) {
  const url = 'https://api.line.me/v2/bot/message/push';
  const headers = {
    'Content-Type': 'application/json',
    Authorization: `Bearer ${ACCESS_TOKEN}`,
  };

  const payload = {
    to: userId,
    messages: [
      {
        type: 'text',
        text: message,
      },
    ],
  };

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

  try {
    const response = UrlFetchApp.fetch(url, options);
    Logger.log('Message sent successfully: ' + response.getContentText());
  } catch (e) {
    Logger.log('Error sending message: ' + e.message);
  }
}

/**
 * テスト実行用関数
 * 任意のユーザーIDとメッセージを送信します。
 */
function testSendLineMessage() {
  const userId = 'LINE_USER_ID'; // 送信先ユーザーIDを指定
  const message = 'LINE公式アカウントからの通知です！';
  sendLineMessage(userId, message);
}

```

#### 動作確認
上記コードを実行するためには、それぞれの友達のLINE ID (グループごとに固有のID / Uから始まるもの)が必要です。このIDが結構厄介で、管理画面からは全く確認できないので、Webhook で スプレッドシートに記述するようにしました。

1. ユーザーIDの取得
・ユーザーIDの取得は、webhookで行いました。
・LINE Developers コンソールで Webhook を設定し、ユーザーから公式アカウントにメッセージを送信してユーザーIDを取得します。
・LINE の Webhook の URLをGAS の URLに設定するといいです。 (https://script.google.com/macros/s/example/exec) #exampleは適宜書き換えてください。
・ユーザーがLINE公式アカウントへのともだち登録完了後に、本名またはニックネームなどを送ってもらうようにしました。
・その時に、Webhookを実行させそのグループのLINE IDをgoogle spread sheet に書き出すようにしました。
・ちなみに、友達登録完了のみだと、どれが誰だかわからないです。
```javascript
function doPost(e) {
  try {
    const events = JSON.parse(e.postData.contents).events;

    // スプレッドシートの「シート1」を取得
    const targetSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("シート1");

    for (let eventData of events) {
      // 受信イベントデータから必要な項目を取得
      const time = new Date(eventData.timestamp);
      const eventType = eventData.type;
      const messageType = eventData.message?.type || 'N/A'; // メッセージタイプがない場合のデフォルト
      const messageText = eventData.message?.text || 'N/A'; // メッセージテキストがない場合のデフォルト
      const userId = eventData.source?.userId || 'Unknown'; // userIdがない場合は 'Unknown' にする

      // 最後の行のあとに追加
      targetSheet.appendRow([time, eventType, userId, messageType, messageText, JSON.stringify(eventData)]);
    }

    // Webhookの成功応答
    return ContentService.createTextOutput(JSON.stringify({status: 'success'}));
  } catch (error) {
    // エラーが発生した場合のログ出力
    Logger.log('Error: ' + error);
    
    // Webhookのエラーレスポンス
    return ContentService.createTextOutput(JSON.stringify({status: 'error', message: error}));
  }
}
```

LINE 公式アカウントには無料プランと有料プランがあります。~~このプログラムによって実行された通知はとりあえず、メッセージ件数としてみなされませんでしたので、無料でいける場合もありそうです。~~

** **追記 (2025.2.11)** **

**このAPI は push を利用しているため、有料メッセージにカウントされることがわかりました。
月に200通までならば、無料で利用が可能ですが、通数を超える場合、送信されない、有料プランに変更する必要があります。
無料で利用する場合は、reply API で実装する必要があります。
reply の場合は、例えば LINE ユーザーが、「新着メッセージある？」というメッセージを送信した時、それをトリガーにして、送信させる必要があります。**

** **追記ここまで** **


この内容を基に、コードや手順を調整して具体化してみてください。必要に応じて詳しい技術的なポイントも追加可能です！

最後までお読みくださりありがとうございました。

よかったら「いいね」してもらえたら励みになります🙇‍♂️🙇‍♂️🙇‍♂️