前提・実現したいこと
pythonで初めてプログラミングを学習し始めた初心者です。到達度としては、paizaラーニングでpythonの講座を一通り終えて先日Cレベルのスキルチェックを正解した程度です(おそらくかなり泥臭いコードで)。
基本のキができたような気になって、何かしらを自分で作ってみようと思いLineのMessaging APIで簡易な【Lineでできるイベントのチケット予約ボット?】を作ろうとしています。
素人考えで、
1.ユーザーにラインで必要な情報を改行して送ってもらう。
名前
予約したい日付
人数
券種
のような感じで。
2.そのメッセージを取得して行ごとにリストに格納。
3.それをcsvとかに書き出して予約表つくる。
といった流れを想定しています。
最初に、https://qiita.com/krocks96/items/67f7510b36945eb9689bを参考にして、というかコードを丸々写してオウム返しボットを作ってみて、これはうまくいきました。
オウム返しのコードもすべて意味を理解しているわけではないのですが、
text=event.message.textの部分に相手のメッセージが代入されているに違いないと思い、下記のような感じでとりあえず、リストにして予約の確認メッセージを送るコードを書いてみたのですが上手くいきません。
python
1from flask import Flask, request, abort 2 3from linebot import ( 4 LineBotApi, WebhookHandler 5 ) 6 7from linebot.exceptions import ( 8 InvalidSignatureError 9 ) 10from linebot.models import( 11 MessageEvent, TextMessage, TextSendMessage 12 ) 13import os 14 15app = Flask(__name__) 16 17# 環境変数取得 18# LINE Developersで設定されているアクセストークンとチャンネルシークレッットを取得し設定します。 19YOUR_CHANNEL_ACCESS_TOKEN = os.environ["YOUR_CHANNEL_ACCESS_TOKEN"] 20YOUR_CHANNEL_SECRET = os.environ["YOUR_CHANNEL_SECRET"] 21 22line_bot_api = LineBotApi(YOUR_CHANNEL_ACCESS_TOKEN) 23handler = WebhookHandler(YOUR_CHANNEL_SECRET) 24 25# Webhookからのリクエストをチェックします。 26@app.route("/callback", methods=['POST']) 27def callback(): 28 # リクエストヘッダーから署名検証のための値を取得します。 29 signature = request.headers['X-Line-Signature'] 30 31 # リクエストボディを取得します。 32 body = request.get_data(as_text=True) 33 app.logger.info("Request body: " + body) 34 35 # handle webhook body 36 # 署名を検証し、問題なければhandleに定義され散る関数を呼び出す。 37 try: 38 handler.handle(body, signature) 39 # 署名検証で失敗した場合、例外を出す。 40 except InvalidSignatureError: 41 abort(400) 42 return 'OK' 43 44#ここから下を書き換えました。 45 46@handler.add(MessageEvent, message=TextMessage) 47def handle_message(event): 48 req_message = event.message.text #受け取ったメッセージを変数に入れようとしています。 49 yoyaku = req_message.rstrip().split() 50 51 #yoyakuリストに格納した情報をそれぞれの変数に代入しようとしています。 52 yyk_name = yoyaku[0] 53 yyk_date = yoyaku[1] 54 yyk_num = yoyaku[2] 55 yyk_var = yoyaku[3] #券種によって値段を算出しようとしています。 56 if yyk_var == "一般": 57 yyk_pay = 3000 58 elif yyk_var == "高校生": 59 yyk_pay = 1500 60 elif yyk_var == "U25": 61 yyk_pay = 2000 62 yyk_payment = yyk_pay * int(yyk_num) 63 64 txt_yoyaku = yyk_name + " 様 ご予約ありがとうございます。\n下記の内容でご予約を承りました。" \ 65 + "お名前: " + yyk_name + " " + yyk_date \ 66 + " の回\n" + yyk_num + "名様 " + "合計 " + str(yyk_payment) + "円" 67 68 line_bot_api.reply_message( 69 event.reply_token, 70 TextSendMessage(text=txt_yoyaku)) 71 72# ポート番号の設定 73if __name__ == "__main__": 74# app.run() 75 port = int(os.getenv("PORT", 5000)) 76 app.run(host="0.0.0.0", port=port) 77
発生している問題・エラーメッセージ
具体的には、メッセージをボットに送信しても何も返信が来ません。
コマンドプロンプトで heroku logs --tail -a としてみると、
2019-02-23T13:37:59.474386+00:00 app[web.1]: func(event) 2019-02-23T13:37:59.474387+00:00 app[web.1]: File "main.py", line 65, in handle_message 2019-02-23T13:37:59.474388+00:00 app[web.1]: yyk_payment = yyk_pay * int(yyk_num) 2019-02-23T13:37:59.474389+00:00 app[web.1]: UnboundLocalError: local variable 'yyk_pay' referenced before assignment 2019-02-23T13:37:59.474630+00:00 app[web.1]: 10.63.225.86 - - [23/Feb/2019 13:37:59] "POST /callback HTTP/1.1" 500 -
と出てきます。
このログの見方もよくわかっていないのですが、これはyyk_~の変数たちへの代入ができていない=うまくメッセージをリストにできていないということで間違いないでしょうか?
試したこと
もしかしてevent.message.textは普通の文字列じゃないのかも?と思いLINEのドキュメントや他サイトも探してみたのですが中々自分の知識に翻訳できるものがありませんでした。
しまいにはJSON形式?のような言葉も出てきて完全にお手上げとなりました。
長くなってしまいましたが、質問したいのは
相手からのメッセージをリストにするにはどうしたらいいでしょうか?ということです。
初心者ゆえにお見苦しい箇所も多いと思いますが、よろしくお願いいたします。
補足情報(FW/ツールのバージョンなど)
Windowsでpython-3.7.2
を使っています。
上記の書き換えた個所以外は参考サイトを踏襲しています。
コードの問題点の他、厚かましながらこういったアプリを作るうえでの今後の方針などもご教授いただけると嬉しい限りです。
例えば、内内のコミュニティで運用するならともかく、公開して不特定多数のお客さんにも利用してもらうとなると何かクラッシュするんじゃないかなというようなことも懸念しています。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/02/23 14:32
2019/02/23 14:40