前提・実現したいこと
Pythonを使ってLineBotの作成を行っております。実際に作る物の仕様としては以下のようなものを想定しています。
- リッチメニューから申請内容を選択(申請Aとします)
- "申請A"がbotに送信される <== ここまではLine Official Account Managerを使うことでうまくいきました
- 作業日の入力 <== 現在これを行っています(とりあえずまだここまでしかやってません)
- 作業の開始時間と終了時間を入力
- 作業理由の入力
- 以下の要領で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
何を記載すべきか分からないので追記すべき情報がありましたらコメントいただけますと嬉しいです。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/12/01 15:17