質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
LINE Messaging API

LINE Messaging APIは、メッセージの送信・返信ができるAPIです。Web APIを経由しアプリケーションサーバとLINEのAPIでやり取りが可能。複数のメッセージタイプや分かりやすいAPIリファレンスを持ち、グループチャットにも対応しています。

Heroku

HerokuはHeroku社が開発と運営を行っているPaaSの名称です。RubyやNode.js、Python、そしてJVMベース(Java、Scala、Clojureなど)の複数のプログラミング言語をサポートしている。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

2783閲覧

LineBotの日時選択アクションで取得したデータの扱い方が分からない

PC_breakman

総合スコア30

LINE Messaging API

LINE Messaging APIは、メッセージの送信・返信ができるAPIです。Web APIを経由しアプリケーションサーバとLINEのAPIでやり取りが可能。複数のメッセージタイプや分かりやすいAPIリファレンスを持ち、グループチャットにも対応しています。

Heroku

HerokuはHeroku社が開発と運営を行っているPaaSの名称です。RubyやNode.js、Python、そしてJVMベース(Java、Scala、Clojureなど)の複数のプログラミング言語をサポートしている。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2021/11/28 14:34

編集2021/11/29 03:42

前提・実現したいこと

Pythonを使ってLineBotの作成を行っております。実際に作る物の仕様としては以下のようなものを想定しています。

  1. リッチメニューから申請内容を選択(申請Aとします)
  2. "申請A"がbotに送信される <== ここまではLine Official Account Managerを使うことでうまくいきました
  3. 作業日の入力 <== 現在これを行っています(とりあえずまだここまでしかやってません)
  4. 作業の開始時間と終了時間を入力
  5. 作業理由の入力
  6. 以下の要領でbotが返信(「よろしくお願いします。」までがbotに返信させたいメッセージです)

【申請A】
yyyy/mm/dd hh:mm ~ hh:mm
...のため

よろしくお願いします。

発生している問題・エラーメッセージ

(任意の文字列を送信したら日付を入力するための日時選択アクションが返ってくる動作を想定していたのですが、bot画面上に日時選択アクションが表示されません。) <= datetimeのパッケージをインポートしていなかったのが原因でした。日時選択アクションは表示されるようになったのですが、取得した日付のデータの表示ができません。logを表示した際に出ていたエラーを以下に示します。

func(event) File "main.py", line 98, in handle_message str_work_date = event.postback.params['date'] AttributeError: 'MessageEvent' object has no attribute 'postback'

おそらく正しくデータが格納できていないのかなと思っています。LineBotの作成をするのが初めてなので、おそらく何か勘違いしているのだと思っていろいろと調べたのですが原因が分かりませんでした。詳しい方がいらっしゃいましたら教えていただけると幸いです。

該当のソースコード

Python

1 2from flask import Flask, request, abort 3 4from linebot import ( 5 LineBotApi, WebhookHandler 6) 7from linebot.exceptions import ( 8 InvalidSignatureError 9) 10from linebot.models import ( 11 MessageEvent, TextMessage, TextSendMessage, PostbackEvent, 12 TemplateSendMessage, ButtonsTemplate, DatetimePickerTemplateAction 13) 14import datetime 15import os 16import re 17 18app = Flask(__name__) 19 20#環境変数取得 21YOUR_CHANNEL_ACCESS_TOKEN = os.environ["YOUR_CHANNEL_ACCESS_TOKEN"] 22YOUR_CHANNEL_SECRET = os.environ["YOUR_CHANNEL_SECRET"] 23 24line_bot_api = LineBotApi(YOUR_CHANNEL_ACCESS_TOKEN) 25handler = WebhookHandler(YOUR_CHANNEL_SECRET) 26 27 28@app.route("/") 29def get_date_template(): 30 date_template = TemplateSendMessage( 31 alt_text='作業日を選択せよ', 32 template=ButtonsTemplate( 33 text='このボタンを押してね', 34 title='作業日を選択せよ', 35 image_size='cover', 36 actions=[ 37 DatetimePickerTemplateAction( 38 label='選択', 39 data='action=buy&itemid=1', 40 mode='date', 41 initial=str(datetime.date.today()) 42 ) 43 ] 44 ) 45 ) 46 return date_template 47 48 49@app.route("/callback", methods=['POST']) 50def callback(): 51 # get X-Line-Signature header value 52 signature = request.headers['X-Line-Signature'] 53 54 # get request body as text 55 body = request.get_data(as_text=True) 56 app.logger.info("Request body: " + body) 57 58 # handle webhook body 59 try: 60 handler.handle(body, signature) 61 except InvalidSignatureError: 62 abort(400) 63 64 return 'OK' 65 66 67@handler.add(MessageEvent, message=TextMessage) 68def handle_message(event): 69 work_date = get_date_template() 70 line_bot_api.reply_message( 71 event.reply_token, 72 work_date 73 ) 74 str_work_date = event.postback.params['date'] # おそらくここでエラーが出ている... 75 mode_work_date = re.sub("-", "/", str_work_date) 76 line_bot_api.reply_message( 77 event.reply_token, 78 TextSendMessage(text=mode_work_date) 79 ) 80 81 82if __name__ == "__main__": 83# app.run() 84 port = int(os.getenv("PORT", 5000)) 85 app.run(host="0.0.0.0", port=port)

補足情報(FW/ツールのバージョンなど)

OS: Windows11
デプロイ先: Heroku

何を記載すべきか分からないので追記すべき情報がありましたらコメントいただけますと嬉しいです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

ポストバックイベントは、 PostbackEventのイベントハンドラで処理する必要があります。

python

1() 2 3@handler.add(MessageEvent, message=TextMessage) 4def handle_message(event): 5 work_date = get_date_template() 6 line_bot_api.reply_message( 7 event.reply_token, 8 work_date 9 ) 10 # 以下は削除 11 # str_work_date = event.postback.params['date'] # おそらくここでエラーが出ている... 12 # mode_work_date = re.sub("-", "/", str_work_date) 13 # line_bot_api.reply_message( 14 # event.reply_token, 15 # TextSendMessage(text=mode_work_date) 16 # ) 17 18# 以下を追加する。 19@handler.add(PostbackEvent) 20def on_postback(event): 21 str_work_date = event.postback.params['date'] 22 mode_work_date = re.sub("-", "/", str_work_date) 23 line_bot_api.reply_message( 24 event.reply_token, 25 TextSendMessage(text=mode_work_date) 26 )

投稿2021/12/01 11:56

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

PC_breakman

2021/12/01 15:17

ありがとうございます。MessageEventはユーザからメッセージを受け取るイベントにしか反応しない(言い方が正しいか分かりませんが...)ということですね。もう少し試行錯誤してみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問