8
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Linebot - 友達追加時にメッセージを送信 (Python, Flask)

Posted at

はじめに

Python + Flask 環境で作成したLinebotで、友達追加時にメッセージを送信する方法が調べてもあまり出てこなかったので、簡単にメモしました。

環境

  • python 3.7.12
  • Flask 2.0.1
  • line-bot-sdk 1.20.0

コード

全体的な流れは次のようになっています。

  1. Line(クライアント側)で友達追加することで、FollowEventが発生。
  2. Webhookで指定したURLにFollowEventが発生したことを、Line(クライアント側)からBotインスタンスにPOSTリクエストを送ることで通知。
  3. FollowEvent発生時の処理が行われる。

細かい処理はコメント文を見てみてください。

# linebot友達追加時のみメッセージを送信
from flask import Flask, request, abort

from linebot import (
    LineBotApi, WebhookHandler
)
from linebot.exceptions import (
    InvalidSignatureError
)
# linebot.modelsから処理したいイベントをimport
from linebot.models import (
    FollowEvent, TextSendMessage # FollowEventをimportするのを忘れずに!
)
import os

# Flaskクラスのインスタンスを生成
## __name__: 自動的に定義される変数で、現在のファイルのモジュール名が入る。
## ファイルをスクリプトとして実行した場合、__name__ は __main__ となる。
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)

# app.route("/"): appに対して / というURLに対応するアクションを登録
@app.route("/callback", methods=['POST'])
def callback():
    # get X-Line-Signature header value
    ## Lineから送られたメッセージかどうかを確認するための著名を取得 =
    ## X-Line-Signatureリクエストヘッダに含まれる著名を検証して、
    ## リクエストがLineプラットフォームから送信されたことを確認
    signature = request.headers['X-Line-Signature']

    # get request body as text
    body = request.get_data(as_text=True)# postされたデータをそのまま取得(HTTPリクエストメッセージボディ)
    app.logger.info("Request body: " + body)# ログ処理(記録)

    # handle webhook body
    try:
        handler.handle(body, signature)
    except InvalidSignatureError:# signatureエラー(Lineから送られたメッセージでない場合)
        abort(400)# abort(): flaskの関数で、httpステータスとメッセージを指定可能
        # ステータスコード400: Bad request. クライアント側のエラーにより、サーバ側がリクエストを処理できない時に使用。
    return 'OK'


# handler.add(): 引数にlinebotのリクエストのイベントを指定
@handler.add(FollowEvent)# FollowEventをimportするのを忘れずに!
def follow_message(event):# event: LineMessagingAPIで定義されるリクエストボディ
    # print(event)

    if event.type == "follow":# フォロー時のみメッセージを送信
        line_bot_api.reply_message(
            event.reply_token,# イベントの応答に用いるトークン
            TextSendMessage(text="フォローありがとうございます!"))


if __name__ == "__main__":
    port = int(os.getenv("PORT", 5000))
    # Flaskが持っている開発ようサーバーの起動
    app.run(host="0.0.0.0", port=port)

まとめ

テキストメッセージを送るだけなどの簡単なメッセージを送りたい場合、LineDeveloperコンソールであいさつメッセージを設定する方が早いです。少し複雑な処理が入る場合は、上記のコードをベースに実装できると思います。
また、Webhook Eventは、FollowEvent以外にも色々あるので、参考のLineの公式ドキュメントを見てみてください。
何か、間違いがあれば、ご指摘お願いします。

参考

8
3
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
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?