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

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

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

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

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

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

Q&A

解決済

1回答

3777閲覧

LineのMessaging APIで相手のメッセージを行ごとにリストにする方法(Python)

hajifu

総合スコア88

LINE Messaging API

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

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

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

0グッド

0クリップ

投稿2019/02/23 14:03

前提・実現したいこと

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
を使っています。
上記の書き換えた個所以外は参考サイトを踏襲しています。

コードの問題点の他、厚かましながらこういったアプリを作るうえでの今後の方針などもご教授いただけると嬉しい限りです。
例えば、内内のコミュニティで運用するならともかく、公開して不特定多数のお客さんにも利用してもらうとなると何かクラッシュするんじゃないかなというようなことも懸念しています。

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

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

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

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

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

guest

回答1

0

ベストアンサー

local variable 'yyk_pay' referenced before assignment

ローカル変数yyk_payは代入される前に参照されました(拙訳)


python

1 if yyk_var == "一般": 2 yyk_pay = 3000 3 elif yyk_var == "高校生": 4 yyk_pay = 1500 5 elif yyk_var == "U25": 6 yyk_pay = 2000

どの条件もTrueにならないとき、yyk_payが定義されません。なのでそのエラーになります。

そのAPIやherokuについての知識がある訳ではないので、実際にどう直せば良いとかは知りませんが。「一般」「高校生」「U25」などと送ってもエラーになるのなら、まずはyyk_varがどんな値になっているか見てみることでしょう。

普通にprintすればログに吐けるんじゃないかな? あるいはlineメッセージとして返しても良いでしょう。

あとは、else節を追加して意図しない文字列が来たときの動作を定義しておくと良いです。

書式と合致しているかチェックして、合致していなければ「こういう書式で送ってください」とでも返すと多少親切ではあります。

投稿2019/02/23 14:10

編集2019/02/23 14:15
hayataka2049

総合スコア30933

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

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

hajifu

2019/02/23 14:32

ありがとうございます! else節を追加してもうまくいかず、ご指摘のようにログの出し方を調べてやってみると、どうやら ””” ほげほげ男 4/8 19:00 2 一般 ””” というメッセージを行ごとに4つの要素のリストにするつもりが、「4/8」と「19:00」の間でも区切られて5つのインデックスを持ってしまっていました。。。 凡ミスで申し訳ありません。 基本のキができた気になどと言いながらpaizaの学習範囲でのミスでした。。。 書式の照らし合わせ、実装してみます!親切にありがとうございます。
hayataka2049

2019/02/23 14:40

そうですね。splitは空白文字すべてで分割します。split("\n")とかsplitlinesを使うといいでしょう
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問