LINE Messaging APIによる多重ループから抜ける方法がわかりません。
作りたいものは占いbotのようなものです。
流れは
①「bot:「占い」と入力してください。」
| ↓ ↑
| ユーザーが占い以外の言葉を入力。
↓
②「bot:性別を入力してください。」
| ↓ ↑
| ユーザーが男・女・その他以外の言葉を入力。
↓
③「bot:誕生日を入力してください。」
| ↓ ↑
| ユーザーが4桁の数字以外を入力。
↓
④「bot:血液型を入力してください。」
| ↓ ↑
| ユーザーがA,B,AB,O以外の言葉を入力。
↓
⑤「bot:あなたはタイプAです。」
上記のようなものになります。
②〜④において、『終了』と入力したら一気に①に戻るプログラムにしたいのですが、うまくいきません。
python
1(途中からです。) 2@handler.add(MessageEvent, message=TextMessage) 3def handle_text_message(event): 4 text = event.message.text 5 if text == '占い': 6 line_bot_api.reply_message( 7 event.reply_token, TextSendMessage(text='占いスタート。\n性別を教えてください。')) 8 @handler.add(MessageEvent, message=TextMessage) 9 def handle_text_message(event): 10 text = event.message.text 11 if text in ["男","女"]: 12 line_bot_api.reply_message( 13 event.reply_token, TextSendMessage(text='誕生日を教えてください。\n(例:7月7日は「0707」と入力。)')) 14 @handler.add(MessageEvent, message=TextMessage) 15 def handle_text_message(event): 16 text = event.message.text 17 if 0100 < int(text) < 1232: 18 line_bot_api.reply_message( 19 event.reply_token, TextSendMessage(text='血液型を教えてね。')) 20 elif text == '終了': 21 line_bot_api.reply_message( 22 event.reply_token, TextSendMessage("終了します。")) 23 break #ここがエラーの出ている箇所です。 24 else: 25 line_bot_api.reply_message( 26 event.reply_token, TextSendMessage('誕生日を教えて。')) 27 elif text == '終了': 28 line_bot_api.reply_message( 29 event.reply_token, TextSendMessage("終了します。")) 30 break 31 else: 32 line_bot_api.reply_message( 33 event.reply_token, TextSendMessage('性別を教えてください。')) 34 else: 35 line_bot_api.reply_message( 36 event.reply_token, TextSendMessage('占いと入力してね。')) 37 38(省略)
④まで上記のように書きました。
下記のようなエラーメッセージがでます。
File "〜main.py", line 108 break ^ SyntaxError: 'break' outside loop
初歩的な質問で大変申し訳ありません。
よろしくお願いします。
追記:コード全文記載します。
終了とした関数から抜け出せない状態です。
よろしくお願いします。
python
1# -*- coding: utf-8 -*- 2 3# Licensed under the Apache License, Version 2.0 (the "License"); you may 4# not use this file except in compliance with the License. You may obtain 5# a copy of the License at 6# 7# http://www.apache.org/licenses/LICENSE-2.0 8# 9# Unless required by applicable law or agreed to in writing, software 10# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 11# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 12# License for the specific language governing permissions and limitations 13# under the License. 14 15from __future__ import unicode_literals 16 17import errno 18import os 19import sys 20import tempfile 21import requests 22import random 23import datetime 24from argparse import ArgumentParser 25 26from flask import Flask, request, abort 27 28from linebot import ( 29 LineBotApi, WebhookHandler 30) 31from linebot.exceptions import ( 32 InvalidSignatureError 33) 34from linebot.models import ( 35 MessageEvent, TextMessage, TextSendMessage, 36 SourceUser, SourceGroup, SourceRoom, 37 TemplateSendMessage, ConfirmTemplate, MessageTemplateAction, 38 ButtonsTemplate, ImageCarouselTemplate, ImageCarouselColumn, URITemplateAction, 39 PostbackTemplateAction, DatetimePickerTemplateAction, 40 CarouselTemplate, CarouselColumn, PostbackEvent, 41 StickerMessage, StickerSendMessage, LocationMessage, LocationSendMessage, 42 ImageMessage, VideoMessage, AudioMessage, FileMessage, 43 UnfollowEvent, FollowEvent, JoinEvent, LeaveEvent, BeaconEvent, 44 ImageSendMessage 45) 46 47app = Flask(__name__) 48 49# get channel_secret and channel_access_token from your environment variable 50channel_secret = os.getenv('LINE_CHANNEL_SECRET', '省略') 51channel_access_token = os.getenv('LINE_CHANNEL_ACCESS_TOKEN', '省略') 52 53line_bot_api = LineBotApi(channel_access_token) 54handler = WebhookHandler(channel_secret) 55 56static_tmp_path = os.path.join(os.path.dirname(__file__), 'static', 'tmp') 57 58# function for create tmp dir for download content 59def make_static_tmp_dir(): 60 try: 61 os.makedirs(static_tmp_path) 62 except OSError as exc: 63 if exc.errno == errno.EEXIST and os.path.isdir(static_tmp_path): 64 pass 65 else: 66 raise 67 68 69@app.route("/callback", methods=['POST']) 70def callback(): 71 # get X-Line-Signature header value 72 signature = request.headers['X-Line-Signature'] 73 74 # get request body as text 75 body = request.get_data(as_text=True) 76 app.logger.info("Request body: " + body) 77 78 # handle webhook body 79 try: 80 handler.handle(body, signature) 81 except InvalidSignatureError: 82 abort(400) 83 84 return 'OK' 85 86@handler.add(MessageEvent, message=TextMessage) 87def handle_text_message(event): 88 text = event.message.text 89 if text == '占い': 90 line_bot_api.reply_message( 91 event.reply_token, TextSendMessage(text='占いスタート。\n性別を教えてください。')) 92 @handler.add(MessageEvent, message=TextMessage) 93 def handle_text_message(event): 94 text = event.message.text 95 if text in ["男","女"]: 96 line_bot_api.reply_message( 97 event.reply_token, TextSendMessage(text='誕生日を教えてください。\n(例:7月7日は「0707」と入力。)')) 98 @handler.add(MessageEvent, message=TextMessage) 99 def handle_text_message(event): 100 text = event.message.text 101 if 100 < int(text) < 1232: 102 line_bot_api.reply_message( 103 event.reply_token, TextSendMessage(text='血液型を教えてね。')) 104 @handler.add(MessageEvent, message=TextMessage) 105 def handle_text_message(event): 106 text = event.message.text 107 if text in ["A","B","AB","O"]: 108 line_bot_api.reply_message( 109 event.reply_token, TextSendMessage(text='あなたはタイプAだよ。')) 110 elif text == '終了': 111 line_bot_api.reply_message( 112 event.reply_token, TextSendMessage("終了します。")) 113 return 114 else: 115 line_bot_api.reply_message( 116 event.reply_token, TextSendMessage('血液型を教えて。')) 117 elif text == '終了': 118 line_bot_api.reply_message( 119 event.reply_token, TextSendMessage("終了します。")) 120 return 121 else: 122 line_bot_api.reply_message( 123 event.reply_token, TextSendMessage('誕生日を教えて。')) 124 elif text == '終了': 125 line_bot_api.reply_message( 126 event.reply_token, TextSendMessage("終了します。")) 127 return 128 else: 129 line_bot_api.reply_message( 130 event.reply_token, TextSendMessage('性別を教えてください。')) 131 else: 132 line_bot_api.reply_message( 133 event.reply_token, TextSendMessage('占いと入力してね。')) 134 135 136if __name__ == "__main__": 137 arg_parser = ArgumentParser( 138 usage='Usage: python ' + __file__ + ' [--port <port>] [--help]' 139 ) 140 arg_parser.add_argument('-p', '--port', type=int, default=5000, help='port') 141 arg_parser.add_argument('-d', '--debug', default=False, help='debug') 142 options = arg_parser.parse_args() 143 144 # create tmp dir for download content 145 make_static_tmp_dir() 146 147 app.run(debug=options.debug, port=options.port) 148 149

回答1件
あなたの回答
tips
プレビュー