Python、LINE BOTで一斉送信

#概要
前回作成したLINEbotを元に一斉送信ついてまとめたいと思います
![スクリーンショット 2020-12-02 111946.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/603568/0c839d87-4535-377c-16b8-b10570a057ac.png)

#一斉送信(ブロードキャストメッセージ)
今回はこちらサイトを参考にさせていただきました。
https://qiita.com/hiro0236/items/a649d90654d7807b2d55
サイト内にあるブロードキャストメッセージのソースコードを引っ張ってきました。

```python
from linebot import LineBotApi
from linebot.models import TextSendMessage

CHANNEL_ACCESS_TOKEN = "チャネルアクセストークンを設定"
line_bot_api = LineBotApi(CHANNEL_ACCESS_TOKEN)

def main():
    messages = TextSendMessage(text="ブロードキャストテスト")
    line_bot_api.broadcast(messages=messages)

if __name__ == "__main__":
    main()
```
上記のソースコードの
1.チャネルアクセストークンを設定
2.「main」というところをWebhook URL(簡単に言うとLINEから呼び出されるURL)
　に設定されているcallback([以前の記事](https://qiita.com/adgjmptw0/items/8c0c99b118a5612f29eb)をご参照ください)に変更
その後、Herokuへ設置することで友達登録されている全員に「ブロードキャストテスト」というメッセージが送信されます。
![スクリーンショット 2020-12-02 113706.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/603568/c6c52532-ee14-cecc-03e5-56659a42cef7.png)
#機能追加
前回までに作成した、LINE BOTにこのブロードキャスト機能を追加していきたいと思います。

```Python:main.py
from flask import Flask, request, abort

from linebot import (
    LineBotApi, WebhookHandler
)
from linebot.exceptions import (
    InvalidSignatureError
)
from linebot.models import (
    MessageEvent, TextMessage, TextSendMessage,
)
import os

app = Flask(__name__)

#環境変数取得
YOUR_CHANNEL_ACCESS_TOKEN = os.environ["YOUR_CHANNEL_ACCESS_TOKEN"]
YOUR_CHANNEL_SECRET = os.environ["YOUR_CHANNEL_SECRET"]

line_bot_api = LineBotApi(YOUR_CHANNEL_ACCESS_TOKEN)
handler = WebhookHandler(YOUR_CHANNEL_SECRET)

# 新商品をpromotion_contentに入れる
promotion_content = "話題の新商品"

@app.route("/")
def promotion():
    # 宣伝があればPromotionに入力して一斉送信
    if promotion_content != "":
        messages = TextSendMessage(text=promotion_content)
        line_bot_api.broadcast(messages=messages)
    return "宣伝完了"

@app.route("/callback", methods=['POST'])
def callback():
    # get X-Line-Signature header value
    signature = request.headers['X-Line-Signature']

    # get request body as text
    body = request.get_data(as_text=True)
    app.logger.info("Request body: " + body)

    # handle webhook body
    try:
        handler.handle(body, signature)
    except InvalidSignatureError:
        abort(400)

    return 'OK'

@handler.add(MessageEvent, message=TextMessage)
def handle_message(event):
    # "赤ちゃん"というメッセージが送られてきた場合
    # 指定のリンクを送信する。
    if event.message.text == "赤ちゃん":
        line_bot_api.reply_message(
            event.reply_token, 
            TextSendMessage(text="https://akachan.omni7.jp/top"))
    # "ママ"というメッセージが送られてきた場合
    # 指定のリンクを送信する。
    elif event.message.text == "ママ":
        line_bot_api.reply_message(
            event.reply_token, 
            TextSendMessage(text="https://akachan.omni7.jp/basic/A01?intpr=ah_frmng_top_headnav_cate"))
    # "ベビー"というメッセージが送られてきた場合
    # 指定のリンクを送信する。
    elif event.message.text == "ベビー":
        line_bot_api.reply_message(
            event.reply_token, 
            TextSendMessage(text="https://akachan.omni7.jp/basic/A02?intpr=ah_frmng_top_headnav_cate"))
    # "新商品"というメッセージが送られてきた場合
    # 新商品テキストを送信する。
    elif event.message.text == "新商品":
        line_bot_api.reply_message(
            event.reply_token, 
            TextSendMessage(text=promotion_content))
    # 特定の文字列以外はオウム返しする。
    else:
        line_bot_api.reply_message(
            event.reply_token, 
            TextSendMessage(text=event.message.text))

if __name__ == "__main__":
#    app.run()
    port = int(os.getenv("PORT"))
    app.run(host="0.0.0.0", port=port)
```
どこに追加したかわかりづらいかもなんですが下記の部分が変更されています。

```python
# 新商品をpromotion_contentに入れる
promotion_content = "話題の新商品"

@app.route("/")
def promotion():
    # 宣伝があればPromotionに入力して一斉送信
    if promotion_content != "":
        messages = TextSendMessage(text=promotion_content)
        line_bot_api.broadcast(messages=messages)
    return "宣伝完了"
```
この「@app.route("/")」というのはコマンドで「heroku open」すると呼び出されるメソッドで、内容はpromotion_contentに新商品(特に理由はありませんが今回はテキストの返信)の名前を入れて、「heroku open」すると友達登録されているアカウントに新商品が送信され、ブラウザに「宣伝完了」が表示されます。
![スクリーンショット 2020-12-02 122533.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/603568/29d3afca-f414-e65c-17c5-23c064c44bde.png)
![スクリーンショット 2020-12-02 122612.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/603568/506bd5f3-8b1e-a85d-67d9-f6b0ccbead4f.png)
また、指定メッセージ「新商品」に対して「promotion_content」を返信するようにすることで、お客さんからも新商品を調べられるようにもできます。

```python
    # "新商品"というメッセージが送られてきた場合
    # 新商品テキストを送信する。
    elif event.message.text == "新商品":
        line_bot_api.reply_message(
            event.reply_token, 
            TextSendMessage(text=promotion_content))
```
![スクリーンショット 2020-12-02 122812.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/603568/bced0beb-de21-c63c-aa22-5b3e9fbd0681.png)
#まとめ
今回は新商品ごとにHerokuへデプロイしなおさなければいけないので、隠しコードなどを使って自分のスマホから新商品のメッセージを送って、そこから一斉送信してもいいかと思いました！(セキュリティ上怪しいですが、、、笑)
![スクリーンショット 2020-12-02 140208.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/603568/87a3b08c-dde7-5c2c-5f8b-020da14da1f4.png)



#参考文献
https://qiita.com/hiro0236/items/a649d90654d7807b2d55