LINEの公式アカウントからメッセージの自動送信


最近、LINEのMessaging APIとcloud funcionsを使って、公式ラインのメッセージ自動送信を実装してみたので、備忘録として残しておきます。

# Messaging APIの設定
以前にも設定についてまとめているので、今回は割愛します。
下記の記事から参照してください。

https://qiita.com/yappi-dev/items/21dd4a40f3e44672969a

# メッセージの送信方法とタイプ
メッセージタイプと送信方法は様々あるようで、送信方法は、よくある応答メッセージやプッシュメッセージ等があり、メッセージタイプはノーマルなテキストメッセージやスタンプメッセージなどがあるようです。

詳しくは、[公式ドキュメント](https://developers.line.biz/ja/docs/messaging-api/message-types/#template-messages)を参照してください！

今回は、テキストメッセージを公式アカウントを追加している人全員に対して送信するように実装します。
また、少しアレンジを加えて、functionsでバッチを実装して、定期的にメッセージが送信されるようにしてみます。

# cloud functionsの実装
※Firebaseの初期設定等については、記事が長くなってしまいますので、省かせていただきます。ご了承ください。
cloud functionsのプロジェクト作成方法なども過去の記事で記載しているので参考にしてみてください。

https://qiita.com/yappi-dev/items/807040e7c71dccc91b97

functionsのバッチは以下のように実装することで定期実行してくれます。
```typescript
/** LINEメッセージ定期バッチ */
const sendSampleMessageBatch = functions
  .region('asia-northeast1')
  .pubsub.schedule('0 18 * * *')
  .onRun(async () => {
  })
```

今回の実装では、毎日18時にメッセージを定期送信してくれます。
頻度の指定はcron形式の時間指定で実装をしています。あまり使用したことがなかったので、いろいろ調べてみたところ、この記事が一番参考になったので、みなさんも参考にしてみてください。
月水金だけとか、毎週、毎月など指定できる幅がとても広がります！

https://qiita.com/nemutas/items/3f5816eabbf0eda5e6a9

:::note warn
注意
このままfunctionsにデプロイしても、日付国がデフォルトでアメリカになっているようで、日本時間の18時にならないので、デプロイ後に日付国を日本に変更してください。
:::

それでは、LINE Messaging APIを使って、メッセージ送信のコードを実装していきます。
```typescript
// LINE Messaging APIのチャネルの初期設定
const lineConfig = {
  channelAccessToken: process.env.LINE_CHANNEL_SECRET!,
  channelSecret: process.env.LINE_ACCESS_TOKEN!,
}

/** LINEメッセージ定期バッチ */
const sendSampleMessageBatch = functions
  .region('asia-northeast1')
  .pubsub.schedule('0 18 * * *')
  .onRun(async () => {
    try {
      const client = new line.Client(lineConfig)
      const postMessage: line.Message = {
        type: 'text',
        text: 'これはcloud functionsからのメッセージです',
      }
      await client.broadcast(postMessage)
    } catch (error) {
    console.log(error)
  })
```
作成したLINE Messaging APIのシークレットIdとアクセストークンを発行して、`.env`ファイルで定義します。その変数たちをconfigで呼び出してチャネルの初期設定をしていきます。

下記は送信するメッセージの設定を行っています。
```typescript
const postMessage: line.Message = {
        type: 'text',
        text: 'これはcloud functionsからのメッセージです',
    }
await client.broadcast(postMessage)
```
今回はテキストメッセージで、メッセージの内容は「これはcloud functionsからのメッセージです」で送信されます！
最後に、`broadcast`メソッドで公式アカウントを追加している人全員にメッセージが送信されます。

# デプロイと動作確認
それでは実際にfunctionsにデプロイして、処理を実行してみましょう。
バッチの処理を確認したい方は、バッチ時間の実行時間を10分後の時間を指定して、デプロイしてみるといいかもしれません。
下記のコマンドを実行してfunctionsにデプロイします。
```
firebase deploy --only functions:{メソッド名}
```

completeとコマンドプロンプトで表示されたらOKです！次にfunctionsを確認しましょう！
![スクリーンショット 2023-08-26 21.30.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/746815/8b62d4ec-9b4c-7164-5060-4fa386a914a5.png)

`sendSampleMessageBatch`というバッチが表示されていると思います！
次に、スケジュールされているバッチ一覧画面から処理を強制実行することができるので、その画面を表示します。画像の`cloud shedulerを表示`というボタンから遷移します。
下記のようにメソッドが設定されていると思います。

![スクリーンショット 2023-08-26 21.30.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/746815/8f48a675-1d34-2858-9c0f-f7487ea30bbe.png)

`0 18 * * *`が毎日18時に実行すると言う意味です。その下が`America/Los_Angeles`になっているので、これを日本の時刻に変更します。
対象のメソッドを押下すると、下記のような編集画面が表示されるので、タイムゾーンを日本標準時に変更して、「更新」ボタンを押下します。

![スクリーンショット 2023-08-26 21.35.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/746815/9b804862-c593-1f20-b432-fbc4d93af56e.png)

タイムゾーンが`America/Los_Angeles`から`Asia/Tokyo`に変更されていると思います。
![スクリーンショット 2023-08-26 21.37.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/746815/a7769f89-3e2d-cc80-156a-436c844cd90d.png)


それでは、強制実行します。対象のメソッドを選択して、画面上にある「強制実行ボタンを押下します。
![スクリーンショット 2023-08-26 21.39.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/746815/5676f6f1-445b-59bb-2d20-da5f5fb95377.png)

下記のように公式ラインからメッセージが送信されました！これで実装完了です。
![スクリーンショット 2023-08-26 21.40.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/746815/b041f4f4-dd9c-20bf-887f-2976baf6f250.png)