[python]LINE Messaging API ＋ requests で メッセージを送信する

# はじめに
LINE Messaging APIを使うと、Botからユーザーへ様々な形式でメッセージを送ることができます。
LINE公式アカウントなどを使っていても、単なるテキストや画像、スタンプ以外にも『はい』『いいえ』で答えるボタンが付いたメッセージや、横にスクロールできるタイプのメッセージもあります。
メッセージの送信対象も選択することができ、1対1での送信や、一斉送信、属性で限定して送信などの方法があります。
今回はrequestsを使ってLINE Messaging APIを介してメッセージを送信する方法を簡単にまとめます。

# requestsでのメッセージ送信方法

Botの作成、トークン等の取得はこちらで解説していますので参照下さい。

https://qiita.com/NaruNeko/items/482ed8dadc919d85f658

試しにプッシュメッセージを送るプログラムを実装してみます。
> **プッシュメッセージ**
ユーザー、グループトーク、または複数人トークに、任意のタイミングでメッセージを送信するAPIです。

[LINE Developers 公式ドキュメント](https://developers.line.biz/ja/docs/messaging-api/sending-messages/#send-messages-at-any-time)で、プッシュメッセージを送る際のリクエストの例を見てみます。

```sh
curl -v -X POST https://api.line.me/v2/bot/message/push \
-H 'Content-Type: application/json' \
-H 'Authorization: Bearer {channel access token}' \
-d '{
    "to": "U4af4980629...",
    "messages":[
        {
            "type":"text",
            "text":"Hello, world1"
        },
        {
            "type":"text",
            "text":"Hello, world2"
        }
    ]
}'
```

URL、ヘッダー、リクエストボディ（json）の内容が分かりました。
PythonでrequestsライブラリのPOSTメソッドを使うと以下の様に実装できます。

```python:pushMsg.py
import requests

headers = {
    "Content_Type": "application/json",
    "Authorization": "Bearer " + 'YOUR_CHANNEL_ACCESS_TOKEN'
    }

def SendMsg(text,uid):
    res = requests.post("https://api.line.me/v2/bot/message/push", 
                        headers=headers, 
                        json={
                            "to": uid,
                            "messages": [{
                                            "type": "text",
                                            "text": text
                                        }]
                        }
                        ).json()

if __name__ == "__main__":
    SendMsg('Hello World!', 'YOUR_USER_ID')
```

実行してみると、指定したUserIDを持つユーザーにのみメッセージが送信されました。

その他にも マルチキャストメッセージ、ナローキャストメッセージ、ブロードキャストメッセージ の3種類の送信方法があります。

> **マルチキャストメッセージ**
複数のユーザーに対して同じメッセージを効率よく送信するAPIです。グループトークおよび複数人トークにメッセージを送ることはできません。

> **ナローキャストメッセージ**
複数のユーザーに、任意のタイミングでメッセージを送信します。送信対象は、属性情報（性別や年齢、OSの種類、地域など）やリターゲティング（オーディエンス）を利用して指定できます。グループトークまたは複数人トークにメッセージを送ることはできません。

> **ブロードキャストメッセージ**
LINE公式アカウントと友だちになっているすべてのユーザーに、任意のタイミングでメッセージを送信します。

python実装時は、基本的に公式ドキュメントに従って上記コードのURL、ヘッダー、リクエストボディ（json）を必要に応じて変更するだけです。


# 様々なメッセージ形式
LINE Messaging APIには主にこれらのメッセージタイプが用意されています。
詳細は下記リンクの公式ドキュメントでご確認下さい。
- [テキストメッセージ](https://developers.line.biz/ja/reference/messaging-api/#text-message)
- [スタンプメッセージ](https://developers.line.biz/ja/reference/messaging-api/#sticker-message)
- [画像メッセージ](https://developers.line.biz/ja/reference/messaging-api/#image-message)
- [動画メッセージ](https://developers.line.biz/ja/reference/messaging-api/#video-message)
- [音声メッセージ](https://developers.line.biz/ja/reference/messaging-api/#audio-message)
- [位置情報メッセージ](https://developers.line.biz/ja/reference/messaging-api/#location-message)
- [イメージマップメッセージ](https://developers.line.biz/ja/reference/messaging-api/#imagemap-message)
- [テンプレートメッセージ](https://developers.line.biz/ja/reference/messaging-api/#template-messages)
- [Flex Message](https://developers.line.biz/ja/reference/messaging-api/#flex-message)

例えば、ドキュメントの例を参考にスタンプメッセージを実装するとこうなります。

```python:pushMsg.py
import requests

headers = {
    "Content_Type": "application/json",
    "Authorization": "Bearer " + infos.CHANNEL_ACCESS_TOKEN
    }

UID = 'YOUR_USER_ID'

def PushMsg(messages):
    res = requests.post("https://api.line.me/v2/bot/message/push", 
                        headers=headers, 
                        json={
                            "to": UID,
                            "messages": messages
                        }
                        ).json()

def StickerMsg():
    messages = [{
                    "type": "sticker",
                    "packageId": "446",
                    "stickerId": "1988"
                }]
    PushMsg(messages)

if __name__ == "__main__":
    StickerMsg()
```

これを実行するとスタンプが送られてきました。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2842664/b8051962-8155-de6c-13e6-6572d2cafad8.png" width="200">

結局変わるのはmessagesの中身だけなので、公式ドキュメントの例を参考にmessagesの内容を変更するだけで、どのメッセージタイプも扱うことはできます。
ただし使いこなすとなれば、当然jsonの中身も理解する必要があります。