def Confirm_PostMessage(data, number): # 取消step2 if number == 1: ConfirmMessage = FlexSendMessage(alt_text='菜單查詢', position='absolute', contents={ "type": "bubble", "body": { "type": "box", "layout": "vertical", "contents": [{ "type": "text", "text": "確定取消嗎?", "margin": "md" }, { "type": "spacer" }] }, "footer": { "type": "box", "layout": "horizontal", "spacing": "sm", "contents": [{ "type": "button", "action": { "type": "postback", "label": "是的", "data": data }, "height": "sm" }, { "type": "button", "action": { "type": "postback", "label": "再想想好了", "data": "no" }, "height": "sm" }], "flex": 0 }, "styles": { "footer": { "separator": True } } }) # 確認是否答應 訂位Step6 elif number == 2: print(data) ConfirmMessage = FlexSendMessage( alt_text='確定此次訂位資訊嗎?\n姓名: ' + data[0] + '\n預約日期: ' + data[1].split('T')[0] + '\n預約時間: ' + data[1].split('T')[1] + "\n預約人數: " + data[2], #+ "\n選擇位置: " + data[4], position='absolute', contents={ "type": "bubble", "body": { "type": "box", "layout": "vertical", "contents": [ { "type": "text", "text": '確定此次訂位資訊嗎?\n姓名: ' + data[0] + '\n預約日期: ' + data[1].split('T')[0] + '\n預約時間: ' + data[1].split('T')[1] + "\n預約人數: " + data[2], #+ "\n選擇位置: " + data[4], "margin": "md", "wrap": True }, { "type": "spacer" } ] }, "footer": { "type": "box", "layout": "horizontal", "spacing": "sm", "contents": [ { "type": "button", "action": { "type": "postback", "label": "訂單正確", "data": 'yes ' + data[0] + " " + data[1] + " " + data[2] + " " + data[3] }, "height": "sm" }, { "type": "button", "action": { "type": "postback", "label": "取消訂單", "data": 'no ' + data[0] + " " + data[1] + " " + data[2] + " " + data[3] # 3: UserId }, "height": "sm" } ], "flex": 0 }, "styles": { "footer": { "separator": True } } }) # 確認是先生或小姐 訂位step2 elif number == 3: ConfirmMessage = FlexSendMessage( alt_text='請問是{0}先生還是{0}小姐呢?'.format(data[0]), position='absolute', contents={ "type": "bubble", "body": { "type": "box", "layout": "vertical", "contents": [{ "type": "text", "text": '請問是{0}先生還是{0}小姐呢?'.format(data[0]), "margin": "md", "wrap": True }, { "type": "spacer" }] }, "footer": { "type": "box", "layout": "horizontal", "spacing": "sm", "contents": [{ "type": "button", "action": { "type": "postback", "label": "先生", "data": '先生' }, "height": "sm" }, { "type": "button", "action": { "type": "postback", "label": "小姐", "data": '小姐' }, "height": "sm" }], "flex": 0 }, "styles": { "footer": { "separator": True } } }) elif number == 4: ConfirmMessage = FlexSendMessage(alt_text='請問是要預約訂位還是取消預約呢?', position='absolute', contents={ "type": "bubble", "body": { "type": "box", "layout": "vertical", "contents": [{ "type": "text", "text": '請問是要預約訂位還是取消預約呢?', "margin": "md", "wrap": True }, { "type": "spacer" }] }, "footer": { "type": "box", "layout": "horizontal", "spacing": "sm", "contents": [{ "type": "button", "action": { "type": "message", "label": "預約訂位", "text": '預約訂位' }, "height": "sm" }, { "type": "button", "action": { "type": "message", "label": "取消預約", "text": '取消預約' }, "height": "sm" }], "flex": 0 }, "styles": { "footer": { "separator": True } } }) # 確認日期 訂位step3.5 elif number == 5: print(data) ConfirmMessage = FlexSendMessage( alt_text='確定此次日期資訊嗎?', position='absolute', contents={ "type": "bubble", "body": { "type": "box", "layout": "vertical", "contents": [{ "type": "text", "text": '確定此次日期資訊嗎?\n預約日期: ' + data.split('T')[0] + '\n預約時間: ' + data.split('T')[1], "margin": "md", "wrap": True }, { "type": "spacer" }] }, "footer": { "type": "box", "layout": "horizontal", "spacing": "sm", "contents": [{ "type": "button", "action": { "type": "postback", "label": "日期正確", "data": 'yes ' + data }, "height": "sm" }, { "type": "button", "action": { "type": "postback", "label": "重新選取", "data": 'no ' + data }, "height": "sm" }], "flex": 0 }, "styles": { "footer": { "separator": True } } }) # 確認訂餐資訊 elif number == 6: print(data) reply_message = '以下是您的訂餐詳細\n' postmessage = '' for i in list(data.keys()): if data[i] != 0: if i == '桌號': postmessage = postmessage + i + ' ' + str( data[i]) + " " reply_message = reply_message + i + ' ' + str( data[i]) + "號\n" else: postmessage = postmessage + i + ' ' + str( data[i]) + " " reply_message = reply_message + i + ' ' + str( data[i]) + "份\n" reply_message = reply_message + '確認無誤嗎?' ConfirmMessage = FlexSendMessage( alt_text='餐點確認無誤嗎?', position='absolute', contents={ "type": "bubble", "body": { "type": "box", "layout": "vertical", "contents": [{ "type": "text", "text": reply_message, "margin": "md", "wrap": True }, { "type": "spacer" }] }, "footer": { "type": "box", "layout": "horizontal", "spacing": "sm", "contents": [{ "type": "button", "action": { "type": "postback", "label": "訂單正確", "data": 'yes menu ' + postmessage }, "height": "sm" }, { "type": "button", "action": { "type": "postback", "label": "我要修改", "data": 'no menu ' }, "height": "sm" }], "flex": 0 }, "styles": { "footer": { "separator": True } } }) return ConfirmMessage
def send_flex_message(reply_token, flex_msg): line_bot_api = LineBotApi(channel_access_token) line_bot_api.reply_message(reply_token, FlexSendMessage("menu", flex_msg)) return "OK"
def sendFlex(event): #彈性配置 try: bubble = BubbleContainer( direction='ltr', #項目由左向右排列 header=BoxComponent( #標題 layout='vertical', contents=[ TextComponent(text='冰火飲料', weight='bold', size='xxl'), ]), hero=ImageComponent( #主圖片 url='https://i.imgur.com/3sBRh08.jpg', size='full', aspect_ratio='792:555', #長寬比例 aspect_mode='cover', ), body=BoxComponent( #主要內容 layout='vertical', contents=[ TextComponent(text='評價', size='md'), BoxComponent( layout='baseline', #水平排列 margin='md', contents=[ IconComponent( size='lg', url='https://i.imgur.com/GsWCrIx.png'), TextComponent(text='25 ', size='sm', color='#999999', flex=0), IconComponent( size='lg', url='https://i.imgur.com/sJPhtB3.png'), TextComponent(text='14', size='sm', color='#999999', flex=0), ]), BoxComponent( layout='vertical', margin='lg', contents=[ BoxComponent( layout='baseline', contents=[ TextComponent(text='營業地址:', color='#aaaaaa', size='sm', flex=2), TextComponent(text='台北市信義路14號', color='#666666', size='sm', flex=5) ], ), SeparatorComponent(color='#0000FF'), BoxComponent( layout='baseline', contents=[ TextComponent(text='營業時間:', color='#aaaaaa', size='sm', flex=2), TextComponent(text="10:00 - 23:00", color='#666666', size='sm', flex=5), ], ), ], ), BoxComponent(layout='horizontal', margin='xxl', contents=[ ButtonComponent( style='primary', height='sm', action=URIAction( label='電話聯絡', uri='tel:0987654321'), ), ButtonComponent( style='secondary', height='sm', action=URIAction( label='查看網頁', uri="http://www.e-happy.com.tw")) ]) ], ), footer=BoxComponent( #底部版權宣告 layout='vertical', contents=[ TextComponent(text='Copyright@ehappy studio 2019', color='#888888', size='sm', align='center'), ]), ) message = FlexSendMessage(alt_text="彈性配置範例", contents=bubble) line_bot_api.reply_message(event.reply_token, message) except: line_bot_api.reply_message(event.reply_token, TextSendMessage(text='發生錯誤!'))
def handle_text_message(event): text = event.message.text if text == 'profile': if isinstance(event.source, SourceUser): profile = line_bot_api.get_profile(event.source.user_id) line_bot_api.reply_message(event.reply_token, [ TextSendMessage(text='Display name: ' + profile.display_name), TextSendMessage(text='Status message: ' + str(profile.status_message)) ]) else: line_bot_api.reply_message( event.reply_token, TextSendMessage( text="Bot can't use profile API without user ID")) elif text == 'quota': quota = line_bot_api.get_message_quota() line_bot_api.reply_message(event.reply_token, [ TextSendMessage(text='type: ' + quota.type), TextSendMessage(text='value: ' + str(quota.value)) ]) elif text == 'quota_consumption': quota_consumption = line_bot_api.get_message_quota_consumption() line_bot_api.reply_message(event.reply_token, [ TextSendMessage(text='total usage: ' + str(quota_consumption.total_usage)), ]) elif text == 'push': line_bot_api.push_message(event.source.user_id, [ TextSendMessage(text='PUSH!'), ]) elif text == 'multicast': line_bot_api.multicast([event.source.user_id], [ TextSendMessage(text='THIS IS A MULTICAST MESSAGE'), ]) elif text == 'broadcast': line_bot_api.broadcast([ TextSendMessage(text='THIS IS A BROADCAST MESSAGE'), ]) elif text.startswith('broadcast '): # broadcast 20190505 date = text.split(' ')[1] print("Getting broadcast result: " + date) result = line_bot_api.get_message_delivery_broadcast(date) line_bot_api.reply_message(event.reply_token, [ TextSendMessage(text='Number of sent broadcast messages: ' + date), TextSendMessage(text='status: ' + str(result.status)), TextSendMessage(text='success: ' + str(result.success)), ]) elif text == 'bye': if isinstance(event.source, SourceGroup): line_bot_api.reply_message(event.reply_token, TextSendMessage(text='Leaving group')) line_bot_api.leave_group(event.source.group_id) elif isinstance(event.source, SourceRoom): line_bot_api.reply_message(event.reply_token, TextSendMessage(text='Leaving group')) line_bot_api.leave_room(event.source.room_id) else: line_bot_api.reply_message( event.reply_token, TextSendMessage(text="Bot can't leave from 1:1 chat")) elif text == 'image': url = request.url_root + '/static/logo.png' app.logger.info("url=" + url) line_bot_api.reply_message(event.reply_token, ImageSendMessage(url, url)) elif text == 'confirm': confirm_template = ConfirmTemplate(text='Do it?', actions=[ MessageAction(label='Yes', text='Yes!'), MessageAction(label='No', text='No!'), ]) template_message = TemplateSendMessage(alt_text='Confirm alt text', template=confirm_template) line_bot_api.reply_message(event.reply_token, template_message) elif text == 'buttons': buttons_template = ButtonsTemplate( title='My buttons sample', text='Hello, my buttons', actions=[ URIAction(label='Go to line.me', uri='https://line.me'), PostbackAction(label='ping', data='ping'), PostbackAction(label='ping with text', data='ping', text='ping'), MessageAction(label='Translate Rice', text='米') ]) template_message = TemplateSendMessage(alt_text='Buttons alt text', template=buttons_template) line_bot_api.reply_message(event.reply_token, template_message) elif text == 'carousel': carousel_template = CarouselTemplate(columns=[ CarouselColumn(text='hoge1', title='fuga1', actions=[ URIAction(label='Go to line.me', uri='https://line.me'), PostbackAction(label='ping', data='ping') ]), CarouselColumn(text='hoge2', title='fuga2', actions=[ PostbackAction(label='ping with text', data='ping', text='ping'), MessageAction(label='Translate Rice', text='米') ]), ]) template_message = TemplateSendMessage(alt_text='Carousel alt text', template=carousel_template) line_bot_api.reply_message(event.reply_token, template_message) elif text == 'image_carousel': image_carousel_template = ImageCarouselTemplate(columns=[ ImageCarouselColumn( image_url='https://via.placeholder.com/1024x1024', action=DatetimePickerAction(label='datetime', data='datetime_postback', mode='datetime')), ImageCarouselColumn( image_url='https://via.placeholder.com/1024x1024', action=DatetimePickerAction( label='date', data='date_postback', mode='date')) ]) template_message = TemplateSendMessage( alt_text='ImageCarousel alt text', template=image_carousel_template) line_bot_api.reply_message(event.reply_token, template_message) elif text == 'imagemap': pass elif text == 'flex': bubble = BubbleContainer( direction='ltr', hero=ImageComponent(url='https://example.com/cafe.jpg', size='full', aspect_ratio='20:13', aspect_mode='cover', action=URIAction(uri='http://example.com', label='label')), body=BoxComponent( layout='vertical', contents=[ # title TextComponent(text='Brown Cafe', weight='bold', size='xl'), # review BoxComponent( layout='baseline', margin='md', contents=[ IconComponent( size='sm', url='https://example.com/gold_star.png'), IconComponent( size='sm', url='https://example.com/grey_star.png'), IconComponent( size='sm', url='https://example.com/gold_star.png'), IconComponent( size='sm', url='https://example.com/gold_star.png'), IconComponent( size='sm', url='https://example.com/grey_star.png'), TextComponent(text='4.0', size='sm', color='#999999', margin='md', flex=0) ]), # info BoxComponent( layout='vertical', margin='lg', spacing='sm', contents=[ BoxComponent( layout='baseline', spacing='sm', contents=[ TextComponent(text='Place', color='#aaaaaa', size='sm', flex=1), TextComponent(text='Shinjuku, Tokyo', wrap=True, color='#666666', size='sm', flex=5) ], ), BoxComponent( layout='baseline', spacing='sm', contents=[ TextComponent(text='Time', color='#aaaaaa', size='sm', flex=1), TextComponent( text="10:00 - 23:00", wrap=True, color='#666666', size='sm', flex=5, ), ], ), ], ) ], ), footer=BoxComponent( layout='vertical', spacing='sm', contents=[ # callAction, separator, websiteAction SpacerComponent(size='sm'), # callAction ButtonComponent( style='link', height='sm', action=URIAction(label='CALL', uri='tel:000000'), ), # separator SeparatorComponent(), # websiteAction ButtonComponent(style='link', height='sm', action=URIAction( label='WEBSITE', uri="https://example.com")) ]), ) message = FlexSendMessage(alt_text="hello", contents=bubble) line_bot_api.reply_message(event.reply_token, message) elif text == 'quick_reply': line_bot_api.reply_message( event.reply_token, TextSendMessage( text='Quick reply', quick_reply=QuickReply(items=[ QuickReplyButton( action=PostbackAction(label="label1", data="data1")), QuickReplyButton( action=MessageAction(label="label2", text="text2")), QuickReplyButton(action=DatetimePickerAction( label="label3", data="data3", mode="date")), QuickReplyButton(action=CameraAction(label="label4")), QuickReplyButton(action=CameraRollAction(label="label5")), QuickReplyButton(action=LocationAction(label="label6")), ]))) elif text == 'link_token' and isinstance(event.source, SourceUser): link_token_response = line_bot_api.issue_link_token( event.source.user_id) line_bot_api.reply_message(event.reply_token, [ TextSendMessage(text='link_token: ' + link_token_response.link_token) ]) elif text == 'insight_message_delivery': today = datetime.date.today().strftime("%Y%m%d") response = line_bot_api.get_insight_message_delivery(today) if response.status == 'ready': messages = [ TextSendMessage(text='broadcast: ' + str(response.broadcast)), TextSendMessage(text='targeting: ' + str(response.targeting)), ] else: messages = [TextSendMessage(text='status: ' + response.status)] line_bot_api.reply_message(event.reply_token, messages) elif text == 'insight_followers': today = datetime.date.today().strftime("%Y%m%d") response = line_bot_api.get_insight_followers(today) if response.status == 'ready': messages = [ TextSendMessage(text='followers: ' + str(response.followers)), TextSendMessage(text='targetedReaches: ' + str(response.targeted_reaches)), TextSendMessage(text='blocks: ' + str(response.blocks)), ] else: messages = [TextSendMessage(text='status: ' + response.status)] line_bot_api.reply_message(event.reply_token, messages) elif text == 'insight_demographic': response = line_bot_api.get_insight_demographic() if response.available: messages = [ "{gender}: {percentage}".format(gender=it.gender, percentage=it.percentage) for it in response.genders ] else: messages = [TextSendMessage(text='available: false')] line_bot_api.reply_message(event.reply_token, messages) else: line_bot_api.reply_message(event.reply_token, TextSendMessage(text=event.message.text))
), ], ) ], ), footer=BoxComponent( layout='vertical', spacing='sm', contents=[ # separator SeparatorComponent(), # websiteAction ButtonComponent( style='link', height='sm', action=URIAction(label='mosen.bw', uri="https://line.me/ti/p/~masih.00") ) ] ), ) message = FlexSendMessage(alt_text="hello", contents=bubble) line_bot_api.reply_message( event.reply_token, message ) #======================================================================================================================= import os if __name__ == "__main__": port = int(os.environ.get('PORT', 5000)) app.run(host='0.0.0.0', port=port)
def menu_test(cls): return FlexSendMessage(alt_text="hello", contents=CarouselContainer.new_from_json_dict( cls.recipe_menu_tmp))
} ] } } ] } """ survey_flexCarouselContainerJsonDict = survey_flexCarouselContainerJsonDict.replace( "#img_url_001#", ('https://%s/images/0001.jpg' % server_url)) survey_flexCarouselContainerJsonDict = survey_flexCarouselContainerJsonDict.replace( "#img_url_002#", ('https://%s/images/0002.jpg' % server_url)) survey_flexCarouselContainerJsonDict = survey_flexCarouselContainerJsonDict.replace( "#img_url_003#", ('https://%s/images/0003.jpg' % server_url)) survey_flexCarouselContainerJsonDict = survey_flexCarouselContainerJsonDict.replace( "#img_url_004#", ('https://%s/images/0004.jpg' % server_url)) survey_flexCarouselContainerJsonDict = survey_flexCarouselContainerJsonDict.replace( "#img_url_005#", ('https://%s/images/0005.jpg' % server_url)) survey_flexCarouselContainerJsonDict = survey_flexCarouselContainerJsonDict.replace( "#img_url_006#", ('https://%s/images/0006.jpg' % server_url)) # print(type(survey_flexCarouselContainerJsonDict)) # print(survey_flexCarouselContainerJsonDict) ''' 將carousel類型的json 進行轉換變成 Python可理解之類型物件 將該物件封裝進 Flex Message中 ''' survey_carouselContent = CarouselContainer.new_from_json_dict( json.loads(survey_flexCarouselContainerJsonDict)) survey_flexCarouselSendMeesage = FlexSendMessage( alt_text="偏好調查", contents=survey_carouselContent)
def skill(self): bubble = BubbleContainer( body = BoxComponent( layout = 'vertical', contents = [ # header TextComponent(text="SAM's SKIL", weight='bold', size='sm', color='#1DB446'), TextComponent(text='Programming Skill', weight='bold', size='xxl', margin='md'), SeparatorComponent(margin='xxl'), # Body BoxComponent( layout = 'vertical', margin ='md', spacing = 'sm', contents = [ # Backend BoxComponent( layout='baseline', spacing='md', contents=[ IconComponent(url='https://i.imgur.com/8Uxdkpn.png', size='md'), TextComponent(text='Backend', size='lg', color='#7b7b7b') ] ), # node go BoxComponent( layout = 'horizontal', spacing = 'md', contents = [ TextComponent(text='Node.js - express', size='sm', color='#111111'), TextComponent(text='Golang - gin', size='sm', color='#111111'), ] ), # Mobile BoxComponent( layout='baseline', spacing='md', margin='xl', contents=[ IconComponent(url='https://i.imgur.com/0hOfB2w.png', size='md'), TextComponent(text='Mobile', size='lg', color='#7b7b7b') ] ), # swift BoxComponent( layout = 'horizontal', spacing = 'md', contents = [ TextComponent(text='Swift', size='sm', color='#111111'), ] ), # Others BoxComponent( layout='baseline', spacing='md', margin='xl', contents=[ IconComponent(url='https://i.imgur.com/etmNxkf.png', size='md'), TextComponent(text='Others', size='lg', color='#7b7b7b') ] ), # py c# java html/css git docker BoxComponent( layout = 'horizontal', spacing = 'md', contents = [ TextComponent(text='Python', size='sm', color='#111111'), TextComponent(text='C#', size='sm', color='#111111'), TextComponent(text='Java', size='sm', color='#111111') ] ), BoxComponent( layout = 'horizontal', spacing = 'md', contents = [ TextComponent(text='HTML/CSS', size='sm', color='#111111'), TextComponent(text='Git', size='sm', color='#111111'), TextComponent(text='Docker', size='sm', color='#111111') ] ), # DB BoxComponent( layout='baseline', spacing='md', margin='xl', contents=[ IconComponent(url='https://i.imgur.com/DaVwYMh.png', size='md'), TextComponent(text='Database', size='lg', color='#7b7b7b') ] ), # mysql ms oracle pg redis mongo BoxComponent( layout = 'horizontal', spacing = 'md', contents = [ TextComponent(text='MySQL', size='sm', color='#111111'), TextComponent(text='MSSQL', size='sm', color='#111111'), TextComponent(text='Oracle', size='sm', color='#111111') ] ), BoxComponent( layout = 'horizontal', spacing = 'md', contents = [ TextComponent(text='PostgreSQL', size='sm', color='#111111'), TextComponent(text='Redis', size='sm', color='#111111'), TextComponent(text='Mongo', size='sm', color='#111111') ] ), SeparatorComponent(margin='xxl'), # footer BoxComponent( layout = 'vertical', spacing = 'md', contents = [ SpacerComponent(size='md'), ButtonComponent( style='primary', height='sm', color='#00BE00', action=MessageAction(label="SAM's Portfolio", text='你有什麼作品?'), ), ButtonComponent( style='secondary', height='sm', action=URIAction(label="SAM's GitHub", uri='line://app/1570355825-rLKWJZK6'), ) ] ) ] ) ] ) ) message = FlexSendMessage(alt_text="SAM's Skill", contents=bubble) return message
def handle_message(event): text = event.message.text #simplify for receove message sender = event.source.user_id #get user_id gid = event.source.sender_id #get group_id #=====[ LEAVE GROUP OR ROOM ]==========[ ARSYBAI ]====================== if text == 'bye': if isinstance(event.source, SourceGroup): line_bot_api.reply_message(event.reply_token, TextSendMessage(text='Leaving group')) line_bot_api.leave_group(event.source.group_id) elif isinstance(event.source, SourceRoom): line_bot_api.reply_message(event.reply_token, TextSendMessage(text='Leaving group')) line_bot_api.leave_room(event.source.room_id) else: line_bot_api.reply_message( event.reply_token, TextSendMessage(text="Bot can't leave from 1:1 chat")) #=====[ TEMPLATE MESSAGE ]=============[ ARSYBAI ]====================== elif text == '/template': buttons_template = TemplateSendMessage( alt_text='template', template=ButtonsTemplate( title='[ TEMPLATE MSG ]', text='Tap the Button', actions=[ MessageTemplateAction(label='Culum 1', text='/arsybai'), MessageTemplateAction(label='CULUM 2', text='/arsybai'), MessageTemplateAction(label='CULUM 3', text='/arsybai') ])) line_bot_api.reply_message(event.reply_token, buttons_template) #=====[ CAROUSEL MESSAGE ]==========[ ARSYBAI ]====================== elif text == '/carousel': message = TemplateSendMessage( alt_text='OTHER MENU', template=CarouselTemplate(columns=[ CarouselColumn(title='CAROUSEL 1', text='This Carousel URI action', actions=[ URITemplateAction( label='>carousel 1<', uri='https://line.me/ti/p/~arsy22bai') ]), CarouselColumn(title='ABAI-API', text='API documentation', actions=[ URITemplateAction( label='>Visit<', uri='https://arsybaiapi.herokuapp.com') ]) ])) line_bot_api.reply_message(event.reply_token, message) #=====[ FLEX MESSAGE ]==========[ ARSYBAI ]====================== elif text == 'flex': bubble = BubbleContainer( direction='ltr', hero=ImageComponent(url='https://example.com/cafe.jpg', size='full', aspect_ratio='20:13', aspect_mode='cover', action=URIAction(uri='http://example.com', label='label')), body=BoxComponent( layout='vertical', contents=[ # title TextComponent(text='Brown Cafe', weight='bold', size='xl'), # review BoxComponent( layout='baseline', margin='md', contents=[ IconComponent( size='sm', url='https://example.com/gold_star.png'), IconComponent( size='sm', url='https://example.com/grey_star.png'), IconComponent( size='sm', url='https://example.com/gold_star.png'), IconComponent( size='sm', url='https://example.com/gold_star.png'), IconComponent( size='sm', url='https://example.com/grey_star.png'), TextComponent(text='4.0', size='sm', color='#999999', margin='md', flex=0) ]), # info BoxComponent( layout='vertical', margin='lg', spacing='sm', contents=[ BoxComponent( layout='baseline', spacing='sm', contents=[ TextComponent(text='Place', color='#aaaaaa', size='sm', flex=1), TextComponent(text='Shinjuku, Tokyo', wrap=True, color='#666666', size='sm', flex=5) ], ), BoxComponent( layout='baseline', spacing='sm', contents=[ TextComponent(text='Time', color='#aaaaaa', size='sm', flex=1), TextComponent( text="10:00 - 23:00", wrap=True, color='#666666', size='sm', flex=5, ), ], ), ], ) ], ), footer=BoxComponent( layout='vertical', spacing='sm', contents=[ # separator SeparatorComponent(), # websiteAction ButtonComponent(style='link', height='sm', action=URIAction( label='WEBSITE', uri="https://example.com")) ]), ) message = FlexSendMessage(alt_text="hello", contents=bubble) line_bot_api.reply_message(event.reply_token, message)
def Choose_Seat_Message(dict_doc): Contents = [] Seats = [ 'A桌(2人)', 'B桌(2人)', 'C桌(4人)', 'D桌(4人)', 'E桌(4人)', 'F桌(4人)', 'G桌(4人)', 'H桌(4人)', 'I桌(6人)', 'J桌(6人)' ] if (int)(dict_doc['Num_People']) <= 2: Seats = Seats[0:3] elif 2 < (int)(dict_doc['Num_People']) <= 4: Seats = Seats[2:8] elif 4 < (int)(dict_doc['Num_People']): Seats = Seats[-2:] elif int(dict_doc['Num_People']) > 6: ChooseSeatMessage = TextSendMessage( text='因人數較多,麻煩您打電話至店裡,由店內人員幫您安排座位,感謝您!') return ChooseSeatMessage # 取得順位 doc_ref = firedb.collection_group('訂位紀錄') docs = doc_ref.stream() # generator # 1個ID(collection)算一次迴圈 for doc in docs: for d in doc.to_dict(): # for each in dict try: # 如果他訂的時間一小時內沒有人的話開放位置, 有的話就不開放 selected_time = datetime.strptime( dict_doc['selected_time'], '%Y-%m-%dT%H:%M') selected_time_plus = datetime.strptime( dict_doc['selected_time'], '%Y-%m-%dT%H:%M') + timedelta(hours=1) other_selected_time = datetime.strptime( doc.to_dict()[d][1], '%Y-%m-%dT%H:%M') if selected_time <= other_selected_time and selected_time_plus >= other_selected_time: Seats.remove(doc.to_dict()[d][3]) else: pass except: pass for M in range(len(Seats)): Contents.append({ "type": "bubble", "body": { "type": "box", "layout": "vertical", "contents": [{ "type": "button", "style": "primary", "color": "#905c44", "action": { "type": "postback", "label": Seats[M], "data": Seats[M] }, "height": "sm" }] }, "styles": { "footer": { "separator": True } } }) ChooseSeatMessage = FlexSendMessage(alt_text='選擇座位', position='absolute', contents={ "type": "carousel", "contents": Contents }) return ChooseSeatMessage
def handle_text_message(event): text = event.message.text.lower() words = text.split() if words[0] == "kony": if words[1] in VOTE_REGEX: # vote if words[2].isdigit() and words[3].isdigit(): # Get user id and username profile = line_bot_api.get_profile(event.source.user_id) name = profile.display_name.replace(" ","_") # rate cewe to database id_cewe , score = words[2] , words[3] db.__rate_cewe__(name,id_cewe,score) # check image is exist and send flex message url_img = HTTPS+STATIC+"/"+str(id_cewe)+".jpg" if os.path.isfile(LOCAL_STATIC+"/"+str(id_cewe)+".jpg"): list_voter = db.__get_rated__(id_cewe) line_bot_api.reply_message( event.reply_token, FlexSendMessage(alt_text='hello', contents=flex.flex_rated(str(id_cewe), url_img,list_voter))) else: line_bot_api.reply_message( event.reply_token, TextSendMessage(text="sorry id cewe does not exist")) elif words[1] == "get" : # get user id and username profile = line_bot_api.get_profile(event.source.user_id) name = profile.display_name.replace(" ","_") # get id cewe that not voted by username ids_cewe =db. __get_cewe_unvoted__(name) print(ids_cewe) if ids_cewe[0] != -1: flex_messages = [] if len(ids_cewe) > 5: ids_cewe = ids_cewe[:5] for id_cewe in ids_cewe: url_img = HTTPS+STATIC+"/"+str(id_cewe)+".jpg" list_voter = db.__get_rated__(id_cewe) flex_message = flex.flex_rated(str(id_cewe),url_img,list_voter) flex_messages.append(flex_message) print(type(flex_messages[0])) flex_messages = CarouselContainer(flex_messages) flex_messages = FlexSendMessage("list cewe",flex_messages) line_bot_api.reply_message(event.reply_token,flex_messages) else: line_bot_api.reply_message( event.reply_token, TextSendMessage(text="you already voted all cewe")) elif text == "kony createtablevoting": # create table voting db.__create_table__() elif text == "kony help": # send kony help __send_help_message__(event) else: # send kony help if user typo __send_help_message__(event)
def Menu_Message(): Contents = [] Menus = [] Menus.append( 'https://i.imgur.com/ZSsqBqW.jpg 精緻簡餐 (本店週六、日用餐消費加收一成服務費,若有加贈甜點已美餐60分,送完為止。)\n附餐有:(熱)咖啡、紅茶、綠茶、柚子茶、巧克力、甜湯、綠茶、冰綠茶、咖啡、紅茶、奶茶、檸檬汁、蔓越莓冰醋 >>右滑看菜單>>' ) Menus.append('https://i.imgur.com/SBDmHrJ.jpg 芒果炒雞柳 -詳細介紹- NT$300') Menus.append('https://i.imgur.com/JCBXVEq.jpg 東坡肉 -詳細介紹- NT$310') Menus.append('https://i.imgur.com/gGhxvM6.jpg 嫩煎牛排 -詳細介紹- NT$320') Menus.append('https://i.imgur.com/MhAb8nA.jpg 蒜泥白玉蒸蝦 -詳細介紹- NT$330') Menus.append('https://i.imgur.com/JZssJkM.jpg 蒜苗炒松阪牛 -詳細介紹- NT$340') Menus.append( 'https://i.imgur.com/HJr3SU5.jpg 橙汁魚排 外銷日本潮鯛魚排輕裹粉煎酥佐以橙汁醬\n略帶酸甜口味開會美味好滋味 NT$290' ) for M in range(len(Menus)): Mlist = Menus[M].split(" ") if M == 0: Contents.append({ "type": "bubble", "hero": { "type": "image", "url": Mlist[0], # img 網址 "size": "full", "aspectRatio": "10:9", "aspectMode": "cover", "backgroundColor": "#FFFFFF" }, "body": { "type": "box", "layout": "vertical", "contents": [{ "type": "text", "text": Mlist[1], "weight": "bold", "size": "xl", "margin": "md", "wrap": True }, { "type": "text", "text": Mlist[2], "margin": "md", "wrap": True }, { "type": "text", "text": Mlist[3], "margin": "md", "weight": "bold", "align": "center", "wrap": True }] }, "footer": { "type": "box", "layout": "vertical", "contents": [{ "type": "spacer", "size": "xxl" }, { "type": "button", "style": "primary", "color": "#905c44", "action": { "type": "postback", "label": "確定訂單", "data": "confirm" } }] } }) else: Contents.append({ "type": "bubble", "hero": { "type": "image", "url": Mlist[0], # img 網址 "size": "full", "aspectRatio": "10:9", "aspectMode": "cover", "backgroundColor": "#FFFFFF" }, "body": { "type": "box", "layout": "vertical", "contents": [{ "type": "text", "text": Mlist[1], "weight": "bold", "size": "xl", "margin": "md", "wrap": True }, { "type": "text", "text": Mlist[2], "margin": "md", "wrap": True }, { "type": "text", "text": Mlist[3], "size": "md", "flex": 0 }] }, "footer": { "type": "box", "layout": "horizontal", "contents": [{ "type": "button", "style": "primary", "cornerRadius": "75px", "color": "#905c44", "action": { "type": "postback", "label": "+", "data": '加 ' + Mlist[1] }, "height": "sm" }, { "type": "button", "style": "primary", "color": "#905c44", "cornerRadius": "100px", "action": { "type": "postback", "label": "-", "data": '減 ' + Mlist[1] }, "height": "sm" }], "flex": 0 } }) MenuMessage = FlexSendMessage(alt_text='菜單查詢', position='absolute', contents={ "type": "carousel", "contents": Contents }) return MenuMessage
def Cancel_Message(UserId): firebase_rec = {} doc_ref = firedb.collection('訂位紀錄').document(UserId) doc = doc_ref.get().to_dict() if doc == None: # 無過往紀錄 reply_message = [ TextSendMessage(text='目前沒有訂位紀錄!!'), TextSendMessage(text='如需要訂位,麻煩按下訂位查詢喔~') ] else: reply_message = [] reply_data = [] for k, v in doc.items(): try: if datetime.strptime(v[1], '%Y-%m-%dT%H:%M') < ( datetime.now() - timedelta(minutes=30)): pass else: reply_message.append(v[0]) reply_message.append(v[1].replace('T', ' ')) reply_message.append(v[2]) reply_message.append(v[4]) reply_data.append(k) except: pass if len(reply_message) == 0: reply_message = [ TextSendMessage(text='目前沒有訂位紀錄!!'), TextSendMessage(text='如需要訂位,麻煩按下預約訂位喔~') ] else: doc_ref = firedb.collection('是否訂位').document(UserId) firebase_rec['step'] = 'C1' firebase_rec['status'] = 'cancel' doc_ref.update(firebase_rec) Contents = [] for t in range(0, len(reply_message), 4): Contents.append({ "type": "bubble", "body": { "type": "box", "layout": "vertical", "contents": [{ "type": "text", "text": "姓名: " + reply_message[t] + "\n訂位時間: " + reply_message[t + 1] + "\n人數: " + reply_message[t + 2] + "\n訂單編號: " + reply_message[t + 3], "margin": "md", "wrap": True }, { "type": "button", "action": { "type": "postback", "label": "取消此次訂位", "data": reply_data[(t // 4)] }, "margin": "md", "weight": "bold", "align": "center" }] }, "styles": { "footer": { "separator": True } } }) if t == 15: break # 最多長度為15 reply_message = [ TextSendMessage(text='僅顯示15筆訂單'), FlexSendMessage(alt_text='取消訂位中', position='absolute', contents={ "type": "carousel", "contents": Contents }) ] return reply_message
def Time_Message(number): # 選日期 ntime = datetime.now() mtime = ntime + timedelta(days=30) if number == 1: if len(str(ntime.month)) == 1: month = '0' + str(ntime.month) else: month = str(ntime.month) if len(str(ntime.day)) == 1: day = '0' + str(ntime.day) else: day = str(ntime.day) nowtime = str( ntime.year) + '-' + month + '-' + day + "T11:30" # 舊版 if len(str(mtime.month)) == 1: month = '0' + str(mtime.month) else: month = str(mtime.month) if len(str(mtime.day)) == 1: day = '0' + str(mtime.day) else: day = str(mtime.day) maxtime = str(mtime.year) + '-' + month + '-' + day + "T19:50" #print(nowtime) TimeMessage = FlexSendMessage( alt_text='選時間', position='absolute', contents={ 'type': 'bubble', 'direction': 'ltr', 'hero': { 'type': 'image', 'url': 'https://i.imgur.com/1sVGKkq.jpg', 'size': 'full', 'action': { "type": "datetimepicker", "label": "select time", # 方便用post接收資料 "data": "selected time", "mode": "datetime", "initial": nowtime, # format: date "max": maxtime, "min": nowtime } } }) elif number == 2: ''' if len(str(ntime.minute)) == 1: minute = '0'+str(ntime.minute) else: minute = str(ntime.minute) if len(str(ntime.hour)) == 1: hour = '0'+str(ntime.hour) else: hour = str(ntime.hour) nowtime = hour + ':' + minute #print(nowtime)''' TimeMessage = FlexSendMessage( alt_text='選時間', position='absolute', contents={ 'type': 'bubble', 'direction': 'ltr', 'hero': { 'type': 'image', 'url': 'https://i.imgur.com/Cp3nmkw.jpg', 'size': 'full', 'action': { "type": "datetimepicker", "label": "select time", # 方便用post接收資料 "data": "selected time", "mode": "time", # format: time "initial": '11:30', "min": '11:30', "max": '19:50' } } }) return TimeMessage
def handle_message(event): global set_ global stoptime global stoppoint msg_from = event.reply_token msg_text = event.message.text user_id = event.source.user_id '''if msg_text == '設定する': items = {'items': [{'type': 'action','action': {'type': 'message','label': '貯める','text': '貯める'}},{'type': 'action','action': {'type': 'message','label': '使う','text': '使う'}}]} line_bot_api.reply_message(msg_from,TextSendMessage(text='まずは貯めるのか使うのかを教えてね!',quick_reply=items)) setting_[user_id] = {'use':True,'name':'name','point':0,'time':0,'timepoint':0,'ID':'','point2':0,'dbID':0} setting_[user_id]['ID'] = user_id Time[user_id] = {'count':0,'pointcount_1':0,'pointcount_2':0,'pointcount2_1':0,'pointcount2_2':0} setting2[user_id] = {'setting1':False,'setting2':False,'setting3':False,'setting4':False,'setting5':False,'setting6':False,'setting7':False,'setting8':False,'setting9':False,'setting10':False,} set_ = 2 ''' if msg_text == '布教する': line_bot_api.reply_message( msg_from, TextSendMessage(text='まずは布教したいYoutubeの動画のリンクを送ってね!')) setting_[user_id] = { 'use': True, 'name': 'name', 'point': 0, 'time': 0, 'timepoint': 0, 'ID': '', 'point2': 0, 'dbID': 0 } setting_[user_id]['ID'] = user_id Time[user_id] = { 'count': 0, 'pointcount_1': 0, 'pointcount_2': 0, 'pointcount2_1': 0, 'pointcount2_2': 0 } setting2[user_id] = { 'setting1': False, 'setting2': False, 'setting3': False, 'setting4': False, 'setting5': False, 'setting6': False, 'setting7': False, 'setting8': False, 'setting9': False, 'setting10': False, } set_ = 2 setting2[user_id]['setting1'] = True return if msg_text == 'ゲットする': url = geturl() flex_ = Flex(url) seve2(user_id, url[0]) flex = {"type": "flex", "altText": "YouTubeリンク", "contents": flex_} container_obj = FlexSendMessage.new_from_json_dict(flex) line_bot_api.reply_message(msg_from, messages=container_obj) return if msg_text == 'いいね!': url = IDcheck(user_id) data = getdata(url) hoge = like(user_id, data) if hoge == True: line_bot_api.reply_message(msg_from, TextSendMessage(text="いいねを押したよ!")) if hoge == False: line_bot_api.reply_message( msg_from, TextSendMessage(text="いいねを押せなかったよ!\nいいねは1回しか押せないよ!")) return # if 'メッセージ:' in msg_text: # #namecheck(user_id,'test') # msg_text_ = msg_text.replace("メッセージ:","") # line_bot_api.reply_message(msg_from,TextSendMessage(text='送信したよ!')) # line_bot_api.reply_message("U76d18383a9b659b9ab3d0e43d06c1e78",TextSendMessage(text=msg_text_)) else: try: if setting2[user_id]['setting1'] == True and user_id == setting_[ user_id]['ID']: setting2[user_id]['setting1'] = False try: if 'youtu.be' in msg_text or 'youtube.com' in msg_text: print('url OK') URL = msg_text setting_youtube[user_id] = { 'url': URL, 'text': '', 'ctg': '' } setting2[user_id]['setting2'] = True line_bot_api.reply_message( msg_from, TextSendMessage( text='URLを設定したよ!\n次はURLの動画についてのコメントを送信してね!!')) return except Exception as e: print(str(e)) return except Exception as e: print(str(e)) items = { 'items': [{ 'type': 'action', 'action': { 'type': 'message', 'label': '布教する', 'text': '布教する' } }, { 'type': 'action', 'action': { 'type': 'message', 'label': 'ゲットする', 'text': 'ゲットする' } }] } line_bot_api.reply_message( msg_from, TextSendMessage( text= '新しい動画を探してたら\n「ゲットする」\nと送信してね!\n\n動画を布教する場合は\n「布教する」\nと送信してね!\n\n下のボタンからも送信できるよ!', quick_reply=items)) return if setting2[user_id]['setting2'] == True and user_id == setting_[ user_id]['ID']: try: print('ok-12') setting_youtube[user_id]['text'] = msg_text setting2[user_id]['setting2'] = False setting2[user_id]['setting3'] = True items = { 'items': [{ 'type': 'action', 'action': { 'type': 'message', 'label': '音楽', 'text': '音楽' } }, { 'type': 'action', 'action': { 'type': 'message', 'label': 'おもしろ', 'text': 'おもしろ' } }, { 'type': 'action', 'action': { 'type': 'message', 'label': 'VTuber', 'text': 'VTuber' } }] } line_bot_api.reply_message( msg_from, TextSendMessage( text= 'コメントを設定できたよ!\n次は動画のカテゴリーを決めて送信してね!\nカテゴリーは好きに作れるよ!\n\n迷ったときは下のボタンからも送信できるよ!', quick_reply=items)) return except Exception as e: print(str(e)) line_bot_api.reply_message( msg_from, TextSendMessage(text='コメントの設定に失敗したよ!')) return if setting2[user_id]['setting3'] == True and user_id == setting_[ user_id]['ID']: try: print('ok-13') setting2[user_id]['setting3'] = False setting_youtube[user_id]['ctg'] = msg_text id_list = ['test'] id_list.append(user_id) id_list_str = ','.join(id_list) youtube_set(setting_youtube[user_id]['url'], setting_youtube[user_id]['text'], "0", id_list_str, setting_youtube[user_id]['ctg']) line_bot_api.reply_message(msg_from, TextSendMessage(text='アップできたよ!')) return except Exception as e: print(str(e)) line_bot_api.reply_message(msg_from, TextSendMessage(text='アップに失敗したよ!')) return else: items = { 'items': [{ 'type': 'action', 'action': { 'type': 'message', 'label': '布教する', 'text': '布教する' } }, { 'type': 'action', 'action': { 'type': 'message', 'label': 'ゲットする', 'text': 'ゲットする' } }] } line_bot_api.reply_message( msg_from, TextSendMessage( text= '新しい動画を探してたら\n「ゲットする」\nと送信してね!\n\n動画を布教する場合は\n「布教する」\nと送信してね!\n\n下のボタンからも送信できるよ!', quick_reply=items))
def keyword_flex(event): #JSON from LINE SIMULATOR carousel_flex = { "type": "carousel", "contents": [{ "type": "bubble", "size": "micro", "hero": { "type": "image", "url": "https://images.unsplash.com/flagged/photo-1584036561584-b03c19da874c?ixlib=rb-1.2.1&auto=format&fit=crop&w=1489&q=80", "size": "full", "aspectMode": "cover", "aspectRatio": "320:213" }, "body": { "type": "box", "layout": "vertical", "contents": [{ "type": "text", "text": "COVID-19 News", "weight": "bold", "size": "md", "color": "#FF0055" }, { "type": "box", "layout": "vertical", "contents": [{ "type": "box", "layout": "baseline", "spacing": "sm", "contents": [{ "type": "text", "text": "BBC news", "color": "#8f8f8f", "size": "sm", "flex": 5, "margin": "md" }] }] }], "spacing": "sm", "paddingAll": "13px" }, "footer": { "type": "box", "layout": "vertical", "contents": [{ "type": "text", "text": "Please click here", "flex": 0, "margin": "md", "action": { "type": "uri", "label": "action", "uri": "https://www.bbc.com/zhongwen/trad/topics/a3b15769-775e-471d-a511-a7b78f346859" }, "color": "#1ABBAB" }] }, "styles": { "body": { "backgroundColor": "#FFD711" }, "footer": { "backgroundColor": "#FFD711" } } }, { "type": "bubble", "size": "micro", "hero": { "type": "image", "url": "https://www.timeshighereducation.com/sites/default/files/styles/medium/public/hong_kong_baptists_logo.jpg?itok=--nQ3fBu", "size": "full", "aspectMode": "cover", "aspectRatio": "320:213" }, "body": { "type": "box", "layout": "vertical", "contents": [{ "type": "text", "text": "HKBU update", "weight": "bold", "size": "md", "color": "#0DE39C" }, { "type": "box", "layout": "vertical", "contents": [{ "type": "box", "layout": "baseline", "spacing": "sm", "contents": [{ "type": "text", "text": "COVID-19 arrangements", "color": "#8c8c8c", "size": "xs", "flex": 5, "action": { "type": "uri", "label": "action", "uri": "http://ehsu.hkbu.edu.hk/2019-nCOV/" } }] }] }], "spacing": "sm", "paddingAll": "13px" }, "footer": { "type": "box", "layout": "vertical", "contents": [{ "type": "text", "text": "Please click here", "color": "#BB0FFB" }] }, "styles": { "body": { "backgroundColor": "#E6E6E6" }, "footer": { "backgroundColor": "#E6E6E6" } } }, { "type": "bubble", "size": "micro", "hero": { "type": "image", "url": "https://www.chp.gov.hk/files/png/logo_dh_en.png", "size": "full", "aspectMode": "cover", "aspectRatio": "320:213" }, "body": { "type": "box", "layout": "vertical", "contents": [{ "type": "text", "text": "COVID-19 FAQ", "weight": "bold", "size": "sm", "color": "#8C02F2" }, { "type": "box", "layout": "vertical", "contents": [{ "type": "box", "layout": "baseline", "spacing": "sm", "contents": [{ "type": "text", "text": "Something you should be aware", "color": "#8c8c8c", "size": "xs", "flex": 5 }] }] }], "spacing": "sm", "paddingAll": "13px" }, "footer": { "type": "box", "layout": "vertical", "contents": [{ "type": "text", "text": "Please click here", "color": "#2F71E8" }] }, "styles": { "body": { "backgroundColor": "#2FF4F1" }, "footer": { "backgroundColor": "#2FF4F1" } } }] } if re.match("information", event.message.text.lower()): try: message = FlexSendMessage(alt_text="Carousel Checklist", contents=carousel_flex) line_bot_api.reply_message( event.reply_token, message ) return True except: line_bot_api.reply_message( event.reply_token, TextSendMessage(text="can't read flex") ) return True else: return False
def join(event): reply_token = event.reply_token data = syoukai() flex = {"type": "flex", "altText": "自己紹介", "contents": data} container_obj = FlexSendMessage.new_from_json_dict(flex) line_bot_api.reply_message(reply_token, messages=container_obj)
def root(): if request.method == 'POST': print(request.json) for event in request.json['events']: if event['message']['type'] == 'location': my_y = event['message']['latitude'] my_x = event['message']['longitude'] sorted_available = get_mask(my_x, my_y, True) d = sorted_available[:10].to_dict('records') flex_dict = {"type": "carousel", "contents": []} # c = [] for i in d: flex_dict['contents'].append({ "type": "bubble", "size": "micro", "body": { "type": "box", "layout": "vertical", "contents": [{ "type": "text", "text": i['醫事機構名稱'], "weight": "bold", "size": "md", "wrap": True, "align": "center" }, { "type": "box", "layout": "vertical", "contents": [{ "type": "text", "text": "地址:", "wrap": True, "color": "#8c8c8c", "size": "xs", "flex": 5, "contents": [{ "type": "span", "text": "地址:", "color": "#000000" }, { "type": "span", "text": i['醫事機構地址'] }], "align": "start", "gravity": "top", "margin": "lg" }, { "type": "text", "text": "地址:", "wrap": True, "color": "#8c8c8c", "size": "xs", "flex": 5, "contents": [{ "type": "span", "text": "距離:", "color": "#000000" }, { "type": "span", "text": str(int(i['dist'])) + ' m' }], "margin": "md" }, { "type": "text", "text": "電話:", "wrap": True, "color": "#8c8c8c", "size": "xs", "flex": 5, "contents": [{ "type": "span", "text": "電話:", "color": "#000000" }, { "type": "span", "text": i['醫事機構電話'] }], "margin": "md" }, { "type": "text", "text": "地址:", "wrap": True, "color": "#8c8c8c", "size": "xs", "flex": 5, "contents": [{ "type": "span", "text": "成人口罩數量:", "color": "#000000" }, { "type": "span", "text": str(i['成人口罩剩餘數']) }], "margin": "md" }, { "type": "text", "text": "地址:", "wrap": True, "color": "#8c8c8c", "size": "xs", "flex": 5, "contents": [{ "type": "span", "text": "兒童口罩數量:", "color": "#000000" }, { "type": "span", "text": str(i['兒童口罩剩餘數']) }], "margin": "md" }, { "type": "text", "text": "地址:", "wrap": True, "color": "#8c8c8c", "size": "xs", "flex": 5, "contents": [{ "type": "span", "text": "備註:", "color": "#000000" }, { "type": "span", "text": str(i['看診備註']) }], "margin": "md" }] }], "spacing": "sm", "paddingAll": "13px" }, "footer": { "type": "box", "layout": "vertical", "contents": [{ "type": "button", "action": { "type": "uri", "label": "電話", "uri": 'tel:' + i['醫事機構電話'].replace( '(', '').replace(')', '') } }, { "type": "button", "action": { "type": "uri", "label": "導航", "uri": "http://www.google.com.tw/maps/search/" + urllib.parse.quote(i['醫事機構地址']) } }], "spacing": "sm", "paddingAll": "13px" } }) line_bot_api.reply_message( event['replyToken'], FlexSendMessage(alt_text="喵", contents=flex_dict)) else: line_bot_api.reply_message( event['replyToken'], TextSendMessage(text='發定位給我LA\nQQ\n喵喵')) return '1'
def handle_text_message(event): text = event.message.text if text == 'profile': if isinstance(event.source, SourceUser): profile = line_bot_api.get_profile(event.source.user_id) line_bot_api.reply_message(event.reply_token, [ TextSendMessage(text='Display name: ' + profile.display_name), TextSendMessage(text='Status message: ' + profile.status_message) ]) else: line_bot_api.reply_message( event.reply_token, TextSendMessage( text="Bot can't use profile API without user ID")) elif text == 'bye': if isinstance(event.source, SourceGroup): line_bot_api.reply_message(event.reply_token, TextSendMessage(text='Leaving group')) line_bot_api.leave_group(event.source.group_id) elif isinstance(event.source, SourceRoom): line_bot_api.reply_message(event.reply_token, TextSendMessage(text='Leaving group')) line_bot_api.leave_room(event.source.room_id) else: line_bot_api.reply_message( event.reply_token, TextSendMessage(text="Bot can't leave from 1:1 chat")) elif text == 'confirm': confirm_template = ConfirmTemplate(text='Do it?', actions=[ MessageAction(label='Yes', text='Yes!'), MessageAction(label='No', text='No!'), ]) template_message = TemplateSendMessage(alt_text='Confirm alt text', template=confirm_template) line_bot_api.reply_message(event.reply_token, template_message) elif text == 'buttons': buttons_template = ButtonsTemplate( title='My buttons sample', text='Hello, my buttons', actions=[ URIAction(label='Go to line.me', uri='https://line.me'), PostbackAction(label='ping', data='ping'), PostbackAction(label='ping with text', data='ping', text='ping'), MessageAction(label='Translate Rice', text='米') ]) template_message = TemplateSendMessage(alt_text='Buttons alt text', template=buttons_template) line_bot_api.reply_message(event.reply_token, template_message) elif text == 'carousel': carousel_template = CarouselTemplate(columns=[ CarouselColumn(text='hoge1', title='fuga1', actions=[ URIAction(label='Go to line.me', uri='https://line.me'), PostbackAction(label='ping', data='ping') ]), CarouselColumn(text='hoge2', title='fuga2', actions=[ PostbackAction(label='ping with text', data='ping', text='ping'), MessageAction(label='Translate Rice', text='米') ]), ]) template_message = TemplateSendMessage(alt_text='Carousel alt text', template=carousel_template) line_bot_api.reply_message(event.reply_token, template_message) elif text == 'image_carousel': image_carousel_template = ImageCarouselTemplate(columns=[ ImageCarouselColumn( image_url='https://via.placeholder.com/1024x1024', action=DatetimePickerAction(label='datetime', data='datetime_postback', mode='datetime')), ImageCarouselColumn( image_url='https://via.placeholder.com/1024x1024', action=DatetimePickerAction( label='date', data='date_postback', mode='date')) ]) template_message = TemplateSendMessage( alt_text='ImageCarousel alt text', template=image_carousel_template) line_bot_api.reply_message(event.reply_token, template_message) elif text == 'imagemap': pass elif text == 'flex': bubble = BubbleContainer( direction='ltr', hero=ImageComponent(url='https://example.com/cafe.jpg', size='full', aspect_ratio='20:13', aspect_mode='cover', action=URIAction(uri='http://example.com', label='label')), body=BoxComponent( layout='vertical', contents=[ # title TextComponent(text='Brown Cafe', weight='bold', size='xl'), # review BoxComponent( layout='baseline', margin='md', contents=[ IconComponent( size='sm', url='https://example.com/gold_star.png'), IconComponent( size='sm', url='https://example.com/grey_star.png'), IconComponent( size='sm', url='https://example.com/gold_star.png'), IconComponent( size='sm', url='https://example.com/gold_star.png'), IconComponent( size='sm', url='https://example.com/grey_star.png'), TextComponent(text='4.0', size='sm', color='#999999', margin='md', flex=0) ]), # info BoxComponent( layout='vertical', margin='lg', spacing='sm', contents=[ BoxComponent( layout='baseline', spacing='sm', contents=[ TextComponent(text='Place', color='#aaaaaa', size='sm', flex=1), TextComponent(text='Shinjuku, Tokyo', wrap=True, color='#666666', size='sm', flex=5) ], ), BoxComponent( layout='baseline', spacing='sm', contents=[ TextComponent(text='Time', color='#aaaaaa', size='sm', flex=1), TextComponent( text="10:00 - 23:00", wrap=True, color='#666666', size='sm', flex=5, ), ], ), ], ) ], ), footer=BoxComponent( layout='vertical', spacing='sm', contents=[ # callAction, separator, websiteAction SpacerComponent(size='sm'), # callAction ButtonComponent( style='link', height='sm', action=URIAction(label='CALL', uri='tel:000000'), ), # separator SeparatorComponent(), # websiteAction ButtonComponent(style='link', height='sm', action=URIAction( label='WEBSITE', uri="https://example.com")) ]), ) message = FlexSendMessage(alt_text="hello", contents=bubble) line_bot_api.reply_message(event.reply_token, message) else: line_bot_api.reply_message(event.reply_token, TextSendMessage(text=event.message.text))
def handle_audio(event): name_mp3 = 'recording.mp3' name_wav = 'recording.wav' message_content = line_bot_api.get_message_content(event.message.id) with open(name_mp3, 'wb') as fd: for chunk in message_content.iter_content(): fd.write(chunk) os.system('ffmpeg -y -i ' + name_mp3 + ' ' + name_wav + ' -loglevel quiet') text = transcribe(name_wav) new_text = Converter('zh-hant').convert(text) msg = new_text if "最新商品消息" in msg or "商品" in msg or "消息" in msg or "最新" in msg: carousel_template = CarouselTemplate(columns=[ CarouselColumn( thumbnail_image_url= 'https://uploads-ssl.webflow.com/575714cc825e8dbc6c83b98a/5fd9c3b6cbffe80c6574ffbe_Animal%20Upon%20Animal_X%27mas_Box_3D_DE.jpg', text='聖誕節!所有的動物決定以一場堆疊友誼賽來慶祝佳節。遊戲中,誰能率先將自己所有配件疊上金字塔?', title='動物疊疊樂 聖誕金字塔', actions=[ URIAction( label='介紹影片', uri= 'https://www.youtube.com/watch?v=LfsPqDwt5aU&feature=emb_title&ab_channel=%E6%96%B0%E5%A4%A9%E9%B5%9D%E5%A0%A1%E6%A1%8C%E9%81%8ASwanPanasia' ) ]), CarouselColumn( thumbnail_image_url= 'https://uploads-ssl.webflow.com/575714cc825e8dbc6c83b98a/5f6d89f01b318a3b7ff66db5_Night%20of%20Witnesses_Box.jpg', text='山中作客的夜晚,主人慘遭殺害!賓客能否藉由各自職業上的優勢,識破殺人魔與其共犯羅織的謊言?', title='目擊者之夜', actions=[ URIAction( label='介紹影片', uri= 'https://www.youtube.com/watch?v=do9kypzitus&feature=emb_title&ab_channel=%E6%96%B0%E5%A4%A9%E9%B5%9D%E5%A0%A1%E6%A1%8C%E9%81%8ASwanPanasia' ) ]), CarouselColumn( thumbnail_image_url= 'https://uploads-ssl.webflow.com/575714cc825e8dbc6c83b98a/5ab8f125ff9c8b071bceccc8_Bamboleo_Box_3D.jpg', text='平衡天使是給所有重力學專家的一款極富技巧性的遊戲!參與遊戲或旁觀都十分有趣。', title='平衡天使', actions=[ URIAction( label='介紹影片', uri= 'https://www.youtube.com/watch?v=EmPR8leNWhk&ab_channel=%E6%96%B0%E5%A4%A9%E9%B5%9D%E5%A0%A1%E6%A1%8C%E9%81%8ASwanPanasia' ) ]), CarouselColumn( thumbnail_image_url= 'https://uploads-ssl.webflow.com/575714cc825e8dbc6c83b98a/5d1c01a5d9148d107e01c93c_BOOOOOM_Box_3D.jpg', text='這是個與和平完全無關的遊戲。\n遊戲中展現弱肉強食的黑暗面,讓自己成為唯一倖存的玩家。', title='你炸我彈他', actions=[ URIAction( label='介紹影片', uri= 'https://www.youtube.com/watch?v=eeGmS_ZjFR8&ab_channel=%E6%96%B0%E5%A4%A9%E9%B5%9D%E5%A0%A1%E6%A1%8C%E9%81%8ASwanPanasia' ), ]), CarouselColumn( thumbnail_image_url= 'https://uploads-ssl.webflow.com/575714cc825e8dbc6c83b98a/5e282a8b8fc29850b3980b60_CamelUp_2020_BOX.jpg', text='快來見識有史以來最瘋狂的駱駝大賽!對自己看好的駱駝下注,以期在分段賽及賽終時贏得最多獎金。', title='駱駝大賽', actions=[ URIAction( label='介紹影片', uri= 'https://www.youtube.com/watch?v=3Iye_KoLu6M&ab_channel=%E6%96%B0%E5%A4%A9%E9%B5%9D%E5%A0%A1%E6%A1%8C%E9%81%8ASwanPanasia' ), ]) ]) template_message = TemplateSendMessage(alt_text='Carousel alt text', template=carousel_template) line_bot_api.reply_message(event.reply_token, template_message) #else: # line_bot_api.reply_message(event.reply_token, TextSendMessage(text = '抱歉,您的訊息中未包含關鍵字,煩請再試一次喔感謝~')) if "店鋪位置" in msg or "位置" in msg or "店鋪" in msg: line_bot_api.reply_message( event.reply_token, LocationSendMessage(title='Enjoy Board Game Location', address='NCU EEIT', latitude=24.969388594485057, longitude=121.19105616458904)) return #else: # line_bot_api.reply_message(event.reply_token, TextSendMessage(text = '抱歉,您的訊息中未包含關鍵字,煩請再試一次喔感謝~')) # return if "我有問題" in msg or "問題" in msg or "疑問" in msg or "QA" in msg: bubble = BubbleContainer( direction='ltr', hero=ImageComponent( url= 'https://img.ruten.com.tw/s1/5/5a/87/21715845113479_395.PNG', size='full', aspect_ratio='15:10', aspect_mode='cover', action=URIAction( uri= 'https://img.ruten.com.tw/s1/5/5a/87/21715845113479_395.PNG', label='label')), body=BoxComponent( layout='vertical', contents=[ # title TextComponent(text='常見問題', weight='bold', size='xl') ]), footer=BoxComponent( layout='vertical', spacing='sm', contents=[ # callAction, separator, websiteAction SeparatorComponent(), # callAction ButtonComponent( style='link', height='sm', action=MessageAction(label='專題成員有誰?', text="專題成員有誰?"), ), # separator SeparatorComponent(), # websiteAction ButtonComponent(style='link', height='sm', action=MessageAction(label='訓練時數多久?', text="訓練時數多久?")), SeparatorComponent(), ButtonComponent(style='link', height='sm', action=MessageAction(label='為何選擇此主題?', text="為何選擇此主題?")), SeparatorComponent(), ButtonComponent(style='link', height='sm', action=MessageAction(label='資料來源是哪?', text="資料來源是哪?")), SeparatorComponent(), ButtonComponent(style='link', height='sm', action=MessageAction(label='網站特色?', text="網站特色?")), SeparatorComponent(), ButtonComponent(style='link', height='sm', action=MessageAction(label='網站品項總共有多少?', text="網站品項總共有多少?")), SeparatorComponent(), ButtonComponent(style='link', height='sm', action=MessageAction(label='有優惠嗎?', text="有優惠嗎?")), SeparatorComponent(), ButtonComponent(style='link', height='sm', action=MessageAction( label='可以告訴我完整的訂購流程嗎?', text="可以告訴我完整的訂購流程嗎?")), SeparatorComponent(), ButtonComponent(style='link', height='sm', action=MessageAction(label='期待新的商品推出', text="期待新的商品推出")) ])) message = FlexSendMessage(alt_text="享玩桌遊 EnjoyBoardGame", contents=bubble) line_bot_api.reply_message(event.reply_token, message) return #else: # line_bot_api.reply_message(event.reply_token, TextSendMessage(text = '抱歉,您的訊息中未包含關鍵字,煩請再試一次喔感謝~')) # return if "專題成員有誰?" in msg or "成員" in msg: re = "成員包含:\n(組長)夏浩庭\n(技術長)黃凱廷\n(組員)劉哲文\n(組員)王泓智 " line_bot_api.reply_message(event.reply_token, TextSendMessage(text=re)) elif "訓練時數多久?" in msg or "時數" in msg or "訓練" in msg: re = "跨域Java工程師就業養成班,總訓練時數為546小時!" line_bot_api.reply_message(event.reply_token, TextSendMessage(text=re)) elif "為何選擇此主題?" in msg or "主題" in msg: re = "目前國際疫情持續延燒,且有越演越烈的趨勢,因此不論是強制隔離或自主居家檢疫,人們待在家中與家人相處的時間大幅增加,但3C產品往往佔據目光,造成\t'''明明相處時間增加,但彼此感情未見增長,衝突反而變多'''\t的情況出現。\n此時桌遊即為多人互動的好選擇!\n既可以遠離螢幕,又可充分與他人互動,故本組以桌遊作為題目進行專題發想,目標建立一個桌遊相關的網站。" line_bot_api.reply_message(event.reply_token, TextSendMessage(text=re)) elif "網站特色?" in msg or "特色" in msg: re = "網站提供完整的桌遊檢索系統供使用者搜尋以及購買、追蹤想體驗的桌遊\n亦有關於桌遊的討論區和消息專區,讓使用者觀看其他玩家的評論、遊戲體驗、開箱文,也可透過網站報名桌遊相關的課程、培訓活動。\n此外,前端頁面全為組員自行設計,未套用任何現成版面,敬請您觀賞指教!" line_bot_api.reply_message(event.reply_token, TextSendMessage(text=re)) elif "網站品項總共有多少?" in msg or "品項" in msg or "數量" in msg: re = "網站品項目前共有400多個品項可供選購。" line_bot_api.reply_message(event.reply_token, TextSendMessage(text=re)) elif "有優惠嗎?" in msg or "優惠" in msg or "折扣" in msg: re = "請至選單點選折扣券圖示即可領取並至官網使用" line_bot_api.reply_message(event.reply_token, TextSendMessage(text=re)) elif "資料來源是哪?" in msg or "資料" in msg or "來源" in msg: re = "網站主要商品資訊來源,皆來自新天鵝堡桌遊官方網站提供,真的非常感謝!" line_bot_api.reply_message(event.reply_token, TextSendMessage(text=re)) elif "可以告訴我完整的訂購流程嗎?" in msg or "訂購" in msg or "購買" in msg or "買" in msg: re = "請上我們的官方網站,將想購買的商品加入購物車中,點擊結帳按鈕,系統即會導引您完成購買流程,非常感謝您的支持!" line_bot_api.reply_message(event.reply_token, TextSendMessage(text=re)) elif "期待新的商品推出" in msg: re = "網站如果有新商品推出,皆會公布在最新消息上喔!我們也會發送通知給您~" line_bot_api.reply_message(event.reply_token, TextSendMessage(text=re)) print('Transcribe:', new_text) line_bot_api.reply_message( event.reply_token, TextSendMessage(text='抱歉,您的訊息中未包含關鍵字,煩請再試一次喔感謝~'))
def handle_message(event): text = event.message.text user_id = event.source.user_id sub = routing('^訂閱\s+', text) cancel_sub = routing('^取消訂閱\s+', text) all_county = routing('所有縣市', text) if sub: row = find_user_notify_info(user_id) bind_message = None if row is None: bind_message = FlexSendMessage( alt_text=event.message.text, contents=bind_notify_content(NOTIFY_BIND_URL)) create_user_site(user_id, sub[1]) if bind_message: line_bot_api.reply_message( event.reply_token, messages=[ TextSendMessage( text=f'訂閱 {sub[1]} 成功!', quick_reply=QuickReply(items=[ QuickReplyButton(action=MessageAction( label="所有縣市", text="所有縣市")) ])), bind_message ]) else: line_bot_api.reply_message( event.reply_token, messages=TextSendMessage( text=f'訂閱 {sub[1]} 成功!', quick_reply=QuickReply(items=[ QuickReplyButton(action=MessageAction(label="所有縣市", text="所有縣市")) ]))) elif cancel_sub: remove_user_site(user_id, cancel_sub[1]) line_bot_api.reply_message( event.reply_token, messages=TextSendMessage( text=f'取消訂閱 {cancel_sub[1]} 完成...', quick_reply=QuickReply(items=[ QuickReplyButton( action=MessageAction(label="所有縣市", text="所有縣市")) ]))) elif all_county: rows = find_counties() contents = counties_template(rows) message = FlexSendMessage( alt_text=event.message.text, contents=CarouselContainer(contents), quick_reply=QuickReply(items=[ QuickReplyButton( action=MessageAction(label="所有縣市", text="所有縣市")) ])) line_bot_api.reply_message(event.reply_token, messages=message) else: rows = find_sites_by_county(text) if not rows: line_bot_api.reply_message( event.reply_token, messages=TextSendMessage(text="請輸入「所有縣市」")) contents, flex_message = [], [] for index in range(len(rows)): if (index + 1) % 10 == 0: flex_message.append( FlexSendMessage(alt_text=text, contents=CarouselContainer(contents))) contents = [] else: contents.append( create_county_flex( line_id=user_id, county=rows[index]['county'], site=rows[index]['site_name'], status=rows[index]['status'], update_time=rows[index]['update_time'])) flex_message.append( FlexSendMessage( alt_text=text, contents=CarouselContainer(contents), quick_reply=QuickReply(items=[ QuickReplyButton( action=MessageAction(label="所有縣市", text="所有縣市")) ]))) line_bot_api.reply_message(event.reply_token, messages=flex_message) return 'OK'
def display_information(self): bubble = BubbleContainer( direction='ltr', body=BoxComponent( layout='vertical', contents=[ TextComponent(text='Account', weight='bold', size='xxl'), SeparatorComponent(), BoxComponent(layout='vertical', margin='xxl', spacing='sm', contents=[ BoxComponent( layout='vertical', contents=[ TextComponent(text='Real Name:', size='sm', color='#00A29A'), TextComponent(text='Derek', size='sm', color='#111111', margin='md'), ]) ]), BoxComponent(layout='vertical', margin='xxl', spacing='sm', contents=[ BoxComponent( layout='vertical', contents=[ TextComponent(text='Birthday:', size='sm', color='#00A29A'), TextComponent(text='1999/12/12', size='sm', color='#111111', margin='md'), ]) ]), BoxComponent(layout='vertical', margin='xxl', spacing='sm', contents=[ BoxComponent( layout='vertical', contents=[ TextComponent(text='ID Number:', size='sm', color='#00A29A'), TextComponent(text='A123456789', size='sm', color='#111111', margin='md'), ]) ]), BoxComponent(layout='vertical', margin='xxl', spacing='sm', contents=[ BoxComponent(layout='vertical', contents=[ TextComponent( text='Phone Number:', size='sm', color='#00A29A'), TextComponent( text='0922123123', size='sm', color='#111111', margin='md'), ]) ]), BoxComponent(layout='vertical', margin='xxl', spacing='sm', contents=[ BoxComponent( layout='vertical', contents=[ TextComponent(text='Address:', size='sm', color='#00A29A'), TextComponent( text='台北市大安區信義路四段 296 號 8 樓', size='sm', color='#111111', margin='md'), ]) ]), ]), ) message = FlexSendMessage(alt_text="User Information", contents=bubble) self.__message_pusher(message)
def handle_TextMessage(event): if event.message.text.startswith('#'): flag = DatabaseManager().verify_insurance(event.source.user_id, event.message.text) if flag: # line_bot_api.push_message(event.source.user_id,TextSendMessage(text='Please choose the type of Insurance Claims.')) message = TemplateSendMessage( alt_text='Confirm template', template=ConfirmTemplate( text='Please choose the type of Insurance Claims.', actions=[ PostbackAction( label='Slight', display_text='Slight', data='slight' ), PostbackAction( label='Serious', display_text='Serious', data='serious' ) ] ) ) line_bot_api.reply_message(event.reply_token, message) global record record.insurance_id = event.message.text else: line_bot_api.push_message(event.source.user_id, TextSendMessage(text="Sorry, this insurance ID doesn't exist")) elif event.message.text == 'status': temp = DatabaseManager().find_record(event.source.user_id) receipt = { "type": "bubble", "hero": { "type": "image", "url": temp.image, "size": "full", "aspectRatio": "20:13", "aspectMode": "cover", "action": { "type": "uri", "uri": "http://linecorp.com/" } }, "body": { "type": "box", "layout": "vertical", "spacing": "md", "contents": [ { "type": "text", "text": "INSURANCE CLAIMS RECORD", "wrap": True, "weight": "bold", "gravity": "center", "size": "xl" }, { "type": "box", "layout": "vertical", "margin": "lg", "spacing": "sm", "contents": [ { "type": "box", "layout": "baseline", "spacing": "sm", "contents": [ { "type": "text", "text": "ID", "color": "#aaaaaa", "size": "sm", "flex": 1 }, { "type": "text", "text": temp.insurance_id, "wrap": True, "size": "sm", "color": "#666666", "flex": 4 } ] }, { "type": "box", "layout": "baseline", "spacing": "sm", "contents": [ { "type": "text", "text": "Place", "color": "#aaaaaa", "size": "sm", "flex": 1 }, { "type": "text", "text": temp.location, "wrap": True, "color": "#666666", "size": "sm", "flex": 4 } ] }, { "type": "box", "layout": "baseline", "spacing": "sm", "contents": [ { "type": "text", "text": "Time", "color": "#aaaaaa", "size": "sm", "flex": 1 }, { "type": "text", "text": str(temp.create_time), "wrap": True, "color": "#666666", "size": "sm", "flex": 4 } ] } ] }, { "type": "box", "layout": "vertical", "margin": "xxl", "contents": [ { "type": "spacer" }, { "type": "image", "url": "https://scdn.line-apps.com/n/channel_devcenter/img/fx/linecorp_code_withborder.png", "aspectMode": "cover", "size": "xl" }, { "type": "text", "text": "You can check the insurance claims by using this code", "color": "#aaaaaa", "wrap": True, "margin": "xxl", "size": "xs" } ] } ] } } flex_message = FlexSendMessage( alt_text='hello', contents=receipt ) line_bot_api.reply_message( event.reply_token, flex_message ) elif event.message.text == 'compensation': profile = line_bot_api.get_profile(event.source.user_id) msg = TemplateSendMessage( alt_text='Buttons template', template=ButtonsTemplate( thumbnail_image_url=profile.picture_url, title='Compensation', text='Please choose compensation way.', actions=[ PostbackAction( label='check', display_text='check', data='check' ), PostbackAction( label='e-check', display_text='E-check', data='e-check' ), PostbackAction( label='bank transfer', display_text='Bank Transfer', data='bank transfer' ) ] ) ) line_bot_api.reply_message(event.reply_token, msg) else: profile = line_bot_api.get_profile(event.source.user_id) greeting = 'Hi, ' greeting = greeting + profile.display_name line_bot_api.push_message(event.source.user_id, TextSendMessage(text=greeting)) line_bot_api.push_message(event.source.user_id, TextSendMessage(text='Welcome to Insurance Claims Chatbot!')) user_record = DatabaseManager().find_user(event.source.user_id) if not user_record: user = User() user.id = event.source.user_id user.avatar = profile.picture_url user.name = profile.display_name DatabaseManager().save_user(user) create_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S") record = Record() record.user_id = event.source.user_id record.create_time = create_time msg = TemplateSendMessage( alt_text='Buttons template', template=ButtonsTemplate( thumbnail_image_url=profile.picture_url, title='Terms of Service', text='Please read the Terms of Service first.', actions=[ PostbackAction( label='Terms of Service', display_text='Terms of Service', data='terms' ), PostbackAction( label='Agree', display_text='Agree', data='agree' ) ] ) ) line_bot_api.reply_message( event.reply_token, msg )
def send_line_api(event, contents, alt_text="hello"): message = FlexSendMessage(alt_text=alt_text, contents=contents) line_bot_api.reply_message(event.reply_token, message)
def handle_message(event): text = event.message.text #simplify for receove message sender = event.source.user_id #get user_id gid = event.source.sender_id #get group_id #=====[ LEAVE GROUP OR ROOM ]========== if text == 'bye': if isinstance(event.source, SourceGroup): line_bot_api.reply_message( event.reply_token, TextSendMessage(text='Leaving group')) line_bot_api.leave_group(event.source.group_id) elif isinstance(event.source, SourceRoom): line_bot_api.reply_message( event.reply_token, TextSendMessage(text='Leaving group')) line_bot_api.leave_room(event.source.room_id) else: line_bot_api.reply_message( event.reply_token, TextSendMessage(text="Bot can't leave from 1:1 chat")) #=====[ TEMPLATE MESSAGE ]============= elif text == '/template': buttons_template = TemplateSendMessage( alt_text='template', template=ButtonsTemplate( title='[ TEMPLATE MSG ]', text= 'Tap the Button', actions=[ MessageTemplateAction( label='Culum 1', text='/aditmadzs' ), MessageTemplateAction( label='CULUM 2', text='/aditmadzs' ), MessageTemplateAction( label='CULUM 3', text='/aditmadzs' ) ] ) ) line_bot_api.reply_message(event.reply_token, buttons_template) #=====[ CAROUSEL MESSAGE ]========== elif text == '/carousel': message = TemplateSendMessage( alt_text='OTHER MENU', template=CarouselTemplate( columns=[ CarouselColumn( title='ADD ME', text='Contact Aditmadzs', actions=[ URITemplateAction( label='>TAP HERE<', uri='https://line.me/ti/p/~adit_cmct' ) ] ), CarouselColumn( title='Instagram', text='FIND ME ON INSTAGRAM', actions=[ URITemplateAction( label='>TAP HERE!<', uri='http://line.me/ti/p/~adit_cmct' ) ] ) ] ) ) line_bot_api.reply_message(event.reply_token, message) #=====[ FLEX MESSAGE ]========== elif text == 'flex': bubble = BubbleContainer( direction='ltr', hero=ImageComponent( url='https://lh5.googleusercontent.com/VoOmR6tVRwKEow0HySsJ_UdrQrqrpwUwSzQnGa0yBeqSex-4Osar2w-JohT6yPu4Vl4qchND78aU2c5a5Bhl=w1366-h641-rw', size='full', aspect_ratio='20:13', aspect_mode='cover', action=URIAction(uri='http://line.me/ti/p/~adit_cmct', label='label') ), body=BoxComponent( layout='vertical', contents=[ # title TextComponent(text='Aditmadzs', weight='bold', size='xl'), # review BoxComponent( layout='baseline', margin='md', contents=[ IconComponent(size='sm', url='https://example.com/gold_star.png'), IconComponent(size='sm', url='https://example.com/grey_star.png'), IconComponent(size='sm', url='https://example.com/gold_star.png'), IconComponent(size='sm', url='https://example.com/gold_star.png'), IconComponent(size='sm', url='https://example.com/grey_star.png'), TextComponent(text='4.0', size='sm', color='#999999', margin='md', flex=0) ] ), # info BoxComponent( layout='vertical', margin='lg', spacing='sm', contents=[ BoxComponent( layout='baseline', spacing='sm', contents=[ TextComponent( text='Place', color='#aaaaaa', size='sm', flex=1 ), TextComponent( text='Tangerang, Indonesia', wrap=True, color='#666666', size='sm', flex=5 ) ], ), BoxComponent( layout='baseline', spacing='sm', contents=[ TextComponent( text='Time', color='#aaaaaa', size='sm', flex=1 ), TextComponent( text="10:00 - 23:00", wrap=True, color='#666666', size='sm', flex=5, ), ], ), ], ) ], ), footer=BoxComponent( layout='vertical', spacing='sm', contents=[ # separator SeparatorComponent(), # websiteAction ButtonComponent( style='link', height='sm', action=URIAction(label='Aditmadzs', uri="https://line.me/ti/p/~adit_cmct") ) ] ), ) message = FlexSendMessage(alt_text="hello", contents=bubble) line_bot_api.reply_message( event.reply_token, message )
def handle_content_message(event): if isinstance(event.message, ImageMessage): ext = 'jpg' elif isinstance(event.message, VideoMessage): ext = 'mp4' elif isinstance(event.message, AudioMessage): ext = 'm4a' else: return #save jpg message_content = line_bot_api.get_message_content(event.message.id) #save file.jpg with tempfile.NamedTemporaryFile(dir=static_tmp_path, prefix=ext + '-', delete=False) as tf: for chunk in message_content.iter_content(): tf.write(chunk) tempfile_path = tf.name dist_path = tempfile_path + '.' + ext dist_name = os.path.basename(dist_path) os.rename(tempfile_path, dist_path) message_content = os.path.join('static', 'tmp', dist_name) with open(message_content, 'rb') as ff: message_content = ff.read() print get_prediction(message_content, 'v3-219812', 'ICN7521245635834906') abc = get_prediction(message_content, 'v3-219812', 'ICN7521245635834906') a1 = str(abc) result = re.search('(?<=score: ).*(?=\n)', a1).group() result2 = re.search('(?<=display_name: ").*(?="\n)', a1).group() b01 = float(result) a1 = str(abc) a2 = a1[30:50] a3 = a1[55:79] print type(abc) print result if (result2 == "tamaki" and b01 >= 0.8): bubble = BubbleContainer( direction='ltr', hero=ImageComponent(url='https://imgur.com/Vsi1nLt.jpg', size='full', aspect_ratio='20:13', aspect_mode='cover', action=URIAction( uri='https://imgur.com/Vsi1nLt', label='label')), body=BoxComponent( layout='vertical', contents=[ # title TextComponent(text='926四葉環', weight='bold', size='xl'), # review # info BoxComponent( layout='vertical', margin='lg', spacing='sm', contents=[ BoxComponent( layout='baseline', spacing='sm', contents=[ TextComponent(text='相近', color='#aaaaaa', size='sm', flex=1), TextComponent(text=result2, wrap=True, color='#666666', size='sm', flex=5) ], ), BoxComponent( layout='baseline', spacing='sm', contents=[ TextComponent(text='數值', color='#aaaaaa', size='sm', flex=1), TextComponent( text=result, wrap=True, color='#666666', size='sm', flex=5, ), ], ), ], ) ], ), footer=BoxComponent( layout='vertical', spacing='sm', contents=[ # callAction, separator, websiteAction SpacerComponent(size='sm'), # callAction ButtonComponent( style='link', height='sm', action=URIAction( label='好微笑看看', uri= 'https://www.goodsmile.info/zh/product/7240/%E9%BB%8F%E5%9C%9F%E4%BA%BA+%E5%9B%9B%E8%91%89%E7%92%B0.html' ), ), # separator ]), ) message = FlexSendMessage(alt_text="感謝您的使用以下為你分析", contents=bubble) line_bot_api.reply_message(event.reply_token, message) elif (result2 == "sogo" and b01 >= 0.8): bubble = BubbleContainer( direction='ltr', hero=ImageComponent(url='https://imgur.com/oP3mQNC.jpg', size='full', aspect_ratio='20:13', aspect_mode='cover', action=URIAction( uri='https://imgur.com/oP3mQNC', label='label')), body=BoxComponent( layout='vertical', contents=[ # title TextComponent(text='905逢板壯五', weight='bold', size='xl'), # review # info BoxComponent( layout='vertical', margin='lg', spacing='sm', contents=[ BoxComponent( layout='baseline', spacing='sm', contents=[ TextComponent(text='相近', color='#aaaaaa', size='sm', flex=1), TextComponent(text=result2, wrap=True, color='#666666', size='sm', flex=5) ], ), BoxComponent( layout='baseline', spacing='sm', contents=[ TextComponent(text='數值', color='#aaaaaa', size='sm', flex=1), TextComponent( text=result, wrap=True, color='#666666', size='sm', flex=5, ), ], ), ], ) ], ), footer=BoxComponent( layout='vertical', spacing='sm', contents=[ # callAction, separator, websiteAction SpacerComponent(size='sm'), # callAction ButtonComponent( style='link', height='sm', action=URIAction( label='好微笑看看', uri= 'https://www.goodsmile.info/zh/product/7175/%E9%BB%8F%E5%9C%9F%E4%BA%BA+%E9%80%A2%E5%9D%82%E5%A3%AF%E4%BA%94.html' ), ), # separator ]), ) message = FlexSendMessage(alt_text="感謝您的使用以下為你分析", contents=bubble) line_bot_api.reply_message(event.reply_token, message) elif (result2 == "Kirby"): bubble = BubbleContainer( direction='ltr', hero=ImageComponent(url='https://imgur.com/ec1wSXs.jpg', size='full', aspect_ratio='20:13', aspect_mode='cover', action=URIAction( uri='https://imgur.com/ec1wSXs', label='label')), body=BoxComponent( layout='vertical', contents=[ # title TextComponent(text='544星之卡比', weight='bold', size='xl'), # review # info BoxComponent( layout='vertical', margin='lg', spacing='sm', contents=[ BoxComponent( layout='baseline', spacing='sm', contents=[ TextComponent(text='相近', color='#aaaaaa', size='sm', flex=1), TextComponent(text=result2, wrap=True, color='#666666', size='sm', flex=5) ], ), BoxComponent( layout='baseline', spacing='sm', contents=[ TextComponent(text='數值', color='#aaaaaa', size='sm', flex=1), TextComponent( text=result, wrap=True, color='#666666', size='sm', flex=5, ), ], ), ], ) ], ), footer=BoxComponent( layout='vertical', spacing='sm', contents=[ # callAction, separator, websiteAction SpacerComponent(size='sm'), # callAction ButtonComponent( style='link', height='sm', action=URIAction( label='好微笑看看', uri= 'https://www.goodsmile.info/zh/product/5207/%E9%BB%8F%E5%9C%9F%E4%BA%BA+%E5%8D%A1%E6%AF%94.html' ), ), # separator ]), ) message = FlexSendMessage(alt_text="感謝您的使用以下為你分析", contents=bubble) line_bot_api.reply_message(event.reply_token, message) elif (result2 == "kirbyPirate" and b01 >= 0.8): bubble = BubbleContainer( direction='ltr', hero=ImageComponent(url='https://imgur.com/Q032z3A.jpg', size='full', aspect_ratio='20:13', aspect_mode='cover', action=URIAction( uri='https://imgur.com/Q032z3A', label='label')), body=BoxComponent( layout='vertical', contents=[ # title TextComponent(text='此款有盜版嫌疑!!', weight='bold', size='xl'), # review # info BoxComponent( layout='vertical', margin='lg', spacing='sm', contents=[ BoxComponent( layout='baseline', spacing='sm', contents=[ TextComponent(text='相近', color='#aaaaaa', size='sm', flex=1), TextComponent(text=result2, wrap=True, color='#666666', size='sm', flex=5) ], ), BoxComponent( layout='baseline', spacing='sm', contents=[ TextComponent(text='數值', color='#aaaaaa', size='sm', flex=1), TextComponent( text=result, wrap=True, color='#666666', size='sm', flex=5, ), ], ), ], ) ], ), footer=BoxComponent( layout='vertical', spacing='sm', contents=[ # callAction, separator, websiteAction SpacerComponent(size='sm'), # callAction ButtonComponent( style='link', height='sm', action=URIAction( label='好微笑看看', uri= 'https://www.goodsmile.info/zh/product/7175/%E9%BB%8F%E5%9C%9F%E4%BA%BA+%E9%80%A2%E5%9D%82%E5%A3%AF%E4%BA%94.html' ), ), # separator ]), ) message = FlexSendMessage(alt_text="感謝您的使用以下為你分析", contents=bubble) line_bot_api.reply_message(event.reply_token, message) else: line_bot_api.reply_message(event.reply_token, [TextSendMessage(text='not find')])
def send_date_picker(reply_token, datepicker): line_bot_api = LineBotApi(channel_access_token) line_bot_api.reply_message(reply_token, FlexSendMessage("date_picker", datepicker)) return "OK"
def sendFlex(event, backdata, user_id): #彈性配置 try: if not (teamUp.objects.filter(bid=user_id).exists()): #沒有訂房記錄 bubble = BubbleContainer( direction='ltr', #項目由左向右排列 header=BoxComponent( #標題 layout='vertical', contents=[ TextComponent(text='可以跑就是Runn-able', weight='bold', size='xl'), ] ), hero=ImageComponent( #主圖片 url='https://upload.cc/i1/2020/02/23/CrfWMt.png', size='full', aspect_ratio='792:555', #長寬比例 aspect_mode='cover', ), body=BoxComponent( #主要內容 layout='vertical', contents=[ TextComponent(text='按讚、留言,加meToo', size='md'), BoxComponent( layout='baseline', #水平排列 margin='md', contents=[ TextComponent(text='按', size='md', color='#999999',flex=0), IconComponent(size='lg',\ url='https://upload.cc/i1/2020/04/19/NLBGdU.png'), TextComponent(text='、 ', size='md', color='#999999',flex=0), IconComponent(size='md',\ url='https://upload.cc/i1/2020/04/19/D7mc9a.png'), TextComponent(text=' ,加me ', size='md', color='#999999', flex=0), IconComponent(size='lg',\ url='https://upload.cc/i1/2020/04/19/DlaV4C.png'), ] ), BoxComponent( layout='vertical', margin='lg', contents=[ BoxComponent( layout='baseline', contents=[ TextComponent(text='營業地址:', color='#aaaaaa', size='sm', flex=2), TextComponent(text='320桃園市中壢區中大路300號', color='#666666', size='sm', flex=5) ], ), SeparatorComponent(color='#0000FF'), BoxComponent( layout='baseline', contents=[ TextComponent(text='營業時間:', color='#aaaaaa', size='sm', flex=2), TextComponent(text="08:30 - 22:30", color='#666666', size='sm', flex=5), ], ), ], ), BoxComponent( layout='horizontal', margin='xxl', contents=[ ButtonComponent( style='link', height='sm', action=URIAction(label='點我查看商城訂單目前狀態',\ uri="https://liff.line.me/1653880251-yZpK05QY"), ) ] ), BoxComponent( layout='horizontal', margin='xxl', contents=[ ButtonComponent( style='secondary', height='sm', action=URIAction(label='電話', uri='tel:034257387'), ), ButtonComponent( style='primary', height='sm', action=URIAction(label='揪團',\ uri="line://app/1653880251-4b2aDNMl") ) ] ) ], ), footer=BoxComponent( #底部版權宣告 layout='vertical', contents=[ TextComponent(text='Copyright@III DA106 Group5', color='#888888', size='sm', align='center'), ] ), ) message = FlexSendMessage(alt_text="準備揪團", contents=bubble) else: #已有訂房記錄 message = TextSendMessage(text='您目前已有揪團,不能再揪團。') line_bot_api.reply_message(event.reply_token, message) except: line_bot_api.reply_message(event.reply_token, TextSendMessage(text='sendFlex發生錯誤!'))
# In[ ]: #將bubble類型的json 進行轉換變成 Python可理解之類型物件,並將該物件封裝進 Flex Message中 #引用套件 from linebot.models import ( FlexSendMessage, BubbleContainer, ) import json #INTRO樣板封裝 bubbleContainer_intro = BubbleContainer.new_from_json_dict( json.loads(flexBubbleContainerJsonString_INTRO)) flexBubbleSendMessage_INTRO = FlexSendMessage(alt_text="yourname的個人介紹", contents=bubbleContainer_intro) #WORK樣板封裝 bubbleContainer_work = BubbleContainer.new_from_json_dict( json.loads(flexBubbleContainerJsonString_WORK)) flexBubbleSendMessage_WORK = FlexSendMessage(alt_text="yourname的工作經歷", contents=bubbleContainer_work) #SKILLS樣板封裝 bubbleContainer_skills = BubbleContainer.new_from_json_dict( json.loads(flexBubbleContainerJsonString_SKILLS)) flexBubbleSendMessage_SKILLS = FlexSendMessage(alt_text="yourname的專長", contents=bubbleContainer_skills) # In[ ]:
def history_flexMessage(userid,date): uri = host + "/nutritionweb/history/" + userid+"/look/0" results = userFood.objects.filter(userId=userid,date=date) length=len(results) def item_loop(length): item_list=list() iniitem = BoxComponent( background_color="#EA8244", layout='baseline', contents=[ TextComponent( type="text", text="您於今日還沒有紀錄喔!!!!", color="#FFFFFF", size="xl", wrap=True, align="center", ), ] ) if length == 0: item_list.append(iniitem) elif length>10: item = BoxComponent( background_color="#EA8244", layout='baseline', contents=[ TextComponent( type="text", text="您紀錄太多筆無法喔,可以點擊下方按鈕查看紀錄", color="#FFFFFF", size="xl", wrap=True, align="center", ), ] ) else: for result in results: item = BoxComponent( background_color="#EA8244", layout='baseline', contents=[ TextComponent( type="text", text=str(result.food_name), color="#FFFFFF", size="xs", wrap=True, align="center", ), TextComponent( type="text", text=str(result.food_quantity), color="#FFFFFF", size="xs", wrap=True, align="center", ), TextComponent( type="text", text=str(result.food_power), color="#FFFFFF", size="xs", wrap=True, align="center", ), TextComponent( type="text", text=str(result.food_protein), color="#FFFFFF", size="xs", wrap=True, align="center", ), TextComponent( type="text", text=str(result.food_carbohydrate), color="#FFFFFF", size="xs", wrap=True, align="center", ), TextComponent( type="text", text=str(result.food_fat), color="#FFFFFF", size="xs", wrap=True, align="center", ), ] ) item_list.append(item) return item_list temp1 = item_loop(length) i=0 temp=[] while i < 11: if i<len(temp1): temp.append(temp1[i]) else: temp.append(BoxComponent(background_color="#EA8244",layout='baseline',contents=[FillerComponent(flex=0)])) i+=1 container = BubbleContainer( size='giga', body=BoxComponent( layout='vertical', background_color="#2e2e2e", size='sm', contents=[ BoxComponent( layout='vertical', background_color="#2e2e2e", contents=[ TextComponent( text='今日飲食紀錄🍽', weight="bold", size="xl", style="normal", decoration="none", gravity="center", align="center", color="#ffffff", offset_bottom="1.25%", ), BoxComponent( layout='baseline', background_color="#EA8244", contents=[ TextComponent( type="text", text="食物", size="sm", align="center", weight="bold", ), TextComponent( type='text', text="數量", wrap=True, size="sm", align="center", weight="bold", ), TextComponent( type='text', text="熱量", wrap=True, size="sm", align="center", weight="bold", ), TextComponent( type='text', text="蛋白質", wrap=True, size="sm", align="center", weight="bold", ), TextComponent( type='text', text="碳水", wrap=True, size="sm", align="center", weight="bold", ), TextComponent( type='text', text="脂肪", wrap=True, size="sm", align="center", weight="bold", ) ] ), temp[0], temp[1], temp[2], temp[3], temp[4], temp[5], temp[6], temp[7], temp[8], temp[9], temp[10], ] ), ], ), footer=BoxComponent( background_color="#2e2e2e", layout='vertical', spacing='sm', contents=[ ButtonComponent( style="primary", height="sm", action=URIAction(label="點我查看更多紀錄👀", uri=uri), color="#EA8244", gravity="center", ), SpacerComponent(size='sm'), ], flex=0, ) ) return FlexSendMessage(alt_text="今日飲食紀錄", contents=container)