LoginSignup
8
5

More than 3 years have passed since last update.

Python、LINE BOTで一斉送信

Last updated at Posted at 2020-12-02

概要

前回作成したLINEbotを元に一斉送信ついてまとめたいと思います
スクリーンショット 2020-12-02 111946.png

一斉送信(ブロードキャストメッセージ)

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

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(以前の記事をご参照ください)に変更
その後、Herokuへ設置することで友達登録されている全員に「ブロードキャストテスト」というメッセージが送信されます。
スクリーンショット 2020-12-02 113706.png

機能追加

前回までに作成した、LINE BOTにこのブロードキャスト機能を追加していきたいと思います。

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)

どこに追加したかわかりづらいかもなんですが下記の部分が変更されています。

# 新商品を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
スクリーンショット 2020-12-02 122612.png
また、指定メッセージ「新商品」に対して「promotion_content」を返信するようにすることで、お客さんからも新商品を調べられるようにもできます。

    # "新商品"というメッセージが送られてきた場合
    # 新商品テキストを送信する。
    elif event.message.text == "新商品":
        line_bot_api.reply_message(
            event.reply_token, 
            TextSendMessage(text=promotion_content))

スクリーンショット 2020-12-02 122812.png

まとめ

今回は新商品ごとにHerokuへデプロイしなおさなければいけないので、隠しコードなどを使って自分のスマホから新商品のメッセージを送って、そこから一斉送信してもいいかと思いました!(セキュリティ上怪しいですが、、、笑)
スクリーンショット 2020-12-02 140208.png

参考文献

8
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
5