LINEにcurlでメッセージ送信する方法

# もくじ

- きっかけ
- LINEアカウント作成
- BOT作成と動作確認
- 送信先IDの取得
- 理解するためのイメージ図
- curlでメッセージ送信

## きっかけ

LINEで自動的にメッセージ送信するアプリでも作成しようと思い、LINEのAPIを利用してみることにしました。
curlでメッセージ送信できないかなあ、なんて思いながら作業を開始しました。
結果、LINE_API + AWS(APIGateway + lambda)を利用して、curlでメッセージ送信ができました。
その時のノウハウをメモしておこうと思い、また、いまいち既存の情報だと個人的にピンとこなかったこともあって、投稿しました。

## LINEアカウント作成

まずは普通にLINEのアカウントを作成します。
LINEは「ID」「パスワード」をシステムに登録しなくてもアカウントを作成できますが、「ID」「パスワード」を登録して、LINEアカウントを作成してください。
もうすでに作成してますって人は、この作業は不要です。

## BOT作成と動作確認

次に、BOTを作成します。
つまるところ、開発用のアカウントを作成します。
公式サイトを見ていると、BOTやプロバイダ、チャネルといった用語が出てきます。
詳細まで理解している方は明確に区別できるのでしょうが、理解力が乏しいためか、なんとなくでしか理解できませんでした。
結論として、はじめはすべて≒（ニアリーイコール）アカウントと考えてもらって差し支えないと思います。

https://developers.line.biz/ja/docs/messaging-api/overview/

次に、プロバイダーリストにプロバイダーを追加します。
自動送信したり返信するための新しいLINEアカウントを作成すると理解してもらって問題ありません。

https://developers.line.biz/console/channel/1653419974/basic/

![20191103_1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/527168/2341b7e5-915f-5041-4c2f-da02bb085561.jpeg)

![20191103_2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/527168/5fb5c763-d07f-9cf2-844c-9aa2b7673f83.jpeg)


作成したら、開発用アカウントとチャットができることを確認してみましょう。
画面下部にQRコードがあるので、最初に作成した自分のアカウントで、トークに招待してみましょう。

## 送信先IDの取得

BOTの動作確認できたら、既存のチャットルームにメッセージを送信するために、webhookイベントのURLを設定します。
なぜこんな作業が必要かというと、メッセージを送信する際に、送信先のユーザーIDやルームIDが必要なためです。
これらは、通常のLINEユーザーの操作では取得できません、LINEアプリを使って簡単には取得できませんとありました。

![20191103_3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/527168/508c9ab0-01be-a7af-be02-0a32e2cea24b.jpeg)

上記の赤枠の箇所を変更します。

webhookイベントとは、
メッセージを受信したときに決まったメッセージを設定されたURLに送信しますよっていう機能です。

ここで、AWSのAPIGateway + lambdaが登場します。
webhookURLに、APIGatewayのURLを設定します。

lambdaのソースは下記のサンプルをそのまま利用できるはずです。
pythonです。

lambda_function.py

```
import json
import traceback

# ==================================================
# lambdaで初めに呼び出される関数
# ==================================================
def lambda_handler(event, context):
    try:
        # リクエスト内容をログ出力
        log(event, 'receive request.')
        createResponse()
        
    except:
        # 想定外エラー発生時
        logger.log(traceback.format_exc())
        traceback.print_exc()
        
        return createResponse()

# ==================================================
# レスポンスを生成
# ==================================================
def createResponse():
    return {
            'isBase64Encoded': False,
            'statusCode': 200,
            'headers': {},
            'body': {}
        }

# ==================================================
# ログ出力
# ==================================================
def log(event, msg):
    print('EVENT >> ' + str(event))
    print('LOG >> ' + str(msg))
```

APIGatewayの設定はこんな感じ

![20191103_5.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/527168/6647c017-3506-f5da-f3b3-d9b71c734802.jpeg)


cloudwatchにログが出力されます。
この中に、userIdやroomIdが出力されているはずです。
これらを送信先として指定できます。

![20191103_6.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/527168/d7092b5a-7f7a-1f06-b903-1248e2b11dc7.jpeg)


## 理解するためのイメージ図

いろいろ出てきました。
わかりやすく、イメージ図にしてみました。
厳密には違う箇所が多々あるのですが、私の独断と偏見でこう考えるとわかりやすいと思い、作成しています。

![20191103_4.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/527168/559185df-d4f3-2fb0-cd40-7c695aedb991.jpeg)


①携帯電話からhttp電文が送信される（= LINEでメッセージ送信）
②サーバは受信したメッセージをルームにいる携帯電話・BOTに送信する
③BOTにwebhookの送信先URLとして登録したURL先に、POST電文が送信される

## curlでメッセージ送信

いよいよ、curlでメッセージ送信してみます。
LINEでメッセージ送信することはpushと呼ばれており、APIが公開されていますのでこれに従って送信します。
https://developers.line.biz/ja/reference/messaging-api/#send-push-message

ちなみに、私はASRっていうchromeの拡張機能を使いました。
http電文が送信できるなら何でも良いと思います。

メソッド POST
URL https://api.line.me/v2/bot/message/push
Content-Type	application/json
Authorization	Bearer 発行した認証Token
※認証TokenはLINEのDevelopersの画面から発行できます。
body

```
{
  "to": 取得したID,
  "messages":[
        {
            "type":"text",
            "text":"こんな感じで自動で送信できます。"
        }
    ]
}
```