def checkAnswer(viber_id, text): print('checking answer') session = Session() user = session.query(User).filter(User.viber_id == viber_id).first() print('user was found') if text == (session.query(Word).join(User).filter( Word.id == user.currentword_id)).first().translation: print('finding') # обновление слова в таблице learning str = session.query(Learning).filter(Learning.user_id == user.id) \ .filter(Learning.word == user.currentword_id).first() # user = session.query(User).filter(User.viber_id == viber_request.sender.id).first() if (str != None): str.last_time_answer_word = datetime.datetime.utcnow() str.right_answers += 1 session.commit() else: user.words.append( Learning(word=user.currentword_id, right_answers=1)) session.commit() user.correct_answers_session += 1 session.commit() viber.send_messages(viber_id, [TextMessage(text=f"Верно!")]) else: viber.send_messages(viber_id, [TextMessage(text=f"Неверно!")]) user.questionCount_session += 1 # обновление последнего времени ответа user.last_answer_time = datetime.datetime.utcnow() session.commit() session.close()
def trx_bot(request, a1=None): if request.method == "POST": viber = json.loads(request.body.decode('utf-8')) print(viber) if viber['event'] == 'conversation_started': id = viber['sender']['id'] viber_api.send_messages( id, [TextMessage(text='Рады видеть!'), START_KEYBOARD]) elif viber['event'] == 'webhook': #print(viber) #print("Webhook успешно установлен") return HttpResponse(status=200) elif viber['event'] == 'message': id = viber['sender']['id'] msg = viber['message']['text'] # если полученный текст есть в списке команд if msg in all_cmdlist: exect_cmd(id, msg) else: viber_api.send_messages(id, [ TextMessage(text='Ваша команда не найдена'), START_KEYBOARD ]) send_text(id, a1) else: # print("Это не Webhook - пробуй еще раз, или используй POSTMAN") return HttpResponse(status=200) return HttpResponse(status=200)
def incoming(): logger.debug("received request. post data: {0}".format(request.get_data())) print("received request. post data: {0}".format(request.get_data())) # every viber message is signed, you can verify the signature using this method if not viber.verify_signature( request.get_data(), request.headers.get('X-Viber-Content-Signature')): return Response(status=403) # this library supplies a simple way to receive a request object viber_request = viber.parse_request(request.get_data()) if isinstance(viber_request, ViberMessageRequest): text_message = TextMessage(text="Ты заебал! Звони сюда!") message = viber_request.message contact = Contact(name="Bato Rinchinov", phone_number="+79913693190", avatar="http://link.to.avatar") contact_message = ContactMessage(contact=contact) viber.send_messages(viber_request.sender.id, [text_message, contact_message]) elif isinstance(viber_request, ViberSubscribedRequest): viber.send_messages(viber_request.get_user.id, [TextMessage(text="thanks for subscribing!")]) elif isinstance(viber_request, ViberFailedRequest): logger.warn("client failed receiving message. failure: {0}".format( viber_request)) return Response(status=200)
def answer(text, game): session = Session() text = eval(text) if text[0] == game.count_all: if text[1] == game.word["translation"]: # счётчик правильных ответов game.count_correct += 1 user_id = session.query( Users.user_id).filter(Users.viber_id == game.viber_id) learning = session.query(Learning).filter( Learning.user_id == user_id).filter( Learning.word == game.word["word"]).first() learning.correct_answer += 1 session.commit() bot_response = TextMessage( text= f'Вопрос № {game.count_all + 1}. Ответ [{text[1]}] верный :)') else: bot_response = TextMessage( text= f'Вопрос № {game.count_all + 1}. Ответ [{text[1]}] неверный :(' ) # всего ответов game.count_all += 1 viber.send_messages(game.viber_id, [bot_response]) return True session.close() return False
def accept_task(r, user): task_id = r.message.text.split('#')[-1] task = Task.objects.get(id=task_id) TaskEmployee.objects.update_or_create({'accepted': True}, task=task, employee=user.employee) messages = [ TextMessage(text=f"Вы приняли задачу \"{task.name}\""), TextMessage(text=f"{task.name}\n\n{task.text}") ] if task.file: messages.append( FileMessage(media=settings.VIBER_MEDIA_HOST + task.file.url, file_name=task.file.name, size=task.file.size, min_api_version=MIN_API_VERSION)) rich_media = { "ButtonsGroupRows": 1, "ButtonsGroupColumns": 3, "Buttons": [{ **DEFAULT_BUTTON, "Columns": 3, "ActionType": "reply", "Silent": "true", "ActionBody": f"/start_report_task#{task.id}", "Text": "<b>Отчёт</b>", }] } messages.append( RichMediaMessage(rich_media=rich_media, min_api_version=MIN_API_VERSION, keyboard=get_default_keyboard(user.employee))) viber.send_messages(r.sender.id, messages)
def send_message(round, correct): """ отправка вопроса пользователю и :param round: раунд пользователя, которому отправляется вопрос :param correct: правильность введенного перевода слова """ # отправка сообщения о правильности введенного перевода слова if correct is not None: viber.send_messages(round.viber_id, TextMessage(text=correct)) # отправка вопроса о переводе слова if round.count_answers < 10: choose_word(round) bot_response = TextMessage( text= f"{round.count_answers + 1}. Как переводится слово {round.word['word']}", keyboard=CreateKeyboard(round), tracking_data='tracking_data') viber.send_messages(round.viber_id, [bot_response]) # отправка о результате раунда else: bot_response = TextMessage( text= f"{round.correct_count} верных из {round.count_answers} заданных", keyboard=START_KEYBOARD, tracking_data='tracking_data') viber.send_messages(round.viber_id, [bot_response])
def post(self, request): viber_request = viber.parse_request(request.body) print(viber_request) if isinstance(viber_request, ViberMessageRequest): viber_user = ViberUser.objects.get_or_create( viber_id=viber_request.sender.id, defaults={ 'name': viber_request.sender.name, 'avatar': viber_request.sender.avatar }) if isinstance(viber_request.message, TextMessage): viber.send_messages(viber_request.sender.id, viber_request.message) elif isinstance(viber_request.message, PictureMessage): viber.send_messages(viber_request.sender.id, TextMessage(text='Спасибо за картинку!')) elif isinstance(viber_request, ViberUnsubscribedRequest): ViberUser.objects.update_or_create(viber_id=viber_request.user_id, defaults={'is_active': False}) elif isinstance(viber_request, ViberSubscribedRequest): ViberUser.objects.update_or_create(viber_id=viber_request.user.id, defaults={ 'is_active': True, 'name': viber_request.user.name, 'avatar': viber_request.user.avatar }) viber.send_messages( viber_request.user.id, TextMessage(text='Спасибо за подписку!', tracking_data='пользователь подписался')) return HttpResponse(status=200)
def incoming(): logger.debug("received request. post data: {0}".format(request.get_data())) #All messages must be signed (it is by default) if not viber.verify_signature( request.get_data(), request.headers.get('X-Viber-Content-Signature')): #Error if not signed return Response(status=403) viber_request = viber.parse_request(request.get_data()) #Check type of request #Answer any message if isinstance(viber_request, ViberMessageRequest): text_message = TextMessage(text=random.choice( ['Foo', 'Lumberjack', 'Спасибо Кириллу за Кириллицу!'])) viber.send_messages(viber_request.sender.id, [text_message]) #Thank user for subscription elif isinstance(viber_request, ViberSubscribedRequest): viber.send_messages(viber_request.sender.id, [TextMessage(text='Thaks for subscription!')]) #Errors should never pass silently elif isinstance(viber_request, ViberFailedRequest): logger.warn("client failed receiving message. failure: {0}".format( viber_request)) return Response(status=200)
def incoming(): # Base.metadata.create_all(engine) session = Session() viber_request = viber.parse_request(request.get_data()) # отправка приветственного сообщения и стартовой клавиатуры if isinstance(viber_request, ViberConversationStartedRequest): viber_user = viber_request.user.id if len(session.query(User).filter( User.viber_id == viber_user).all()) == 0: add_user = User(name=viber_request.user.name, viber_id=viber_user, last_time_visit=datetime.datetime.utcnow()) session.add(add_user) session.commit() new_round = Round(viber_user) user_round[viber_user] = new_round viber.send_messages(viber_user, [ TextMessage(text=CreateStartInfo( session.query(User).filter( User.viber_id == viber_user).first()), keyboard=START_KEYBOARD, tracking_data='tracking_data') ]) if isinstance(viber_request, ViberMessageRequest): user = session.query(User).filter( User.viber_id == viber_request.sender.id).first() round = get_round(user.viber_id) message = viber_request.message if isinstance(message, TextMessage): # получаем сообщение от пользователя text = message.text if text == 'Старт': user.last_time_visit = datetime.datetime.utcnow() user.time_reminder = datetime.datetime.utcnow( ) + datetime.timedelta(minutes=30) session.commit() round.correct_count = 0 round.count_answers = 0 send_message(round, None) elif text == "Информация": viber.send_messages(user.viber_id, [ TextMessage(text=CreateStartInfo( session.query(User).filter( User.viber_id == user.viber_id).first()), keyboard=START_KEYBOARD, tracking_data='tracking_data') ]) elif text == 'Пример использования': send_example(round) elif text == 'Напомнить через 30 минут': user.time_reminder = datetime.datetime.utcnow( ) + datetime.timedelta(minutes=30) session.commit() else: get_answer(text, round) session.close() return Response(status=200)
def dispatchUnifiedMessage(unified_message): if __MESSENGER_TYPE__ != unified_message['bot_config']['type']: return None try: bot = getCurBotAPIRuntime(unified_message['bot_config']) # Если есть адресат, то осмысленно отвечаем ему if unified_message['chat_id'] != "": # Инициализация клавиатуры response_keyboard = copy.deepcopy(__KEYBOARD_TEMPLATE__) # Подготовка текстового сообщения response_text = "" response_command_text = "" for text in unified_message['response_text']: response_text = response_text + u'\r\n' + text # Подготовка комманд (кнопок) for response_command in unified_message['response_commands']: if response_command.lower() not in response_command_text.lower( ): response_keyboard_button = copy.deepcopy( __KEYBOARD_BUTTON_TEMPLATE__) response_keyboard_button['Text'] = response_command response_keyboard_button['ActionBody'] = response_command response_keyboard['Buttons'] = response_keyboard[ 'Buttons'] + [response_keyboard_button] response_command_text = response_command_text + response_command # Отправка сообщения боту if len(response_keyboard['Buttons']) > 0: bot.send_messages(unified_message['chat_id'], [ TextMessage(text=response_text, keyboard=response_keyboard) ]) else: bot.send_messages(unified_message['chat_id'], [TextMessage(text=response_text)]) # Если прищло нечто без адресата (скорее всего событие), то ответим только статусом 200 ОК if unified_message['chat_id'] == "": return unified_message except Exception as exc: exc_type, exc_obj, tb = sys.exc_info() app_log.appendLog(u"*** Exception caught during message dispatch: " + str(exc) + ", line " + str(tb.tb_lineno)) bot.send_messages(unified_message['chat_id'], [ TextMessage( text= "Ууууп-с.. похоже что-то пошло не так.. дай-ка мне немного времени, я смогу ответить на твои вопросы позже." ) ]) return unified_message
def process(id, msg) -> bool: # Мы обрабатываем ТОЛЬКО свои метки и шлем команды. Возвращает True если надо отправить главное меню. if msg == cmd_main: viber_api.send_messages(id, [TextMessage(text='Какой вид отдыха вас интересует?'), MAIN_KEYBOARD]) return False if msg == cmd_rost_v1: viber_api.send_messages(id, [TextMessage(text=rost()+' :)'),]) return True elif msg == cmd_rost_v2: viber_api.send_messages(id, [TextMessage(text=rost_2()+' :)')]) return True
def message_task(): messages = Message.objects.filter(status='READY') for message in messages: if message.key is not None: viber.send_messages(to=message.user.viber_id, messages=[ TextMessage(text=message.text, keyboard=message.key) ]) else: viber.send_messages(to=message.user.viber_id, messages=[TextMessage(text=message.text)]) message.status = 'POST' message.date_status = timezone.now() message.save()
def send_example(viber_id): session = Session() select_query = session.query(Users.question).filter(Users.viber_id == viber_id).one() session.close() question = eval(select_query[0]) return TextMessage(text=f'{random.choice(question["examples"])}', keyboard=KEYBOARD2, tracking_data='tracking_data')
def report_task(r, user): task_id = r.message.text.split('#')[-1] task = Task.objects.get(id=task_id) viber.send_messages(r.sender.id, [TextMessage(text='Введите текст')]) data = {'id': task.id} user.state = f'report_task#w-text#{json.dumps(data)}' user.save()
def update_time(viber_id): session = Session() update_query = session.query(Users).filter(Users.viber_id == viber_id).one() update_query.dt_last_answer = datetime.utcnow() session.commit() session.close() return TextMessage(text='Оки-доки, напомню тебе чуть позже!')
def message(self): return TextMessage( tracking_data=self.tracking_data, keyboard=self.keyboard, text=self.text, min_api_version=self.min_api_version, )
def thread_save_to_disk(self, user_id, note, file_url): """Saves data to Yandex Disk and sends report to user_id""" logging.debug("Saving Thread started") response_text = 'Saved' # if text note provided if note: logging.debug("Saving note") if not self.disk.save_note(note): response_text = 'Cannot save note.' # if file provided if file_url: logging.debug("Saving file") # extract filename from URL url_parsed = urlparse(file_url) filename = os.path.basename(url_parsed.path) # download file to temp directory with urllib.request.urlopen(file_url) as response: logging.debug("Downloading file from Viber server") data = response.read() logging.debug("Uploading file to Disk") # upload file to Disk if not self.disk.save_file(filename, data): response_text = 'Cannot save file.' message = TextMessage(text=response_text) self.viber.send_messages(user_id, [message]) return
def test_send_message_sanity(): to = "012345A=" text = "hi!" message_token = "a token" chat_id = 'my chat id sample' def post_request(endpoint, payload): data = json.loads(payload) assert endpoint == BOT_API_ENDPOINT.SEND_MESSAGE assert data['auth_token'] == VIBER_BOT_CONFIGURATION.auth_token assert data['receiver'] == to assert data['sender']['name'] == VIBER_BOT_CONFIGURATION.name assert data['sender']['avatar'] == VIBER_BOT_CONFIGURATION.avatar assert data['text'] == text assert data['chat_id'] == chat_id return dict(status=0, message_token=message_token) request_sender = Stub() request_sender.post_request = post_request text_message = TextMessage(text=text) message_sender = MessageSender(LOGGER, request_sender, VIBER_BOT_CONFIGURATION) token = message_sender.send_message(to, VIBER_BOT_CONFIGURATION.name, VIBER_BOT_CONFIGURATION.avatar, text_message, chat_id) assert token == message_token
def incoming(): viber_request = viber.parse_request(request.get_data()) print(viber_request) if isinstance(viber_request, ViberConversationStartedRequest): # идентификация/добавление нового пользователя new_current_id = viber_request.user.id db.add_user(new_current_id) viber.send_messages(viber_request.user.id, [ TextMessage( text= 'Бот предназначен для заучивания английских слов, для начала нажмите кнопку снизу.', keyboard=KEYBOARD1, tracking_data='tracking_data') ]) if isinstance(viber_request, ViberMessageRequest): current_id = viber_request.sender.id message = viber_request.message if isinstance(message, TextMessage): text = message.text print(text) # чтение введёного текста if text == "Давай начнём!": bot_response = db.send_question(current_id) viber.send_messages(current_id, bot_response) elif text == "Показать пример": bot_response = db.send_example(current_id) viber.send_messages(current_id, bot_response) else: bot_response_1 = db.check_answer(current_id, text) bot_response_2 = db.send_question(current_id) viber.send_messages(current_id, [bot_response_1, bot_response_2]) return Response(status=200)
def check_answer(self, viber_id, user_answer): check = 'Неверно' select_query = """ select question, user_id from users where viber_id = ? """ ret_value = self.conn.execute(select_query, (viber_id,)).fetchone() question = eval(ret_value['question']) update_query = """ update users set all_answers = all_answers + 1, dt_last_answer = ? where viber_id = ? """ self.conn.execute(update_query, (datetime.now(), viber_id)) self.conn.commit() if user_answer == question['translation']: update_query1 = """ update users set correct_answers = correct_answers + 1 where viber_id = ? """ self.conn.execute(update_query1, (viber_id,)) self.conn.commit() update_query2 = """ update learning set right_answer = right_answer + 1, dt_last_answer = ? where word = ? and user_id = ? """ self.conn.execute(update_query2, (datetime.now(), question['word'], ret_value['user_id'])) self.conn.commit() select_query = """ select right_answer from learning where word = ? and user_id = ? """ ret_value2 = self.conn.execute(select_query, (question['word'], ret_value['user_id'])).fetchone() check = f'Верно. Количество правильных ответов: {ret_value2["right_answer"]}' return TextMessage(text=check, keyboard=KEYBOARD2, tracking_data='tracking_data')
def language_uk(self, viber_request): vuser = ViberUser.objects.get(viber_id=viber_request.sender.id) vuser.language = "uk" vuser.save() viber.send_messages(viber_request.sender.id, [TextMessage(text='Мову змінено на Українську')]) activate(vuser.language) botton_main_disp(viber_request)
def language_en(self, viber_request): vuser = ViberUser.objects.get(viber_id=viber_request.sender.id) vuser.language = "en" vuser.save() viber.send_messages(viber_request.sender.id, [TextMessage(text='Language changed to English')]) activate(vuser.language) botton_main_disp(viber_request)
def language_ru(self, viber_request): vuser = ViberUser.objects.get(viber_id=viber_request.sender.id) vuser.language = "ru" vuser.save() viber.send_messages(viber_request.sender.id, [TextMessage(text='Язык изменен на Русский')]) activate(vuser.language) botton_main_disp(viber_request)
def test_post_to_public_account_sanity(): sender = "012345A=" text = "hi!" message_token = "a token" def post_request(endpoint, payload): data = json.loads(payload) assert endpoint == BOT_API_ENDPOINT.POST assert data['auth_token'] == VIBER_BOT_CONFIGURATION.auth_token assert data['from'] == sender assert data['sender']['name'] == VIBER_BOT_CONFIGURATION.name assert data['sender']['avatar'] == VIBER_BOT_CONFIGURATION.avatar assert data['text'] == text return dict(status=0, message_token=message_token) request_sender = Stub() request_sender.post_request = post_request text_message = TextMessage(text=text) message_sender = MessageSender(LOGGER, request_sender, VIBER_BOT_CONFIGURATION) token = message_sender.post_to_public_account( sender, VIBER_BOT_CONFIGURATION.name, VIBER_BOT_CONFIGURATION.avatar, text_message) assert token == message_token
def check_answer(viber_id, user_answer): check = 'К сожалению, ответ не верный' session = Session() select_query = session.query(Users.question, Users.user_id, Users.all_answers).filter(Users.viber_id == viber_id).one() session.close() question = eval(select_query[0]) session = Session() update_query = session.query(Users).filter(Users.viber_id == viber_id).one() update_query.all_answers += 1 update_query.dt_last_answer = datetime.utcnow() session.commit() session.close() if user_answer == question['translation']: session = Session() update_query1 = session.query(Users).filter(Users.viber_id == viber_id).one() update_query1.correct_answers += 1 session.commit() session.close() session = Session() update_query2 = session.query(Learning).filter(Learning.word == question['word']).filter( Learning.user_id == select_query[1]).one() update_query2.right_answer += 1 update_query2.dt_last_answer = datetime.utcnow() session.commit() session.close() session = Session() select_query2 = session.query(Learning.right_answer).filter(Learning.word == question['word']).filter( Learning.user_id == select_query[1]).one() session.close() check = f'Правильно! У вас уже {select_query2[0]} правильных ответов!' return TextMessage(text=check, keyboard=KEYBOARD2, tracking_data='tracking_data')
def incoming(): if not viber.verify_signature( request.get_data(), request.headers.get('X-Viber-Content-Signature')): return Response(status=403) viber_request = viber.parse_request(request.get_data()) if isinstance(viber_request, ViberMessageRequest): #handle text if type(viber_request.message) is TextMessage: viber.send_messages(viber_request.sender.id, [HandleText(viber_request)]) #handle location elif type(viber_request.message) is LocationMessage: viber.send_messages(viber_request.sender.id, [HandleLocation(viber_request)]) elif isinstance(viber_request, ViberConversationStartedRequest): viber.send_messages(viber_request.user.id, [ TextMessage( text='Здравствуйте, ' + viber_request.user.name + '!\nЧтобы заказать такси, воспользуйтесь клавиатурой ниже', keyboard=config.main_kb) ]) return Response(status=200)
def update_time(viber_id): session = Session() update_query = session.query(Users).filter( Users.viber_id == viber_id).one() update_query.dt_last_answer = datetime.utcnow() session.commit() session.close() return TextMessage(text='Прохождение теста отложено на полчаса')
def process(id, msg) -> bool: # Мы обрабатываем ТОЛЬКО свои метки и шлем команды. Возвращает True если надо отправить главное меню. if msg == cmd_main: viber_api.send_messages( id, [TextMessage(text='Какой анекдот?'), MAIN_KEYBOARD]) return False if msg == cmd_anekdot_v1: viber_api.send_messages(id, [ TextMessage(text=anekdot() + ' :)' + '(crazy)'), ]) return True elif msg == cmd_anekdot_v2: viber_api.send_messages( id, [TextMessage(text=anekdot() + ' :)' + '(crazy)')]) return True
def timed_job(): session = Session() users = session.query(Users) for u in users: if datetime.datetime.now() >= u.time_remind: viber.send_messages(u.viber_id, [TextMessage(text="Пора учить слова", keyboard=KEYBOARD, tracking_data='tracking_data')]) session.close()
def update_time(viber_id): session = Session() update_query = session.query(Users).filter( Users.viber_id == viber_id).one() update_query.dt_last_answer = datetime.utcnow() session.commit() session.close() return TextMessage(text='Напоминание создано')