def test_agent_handle_text_message_group_source(): agent = create_mock_agent() group_source = SourceGroup(group_id="G20001", user_id="U10001") text_message = TextMessage(text="!new myOrder") mock_event = MessageEvent(timestamp=123, source=group_source, reply_token='123', message=text_message) assert agent.handle_text_message(mock_event) != None
def handle_join(event): # print(event.joined.members) user_id = event.joined.members[0].user_id group_id = event.source.group_id group_profile = line_bot_api.get_group_member_profile(group_id, user_id) name = group_profile.display_name reply_msg = name + ",你就是我新的身體嗎?" line_bot_api.reply_message(event.reply_token, TextMessage(text = reply_msg))
def handle_text_message(event): message = str.lower(event.message.text).strip() message = message.split(" ") if message[0] == '@hn': if message[1] == 'best' or message[1] == 'new' or message[1] == 'job': keyword = message[1] line_bot_api.reply_message(event.reply_token, getStories(event, keyword)) elif message[1] == 'menu': line_bot_api.reply_message(event.reply_token, [ getMenu(), TextSendMessage(text="Untuk berhenti, ketik '@hn bye'.") ]) elif message[1] == 'bye': if event.source.type == 'group': line_bot_api.reply_message( event.reply_token, TextMessage(text='Yaah... aku diusir \uDBC0\uDC92')) line_bot_api.leave_group(event.source.group_id) elif event.source.type == 'room': line_bot_api.reply_message( event.reply_token, TextMessage(text='Yaah... aku diusir \uDBC0\uDC92')) line_bot_api.leave_group(event.source.room_id) else: line_bot_api.reply_message( event.reply_token, TextMessage( text='Sorry, aku gabisa keluar dari 1:1 chat.')) else: line_bot_api.reply_message( event.reply_token, TextSendMessage(text="Ketik '@hn menu' untuk melihat menu. ")) else: if event.source.type == 'user': line_bot_api.reply_message( event.reply_token, TextSendMessage(text="Ketik '@hn menu' untuk melihat menu. "))
def __starting_add_store(self): # 限定管理員開啟功能 if Group.objects.filter(group_id=self.group_id, admin__user_id=self.user_id).exists(): redis.set(f"{self.group_id}:add", True, 60) # 60秒存活 self.line_bot_api.reply_message( self.event.reply_token, TextMessage(text="店家加入功能已開啟一分鐘,可以開始搜尋店家")) else: self.__do_nothing()
def send_ask_venue(self, reply_token, signal): if "guest" in signal: text_message = TextMessage(text='請問你是要問哪個館呢?') template_message = self._generate_venue(signal=signal) self.line_bot_api.reply_message( reply_token, messages=[text_message, template_message]) elif "manager" in signal: text_message = TextMessage(text='OKOK!那想再請問你是哪個館區的管理人員呢?') template_message = self._generate_venue(signal=signal) self.line_bot_api.reply_message( reply_token, messages=[text_message, template_message])
def AIOTproject(reply_token): message1 = TextMessage(text="競賽成果:\n"+"我們將比賽提供的開放資料中之ICU病房資料做SQL資料萃取與數據分析技術,研究加護病房病患初始 Lactate 值正常之死亡率現象\n"+"下圖為我們的實作模型,歡迎參考!") message2 = ImageSendMessage( original_content_url='https://imgur.com/tOMkxrW.jpg', preview_image_url='https://imgur.com/tOMkxrW.jpg') message3 = ImageSendMessage( original_content_url='https://imgur.com/BgXnYcA.jpg', preview_image_url='https://imgur.com/BgXnYcA.jpg') line_bot_api.reply_message(reply_token, [message1,message2,message3])
def index(): with psycopg2.connect(DATABASE_URL) as conn: with conn.cursor() as cur: cur.execute("SELECT user_id FROM car_stock.line_user_id") userIdRows = cur.fetchall() messages = TextMessage(text="Hello world!!") for userIdRow in userIdRows: line_bot_api.push_message(userIdRow[0], messages) return "hello world"
def receive_command(self, event): logger.debug(f"receive event: {event}") self.event = event self.group_id = event.source.group_id if not self.group_id: self.line_bot_api.reply_message( self.event.reply_token, TextMessage(text="把機器人加入群組才能發揮他的功能歐")) self.user_id = event.source.user_id self.text = self.event.message.text self.command_dict.get(self.text, self.__second_command)()
def __save_store(self): reply = [] # 兩個選項之外的回應就繼續查詢店家 if self.text != "Yes" and self.text != "Again": self.__search_store() elif self.text == "Yes": store_data = redis.get(f"{self.group_id}:save_store") try: with transaction.atomic(): # 新增或者獲得店家資訊 store, created = Store.objects.get_or_create( store_name=store_data["name"], store_address=store_data["formatted_address"], store_phone=store_data.get("formatted_phone_number"), google_map_url=store_data["url"], ) # 如果有店家照片再存 if store_data.get("photos"): store.google_photo_url = self.google_map_api.place_photo( store_data["photos"][0]["photo_reference"]) store.save() # 為店家綁定群組 group = Group.objects.get(group_id=self.group_id) store.group.add(group) # 新增商家種類 if created: for type in store_data["types"]: store_type, _ = StoreType.objects.get_or_create( type_name=type) store.store_type.add(store_type) logger.debug("商家種類新增") except: logging.exception( f"{store_data['name']} saving to database failed!") else: reply.append(TextMessage(text="資料成功加進去囉!")) elif self.text == "Again": reply.append(TextMessage(text="店家查詢繼續開放一分鐘")) # 如果第一個if條件有達到,這邊不會執行 redis.set(f"{self.group_id}:add", True, 60) # 重新開放店家搜尋 redis.delete(f"{self.group_id}:save_store") # 刪除店家資料暫存 self.line_bot_api.reply_message(self.event.reply_token, reply)
def handle_join(event): group_id = event.source.group_id response = get_group_summary(group_id) print('group_id = ', group_id) group_name = response['groupName'] create_line_group(group_name, group_id) reply_msg = '真拿你們沒辦法 只有你們太不可靠了 我也加入' + group_name + '吧!要好好感謝我喔☆' line_bot_api.reply_message(event.reply_token, TextMessage(text = reply_msg))
def default(reply_token): message1 = TextMessage(text="如果你想知道更多關於德馨的秘密可以輸入關鍵字或點選圖文選單喔!!"+ "\uDBC0\uDC8D") sticker1 = StickerSendMessage( package_id='11538', sticker_id='51626496') line_bot_api.reply_message( reply_token, [message1, sticker1])
def handle_follow(event): user_id = event.source.user_id profile = line_bot_api.get_profile(user_id) name = profile.display_name create_line_user(name, '', user_id) reply_msg = name + '你啊,不要若無其事地向我搭話啦!畢竟又不是朋友,什麼都不是啊!' line_bot_api.reply_message(event.reply_token, TextMessage(text=reply_msg)) print('新加入者: %s , user_id: %s' % (name, user_id))
def show_material_topic(event, conn, postback): # get all subject by class_id query_select_subject = 'SELECT * FROM subject WHERE id = %s' conn.query(query_select_subject, (postback['subject_id'], )) row_subject = conn.cursor.fetchone() # get all topic by subject_id query_select_topic = 'SELECT * FROM topic WHERE subject_id = %s' conn.query(query_select_topic, (postback['subject_id'], )) rows_topic = conn.cursor.fetchall() if len(rows_topic) == 0: # topic is empty line_bot_api.reply_message(event.reply_token, [TextMessage(text=constant.TOPIC_EMPTY)]) else: # topic exist contents = [] for row in rows_topic: contents.append( BubbleContainer( direction='ltr', body=BoxComponent( layout='vertical', contents=[ TextComponent(text=str(row['name']), margin='md', size='xl', align='center', gravity='center', weight='bold'), ButtonComponent(action=PostbackAction( label='Belajar', text='Belajar', data='action=material_learn&subject_id=' + str(row_subject['id']) + '&topic_id=' + str(row['id']))), ButtonComponent(action=PostbackAction( label='Latihan Soal', text='Latihan Soal', data='action=material_quiz&subject_id=' + str(row_subject['id']) + '&topic_id=' + str(row['id']))), ButtonComponent(action=PostbackAction( label='Diskusi', text='Diskusi', data='action=material_discussion&subject_id=' + str(row_subject['id']) + '&topic_id=' + str(row['id']))) ]))) flex_message = FlexSendMessage( alt_text='Carousel Topik', contents=CarouselContainer(contents=contents)) return flex_message
def handle_message(evt): if evt.source.user_id not in post_user_state: post_user_state[evt.source.user_id] = {"state": None, "bit_state": 16} user = post_user_state[evt.source.user_id] try: response_text = get_response_text(evt, user) line_bot_api.reply_message(evt.reply_token, TextMessage(text=response_text)) except: import traceback traceback.print_exc()
def handle_postback(event): text = event.postback.data uid = extract_uid(event.source) line_bot_api = lineClient.api user_state = StateManager.fetch(uid) s = text.split(" ") if REQUEST_STATE.get(s[0]): try: updated_state, output = handle_action(text, text, user_state) StateManager.update(uid, updated_state) if type(output[0]) == TemplateSendMessage: line_bot_api.reply_message(event.reply_token, output) else: line_bot_api.reply_message(event.reply_token, TextMessage(text=output)) except: line_bot_api.reply_message( event.reply_token, TextMessage(text="ketik 'si bawel tolong' kak"))
def handleNonMessageEvent(event): if event.source.user_id: profile = line_bot_api.get_profile(event.source.user_id) msg_list = [ TextSendMessage(text="Hi!" + profile.display_name + "\n歡迎加入破冰機器人-小明同學官方帳號(ゝ∀・)") ] msg_list.append( TextSendMessage( text="輸入「小明小明,關鍵字」即可搜尋關鍵字笑話\n輸入「小明功能」可查看聊天小明同學的操作說明")) msg_list.append(TextSendMessage(text="小明同學也會不定時的回覆笑話參與話題喔٩(๑•̀ω•́๑)۶")) else: msg_list = [] if event.type == 'join': msg_list = [TextSendMessage(text="Hi!\n感謝您邀請小明(,,・ω・,,)")] msg_list.append( TextSendMessage( text="輸入「小明小明,關鍵字」即可搜尋關鍵字笑話\n輸入「小明功能」可查看聊天小明同學的操作說明")) msg_list.append(TextSendMessage(text="小明同學也會不定時的回覆笑話參與話題喔٩(๑•̀ω•́๑)۶")) elif event.type == 'leave': if isinstance(event.source, SourceGroup): line_bot_api.reply_message(event.reply_token, TextMessage(text='我離開了。再見!')) line_bot_api.leave_group(event.source.group_id) elif isinstance(event.source, SourceRoom): line_bot_api.reply_message(event.reply_token, TextMessage(text='我離開了。再見!')) line_bot_api.leave_room(event.source.room_id) else: line_bot_api.reply_message( event.reply_token, TextMessage(text="Bot can't leave from 1:1 chat")) else: #msg_list.append(TextSendMessage(text=event.type)) pass line_bot_api.reply_message( # reply to Line and then to the user event.reply_token, msg_list)
def oracle(text): sqlOracle = "SELECT * FROM oracle ORDER BY RAND() LIMIT 1" cursorOracle = db.cursor() cursorOracle.execute(sqlOracle) resOracle = cursorOracle.fetchone() # cursorOracle.close() textS = text.split(" ") oracleText = "{textS} 中籤\n-------\n{num}\n{content}\n{oracle_explain}".format( textS=textS[0], num=resOracle[1], content=resOracle[2], oracle_explain=resOracle[3]) return TextMessage(text=oracleText)
def searchSeeSay(text): sqlSearchSeeSay = "SELECT * FROM seesay where `see`='{text}';".format( text=text) cursorSearchSeeSay = db.cursor() cursorSearchSeeSay.execute(sqlSearchSeeSay) res = cursorSearchSeeSay.fetchone() # cursorSearchSeeSay.close() if res: sayJ = json.loads(res[2]) return TextMessage(text=sayJ[random.randint(0, len(sayJ) - 1)]) else: return None
def postback(event): data = json.loads(event.postback.data) # 群組管理員可將店家與指定群組解除綁定 if (data.get("event") == "delete_store" and Group.objects.filter( group_id=data.get("group_id"), admin__user_id=event.source.user_id).exists()): try: with transaction.atomic(): group = Group.objects.get(group_id=data["group_id"]) store = Store.objects.get(id=data["store_id"]) store.group.remove(group) except: reply_text = f"系統發生錯誤,無法刪除『{data['store_name']}』" else: reply_text = f"已將『{data['store_name']}』從美食清單中移除" finally: line_bot_api.reply_message(event.reply_token, TextMessage(text=reply_text)) else: line_bot_api.reply_message(event.reply_token, TextMessage(text="只有群組管理員才可執行刪除!"))
def message_text(event): with psycopg2.connect(database_url) as conn: with conn.cursor() as cur: if event.type == "message": profile = line_bot_api.get_profile(event.source.user_id) messages = TextMessage(text="メッセージイベントを取得しました。\nYour ID:" + profile.user_id) insertUserId(conn, cur, profile) elif event.type == "follow": messages = TextMessage(text="フォローイベントを取得しました。\nYour ID:" + profile.user_id) insertUserId(conn, cur, profile) status_msg = profile.status_message if status_msg != "None": status_msg = "なし" line_bot_api.reply_message(event.reply_token, messages=messages)
def handle_join(event): try: newcoming_text = "謝謝邀請我這個機器來至此群組!!我會盡力為大家服務的~(group_id = {})".format( event.source.group_id) print(newcoming_text) except Exception as e: print(e) newcoming_text = "謝謝邀請我這個機器來至此群組!!我會盡力為大家服務的~(error)" pass line_bot_api.reply_message(event.reply_token, TextMessage(text=newcoming_text)) print("JoinEvent =", JoinEvent)
def message_text(event): keyWordWeather = u"天氣" #If user don't want to know weather, echo what user input instead.And return t if (keyWordWeather not in event.message.text): line_bot_api.reply_message(event.reply_token, TextMessage(text=event.message.text)) return #find the location users ask in the string of user input keyWordLocation = u"市縣" if event.message.text.find(keyWordLocation[0]) > 0: locationIndex = event.message.text.find(keyWordLocation[0]) else: locationIndex = event.message.text.find(keyWordLocation[1]) locationIndexStart = locationIndex - 2 locationIndexEnd = locationIndex + 1 location = event.message.text[locationIndexStart:locationIndexEnd] url = "http://opendata.cwb.gov.tw/api/v1/rest/datastore/F-C0032-001?locationName=" + location + "&elementName=Wx" header = {"Authorization": os.getenv('APIKEY', None)} origin = requests.get(url, headers=header) body = json.loads(origin.content) #Determind which prediction of time interval for the weather of the location. try: timeIntervalPredict = body['records']['location'][0]['weatherElement'][ 0]['time'] for possibleTime in timeIntervalPredict: #type of time info: string -> datetime timeInterval = datetime.strptime(possibleTime['startTime'], "%Y-%m-%d %H:%M:%S") if (datetime > timeInterval): discription = possibleTime['parameter']['paramterName'] reply = location + u"的天氣為" + discription line_bot_api.reply_message(event.reply_token, TextSendMessage(text=reply)) except: line_bot_api.reply_message( event.reply_token, TextMessage(text="yo~台灣沒這個地方~\n或是請愛用繁體「臺」ex「臺南市」"))
def save_group_data(self, event): # 獲得群組資料 group_id = event.source.group_id group_summary = self.line_bot_api.get_group_summary(group_id) group_name = group_summary.group_name # 將群組資料加入資料庫 try: Group.objects.get_or_create(group_id=group_id, group_name=group_name) except: logger.exception(f"{group_name} database create fail!") else: self.line_bot_api.reply_message(event.reply_token, TextMessage(text="群組資料成功存進資料庫囉!"))
def cmd_克魯註冊(self,event:MessageEvent,cmdline:str): try: user_token = cmdline logging.info(f"receive cq register token {user_token}") line_id = query_line_id(user_token) if line_id != "NULL": self.line_bot_api.reply_message( event.reply_token, TextMessage(text="だが断る") ) return cq_register_user(user_token, event.source.user_id) self.line_bot_api.reply_message( event.reply_token, TextMessage(text="done ~~ please check your client ~~ OuO") ) except Exception as e: self.line_bot_api.reply_message( event.reply_token, TextMessage(text="だが 断る") ) raise e
def handle_text_message(event): text = event.message.text if event.source.type == 'user': if event.source.user_id != admin_id: line_bot_api.reply_message( event.reply_token, TextSendMessage(text="Sorry, this is private bot.")) else: searchText = re.search(r'\/([A-Za-z].*) ([A-Za-z0-9].*)', text, re.I) command = str(searchText.group(1)) if command == 'add': groupId = str(searchText.group(2)) content = add_groupwhitelist(groupId) line_bot_api.reply_message(event.reply_token, TextMessage(text=content)) else: searchText = re.search(r'\/([A-Za-z].*) ([A-Za-z0-9].*)', text, re.I) command = str(searchText.group(1)) if command == 'bye': if isinstance(event.source, SourceGroup): line_bot_api.reply_message(event.reply_token, TextMessage(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, TextMessage(text='Leaving group')) line_bot_api.leave_room(event.source.room_id) else: line_bot_api.reply_message( event.reply_token, TextMessage(text="Bot can't leave from 1:1 chat")) if command == 'get': profile = line_bot_api.get_group_member_profile( event.source.group_id, event.source.user_id) line_bot_api.reply_message( event.reply_token, TextMessage(text="Hello {}".format(profile.display_name))) if command == 'today' or 'tomorrow' or 'yesterday': kelas = str(searchText.group(2)[0]) if command == 'today': content = database.today_schedule(kelas) if command == 'tomorrow': content = database.tomorrow_schedule(kelas) if command == 'yesterday': content = database.yesterday_schedule(kelas) schedule = parse_schedule(content) line_bot_api.reply_message( event.reply_token, TextMessage(text="[{} {}]\n---{}".format( command.upper(), kelas.upper(), schedule))) else: None
def message_text(event): if event.type == "message": profile = line_bot_api.get_profile(event.source.user_id) messages = TextMessage(text="メッセージイベントを取得しました。\nYour ID:" + profile.user_id) with psycopg2.connect(DATABASE_URL) as conn: with conn.cursor() as cur: cur.execute( "SELECT * FROM car_stock.line_user_id where user_id = '" + profile.user_id + "'") userIdRow = cur.fetchone() # 未登録のユーザーなら登録しておく if userIdRow is None: insertSql = "INSERT INTO car_stock.line_user_id VALUES ('" + profile.user_id + "')" # INSERT文 実行 cur.execute(insertSql) # INSERT をコミット conn.commit() elif event.type == "follow": messages = TextMessage(text="フォローイベントを取得しました。\nYour ID:" + profile.user_id) status_msg = profile.status_message if status_msg != "None": # LINEに登録されているstatus_messageが空の場合は、"なし"という文字列を代わりの値とする status_msg = "なし" # messages = TemplateSendMessage(alt_text="Buttons template", # template=ButtonsTemplate( # thumbnail_image_url=profile.picture_url, # title=profile.display_name, # text=f"User Id: {profile.user_id[:5]}...\n" # f"Status Message: {status_msg}", # actions=[MessageAction(label="成功", text="次は何を実装しましょうか?")])) line_bot_api.reply_message(event.reply_token, messages=messages)
def getSeeSay(text): if len(text) > 20: return TextMessage(text="幹你娘太長了 喵") see = text.split('see', 1) say = see[1].split('say', 1) if say[0] in banList: return TextMessage(text="主人說乖貓不能亂學 喵") sqlCheck = "SELECT * FROM seesay WHERE `see` = '{see}'".format(see=say[0]) cursorCheck = db.cursor() cursorCheck.execute(sqlCheck) res = cursorCheck.fetchone() # cursorCheck.close() if res: sayJson = json.loads(res[2]) sayJson.append(say[1]) sql = "UPDATE `seesay` SET `say`='{say}' WHERE `see` = '{see}';".format( see=say[0], say=json.dumps(sayJson, ensure_ascii=False)) else: a = [] a.append(say[1]) sql = "INSERT INTO `line-bot-meow`.`seesay` (`id`, `see`, `say`, `time`) VALUES (NULL, '{see}', '{say}', CURRENT_TIMESTAMP);".format( see=say[0], say=json.dumps(a, ensure_ascii=False)) cursorCheck.execute(sql) db.commit() # if say[0] in seesayList: # seesayList[say[0]].append(say[1]) # else: # seesayList[say[0]]=[] # seesayList[say[0]].append(say[1]) # update(say[0], seesayList[say[0]]) # print ('save') return TextMessage(text="知道了 喵")
def test_mention(self): arg = { "type": "text", "text": "@example Hello, world! (love)", "mention": Mention(mentionees=[ Mentionee(index=0, length=8, user_id="U850014438e...") ]), } self.assertEqual( self.serialize_as_dict(arg, type=self.TEXT), TextMessage(**arg).as_json_dict(), )
def handle_join(event): src = event.source reply_token = event.reply_token cid = line_api_proc.source_channel_id(src) global command_executor if not isinstance(event.source, SourceUser): group_data = gb.get_group_by_id(cid) if group_data is None: added = gb.new_data(cid, MAIN_UID, administrator) msg_track.new_data(cid) api_reply(reply_token, [ TextMessage( text=u'群組資料註冊{}。'.format(u'成功' if added else u'失敗')), introduction_template() ], src) else: api_reply(reply_token, [ TextMessage(text=u'群組資料已存在。'), TextMessage(text=command_exec.G(src, [None, None, None])), introduction_template() ], cid)
def send_noLine_venues(self, reply_token, noLine_venues): text = "" for venue in noLine_venues: text = text + venue["title"] + "\n" text += "目前以上展館不用排隊,歡迎民眾前往參觀。" text_message = TextMessage(text=text) template_message = self._generate_anotherQuestion_confirmTemplate() self.line_bot_api.reply_message( reply_token, messages=[text_message, template_message])