[初心者向け] LINE Messaging APIでWebサイトからメッセージ送信してみる

## はじめに
メールを使って業務通知を行っている会社が多いと思いますが、LINEを使って一部の重要な通知を行えないか検証してみました。

## 本記事の対象者
・基本的なプログラミングを理解している方
・AWS Lambda,API Gatewayのサービスを理解している方

## 準備
・LINEアカウント登録
・AWSアカウント登録

## 注意点
・メッセージ送信ごとに料金が発生する（無料枠あり）

## Messaging APIとは
・作成したチャネルに対し、API経由でメッセージ送信できる
・メッセージの種類は単純なテキストから画像など様々
・ユーザーからの返答を受け取り、返答内容に応じたメッセージ送信が可能…等々

## 検証
### LINE Developersのアカウント登録
LINE Developersトップを開き、右上の「ログイン」をクリックします。
アカウント登録画面に遷移できるので、使用したいアカウント（LINEアプリで登録したメールアドレスとパスワード）でログインします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2822850/dae292b8-b8fb-8d38-8a23-a81583fb7d9e.png)

### Messaging APIの設定
Developerサイトにログインした状態で、トップページからプロバイダー「新規作成」をクリックし、プロバイダー名を入力します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2822850/64f34cea-a91c-a473-73df-810368d59939.png)

作成したプロバイダーを選択し、「新規チャネル作成」＞[Messaging API]をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2822850/1ee8f9f9-7fe5-2103-04d5-ff9fe45309dc.png)

新規チャネル作成に必要なアイコンやチャネル名等々を設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2822850/ee099bba-7dd6-e5e9-6122-2875a343d01d.png)

作成したチャネルの[Messaging API設定]タブよりチャネル参加用のQRコードが表示されるので、LINEの友だち追加からQRを読み込み、友だち追加します。
![QR.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2822850/3dd0616a-0e9a-09a0-44ec-39a756ecfea2.png)


[Messaging API設定]タブの下部よりアクセストークンを発行し、トークンをメモしておきます。
![チャネルアクセストークン.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2822850/6380c5ad-dfe3-e816-6544-9ba95b1ca013.png)

[チャネル基本設定]の下部より表示されている
[あなたのユーザーID]をメモしておます。
![あなたのユーザーID.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2822850/ee0211d3-f6d7-8125-b3e1-56bd8abd8878.png)


### AWS Lambdaで関数を設定
Messaging APIを実行する関数を設定します。
AWSマネジメントコンソールにログインし、Lambdaページに遷移します。

[関数の作成]より[ランタイム]でPythonを選択し、関数を新規作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2822850/90c3b62e-1c94-d471-45ca-72cb988ebc24.png)

以下のサンプルプログラムをデプロイします。
[ユーザーID][チャネルアクセストークン]はご自身で発行したものに差し替えてください。
```
import json
import requests
from pprint import pprint

def lambda_handler(event, context):
    #===========================
    # LINEへのPUSHメッセージ作成
    #===========================
    resmessage = [
        {'type':'text','text':event["key1"]}
    ]
    payload = {'to': 'ユーザーID', 'messages': resmessage}
    # カスタムヘッダーの生成(dict形式)
    headers = {'content-type': 'application/json', 'Authorization': 'Bearer <チャネルアクセストークン>'}
    # headersにカスタムヘッダーを指定
    r = requests.post("https://api.line.me/v2/bot/message/push", headers=headers, data=json.dumps(payload))
    print("LINEレスポンス:" + r.text)
    return "送信完了"
```

Line Messaging APIの公式ドキュメントは以下になります。
https://developers.line.biz/ja/docs/messaging-api/sending-messages/#send-messages-at-any-time

ちなみに、この時点で作成した関数をテスト実行するとメッセージ送信可能です。

### AWS API GatewayでREST APIを設定
RestAPIとリクエスト先のLambda関数を設定します。
AWSマネジメントコンソールより、API Gatewayページに遷移します。

[API作成]で[REST API]を選択し、API名等を入力してAPIを作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2822850/736dbb6c-c977-87cd-eb7a-5ae3b86fc898.png)

[メソッドを作成]でPOST、[統合タイプ]にLambda関数を選択してメソッドを作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2822850/c833e9dc-0288-bdfc-446e-6b324e118f47.png)

[CORSを有効にする]でPOSTメソッドに関してCORSを有効化します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2822850/b8c5ca17-e4fa-fa82-7691-613607402074.png)

[APIをデプロイ]をクリックし、[Create stage]よりURLを発行します。
URLをメモしておきます。
![APIGatewayステージ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2822850/13d0e3e7-1c77-e078-f68d-9568dd7aef6c.png)
### Webサイトを作成
静的なWebサイトを作成します。
ちなみに、HTMLは後述の参考サイトのサンプルプログラムを参考にさせて頂きました。
以下のHTMLに先ほど発行したURLを設定します。
```
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>WebフォームからLineにメッセージ通知する</title>
<script src="https://code.jquery.com/jquery-3.7.1.js" integrity="sha256-eKhayi8LEQwp4NKxN+CfCh+3qOVUtJn3QNZ0TciWLP4=" crossorigin="anonymous"></script>
<script type="text/javascript">
    $(function(){
        $("#response").html("Response Values");

        $("#button").click( function(){
            // ここのURLはAPIのデプロイ時に表示されるURLに差し替える
            var url = "APIGatewayのURL";
                var JSONdata = {
                    "key1": $("#text").val()
                };

            $.ajax({
                type : 'post',
                url : url,
                data : JSON.stringify(JSONdata),
                contentType: 'application/json',
                dataType : 'json',
                scriptCharset: 'utf-8',
                success : function(data) {

                    // Success
                    alert("success");
                    //alert(JSON.stringify(data));
                    $("#response").html(JSON.stringify(data));
                },
                error : function(data) {

                    // Error
                    alert("error");
                    alert(JSON.stringify(data));
                    $("#response").html(JSON.stringify(data));
                }
            });
        })
    })
</script>

</head>
<body>
    <h1>【テスト】Lineのチャンネルにメッセージを通知する</h1>
    <h2>テキスト入力＋送信</h2>
    <p>入力テキスト: <input type="text" id="text" size="30" placeholder="テキストを入力してください"></p>
    <p><button id="button" type="button">送信</button></p>
    <textarea id="response" cols=120 rows=10 disabled></textarea>
</body>
</html>
```
ブラウザで表示したサイト
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2822850/c76558ae-fd78-a282-62db-1baea72b346e.png)

## 結果
Webフォームから入力したテキストが無事メッセージ送信されました。
・Webフォーム
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2822850/d3687736-694c-690a-0911-6d25ab9d2309.png)

・メッセージ
![Screenshot_20240209_121924_LINE.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2822850/082a81cc-0112-3f67-c6f4-3ba15ed33e7b.jpeg)

## 感想
単純なテキストのメッセージ送信は簡単に実装できそうだと思いました。
LINE Messaging APIは様々な種類があり、ユーザーからの応答メッセージをトリガーに別の仕組みを実行したり、いろいろな活用方法がありそうと感じました。

## 参考サイト
以下の方の記事を参考に試しました。
ありがとうございました。

・LINE Messaging API で「プッシュメッセージ」を簡単に試してみた
https://dev.classmethod.jp/articles/line-messaging-api-push-message/

・API GatewayとLambdaで簡易Webアプリを作ってみる
https://qiita.com/moufuyu/items/340048eef98d98f11187