def handle_attachments(sender, last_sender_message, attachment): attachment_type = attachment['type'] payload = last_sender_message['payload'] if attachment_type == 'location': if payload == 'nearest.postamats' or payload == 'nearest.offices' or payload == 'nearest.atms': coordinates = attachment['payload']['coordinates'] main.reply_nearest_find(sender, coordinates['long'], coordinates['lat'], payload) else: main.reply(sender, "А для чего Вы мне отправили своё местоположение?") if attachment_type == 'audio': last_sender_message['sendVoice'] = True main.mongo_update_record(last_sender_message) try: t = threading.Thread( target=voice_assistant.handle_voice_message_yandex, args=( sender, attachment['payload']['url'], last_sender_message, )) t.setDaemon(True) t.start() except: logging.error(helper.PrintException())
def reply_card2card_check_cardDst(sender, message, last_sender_message, is_voice=None): added_text = '' if is_voice: added_text = 'Вы продиктовали номер карты ' + helper.insert_4_spaces(message) + '.\n' message = message.replace(' ', '') if len(message) != 16: main.reply(sender, added_text + "Вы ввели не все 16 цифр карты, попробуйте ещё раз") return "cardDst.again" if not message.isdigit(): main.reply(sender, added_text + "Некоторые введенные Вами цифры не являются цифрами, попробуйте ещё раз") return "cardDst.again" if is_voice: buttons = [{"content_type": "text", "payload": "card2card.again", "title": "Ввести номер заново"}] data_quick_replies = { "recipient": {"id": sender}, "message": { "text": added_text + "Введите сумму перевода (от 500 до 494070; комиссия 1,2%, минимум 300 тенге)\n" + hint_main_menu, "quick_replies": buttons } } requests.post(fb_url, json=data_quick_replies) else: main.reply(sender, "Введите сумму перевода (от 500 до 494070; комиссия 1,2%, минимум 300 тенге)\n" + hint_main_menu) last_sender_message['lastCardDst'] = message last_sender_message['payload'] = 'card2card.amount' try: if not "cardDsts" in last_sender_message: last_sender_message['cardDsts'] = [] if not message in last_sender_message['cardDsts'] and len(last_sender_message['cardDsts']) < 9: last_sender_message['cardDsts'].append(message) except: logging.error(helper.PrintException()) main.mongo_update_record(last_sender_message)
def reply_onai(sender, message, last_sender_message, is_voice=None): added_text = '' if is_voice: added_text = 'Вы продиктовали номер ' + helper.insert_spaces_onai(message) + '.\n' url_login = '******' message = message.replace(' ', '') r = requests.post(url_login, json={"operatorId": "onai", "data": message}) if r.status_code == 404: main.reply(sender, added_text + "Вы ввели неправильный номер карты Онай, введите еще раз") return "wrong onai number" if is_voice: buttons = [{"content_type": "text", "payload": "onai.again", "title": "Ввести номер заново"}] data_quick_replies = { "recipient": {"id": sender}, "message": { "text": added_text + "Введите сумму пополнения баланса (не менее 100 тг, комиссия 0 тг)", "quick_replies": buttons } } requests.post(fb_url, json=data_quick_replies) else: main.reply(sender, added_text + "Введите сумму пополнения баланса (не менее 100 тг, комиссия 0 тг)") last_sender_message['onaiToRefill'] = message try: if not "onaisToRefill" in last_sender_message: last_sender_message['onaisToRefill'] = [] if not message in last_sender_message['onaisToRefill'] and len(last_sender_message['onaisToRefill']) < 10: last_sender_message['onaisToRefill'].append(message) except: logging.error(helper.PrintException()) last_sender_message['payload'] = 'onai.amount' main.mongo_update_record(last_sender_message)
def reply_card2cash_history_show(sender, last_sender_message, token): try: main.reply_typing_on(sender) headers = { 'Content-Type': 'application/x-www-form-urlencoded', 'X-Channel-Id': x_channel_id, 'X-IV-Authorization': 'Identifier ' + last_sender_message['mobileNumber'] } url_token_show = url + portal_id + '/payment/' + token r = requests.get(url_token_show, headers=headers) data = r.json() result = "Проверьте введённые данные:" \ "\nКарта: " + data['src']['title'] + \ "\nСумма: " + str(data['amount'] // 100) + \ "\nКомиссия: " + str(data['commission'] // 100) + \ "\nИтого: " + str((int(data['amount'])+int(data['commission'])) // 100) + \ "\nФИО получателя: " + data['params']['rcpnLastname'] + " " + data['params']['rcpnName'] + \ "\nАдрес получателя: " + data['params']['rcpnAddr'] + \ "\nНомер телефона получателя: " + data['params']['rcpnPhone'] + \ "\nКодовое слово: " + data['params']['codeWord'] + \ "\n\nЧтобы подтвердить перевод, введите трехзначный код CSC/CVV2 на обратной стороне карты" main.reply(sender, result) last_sender_message['card2cash_token'] = token main.mongo_update_record(last_sender_message) except: main.reply(sender, "Произошла непредвиденная ошибка, попробуйте позднее") logging.error(helper.PrintException())
def reply_astanaErc_csc(sender, payload, last_sender_message): try: chosenCard = last_sender_message[payload] result = 'Проверьте суммы:\n' invoiceData = get_komuslugi_invoice(last_sender_message) c = 0 sum = 0 for i in invoiceData['details']: desc = i['description'] invoiceData['details'][c]['amount'] = math.ceil( invoiceData['details'][c]['amount']) amount = i['amount'] debt = i['debt'] sum += amount + debt sum_str = ', сумма ' + str(amount + debt) + ' тг' result += desc + sum_str + '\n' c += 1 result += "\nКарта: " + chosenCard result += "\nСумма: " + str(sum) + " тг" result += "\nКомиссия: 100 тг" result += "\nИтого: " + str(sum + 100.0) + " тг" result += "\n\nЕсли всё верно, введите трехзначный код CSC/CVV2 на обратной стороне карты" main.reply(sender, result) except: logging.error(helper.PrintException())
def handle_voice_message(sender, voice_url, last_sender_message): logging.info("Handling audio") try: main.reply_typing_on(sender) start = time.time() g = requests.get(voice_url, stream=True) logging.info('requests.get(voice_url) time = ' + str(time.time() - start)) voice_filename = "voice_" + sender + ".mp4" #voice_filename_mp3 = "voice_" + sender + ".mp3" voice_filename_wav = "voice_" + sender + ".wav" with open(voice_filename, "wb") as o: start = time.time() o.write(g.content) logging.info('o.write(g.content) time = ' + str(time.time() - start)) start = time.time() #AudioSegment.from_file(voice_filename, "mp4").export(voice_filename_mp3, format="mp3") AudioSegment.from_file(voice_filename, "mp4").export(voice_filename_wav, format="wav") logging.info('AudioSegment export time = ' + str(time.time() - start)) with open(voice_filename_wav, 'rb') as f: try: start = time.time() resp = client.speech(f, None, {'Content-Type': 'audio/wav'}) if "_text" in resp: main.reply(sender, resp['_text']) logging.info('Wit.ai client.speech response time = ' + str(time.time() - start)) logging.info('Yay, got Wit.ai response: ' + str(resp)) handle_entities(sender, last_sender_message, resp) except: logging.info(helper.PrintException()) main.reply(sender, "Извините, я не поняла что Вы сказали") main.reply_typing_off(sender) try: os.remove(voice_filename) #os.remove(voice_filename_mp3) os.remove(voice_filename_wav) except: pass except: logging.error(helper.PrintException())
def reply_mobile_check_number(sender, message, last_sender_message, is_voice=None): added_text = 'Вы продиктовали номер ' + message + '.\n' main.reply_typing_on(sender) url_login = '******' message = message.replace(' ', '') message = message[-10:] r = requests.post(url_login, json={"phone": message}) operator = r.json()['operator'] if operator == 'error': if is_voice: main.reply(sender, added_text + "К сожалению, он оказался неправильным. Попробуйте еще раз") else: main.reply(sender, "Вы ввели неправильный номер телефона. Попробуйте еще раз") return "error" operator = operator[:-2].title() minAmount = 0 if operator == 'Tele2' or operator == 'Beeline': minAmount = 100 elif operator == 'Activ' or operator == 'Kcell': minAmount = 200 else: main.reply(sender, "Оператор " + operator + " сейчас не поддерживается. Введите другой номер, пожалуйста.") return "other operator" last_sender_message['mobileOperator'] = operator last_sender_message['payload'] = 'mobile.amount' last_sender_message['phoneToRefill'] = message try: if not "phonesToRefill" in last_sender_message: last_sender_message['phonesToRefill'] = [] if not message in last_sender_message['phonesToRefill'] and len(last_sender_message['phonesToRefill']) < 10: last_sender_message['phonesToRefill'].append(message) except: logging.error(helper.PrintException()) last_sender_message['minAmount'] = minAmount main.mongo_update_record(last_sender_message) title = added_text + "Оператор номера: " + operator + \ "\nВведите или продиктуйте сумму пополнения баланса (не менее " + str(minAmount) + " тг)" if is_voice: buttons = [{"content_type": "text", "payload": "mobile.voice_number.again", "title": "Ввести номер заново"}] data_quick_replies = { "recipient": {"id": sender}, "message": { "text": title, "quick_replies": buttons } } requests.post(fb_url, json=data_quick_replies) else: main.reply_just_text(sender, title)
def get_komuslugi(last_sender_message, data): message = data['data'] result = '' session = requests.Session() status = 'FAILED' try: headers = { "Authorization": "Basic " + last_sender_message['encodedLoginPass'], 'Content-Type': 'application/json' } url_login = '******' r = session.get(url_login, headers=headers) url_login = '******' r = session.post(url_login, json=data) data = r.json() status = data['responseInfo']['status'] if status == 'FAILED': result = 'Квитанций по лицевому счёту ' + message + ' не найдено\n' else: sum = 0 subscriptionId = str(r.json()['subscriptionData']['id']) url_login = '******' + subscriptionId + '/invoices' data = session.get(url_login).json() status = data['responseInfo']['status'] invoiceData = data['invoiceData'][0] result = 'Информация по лицевому счёту ' + message + '\n' result += invoiceData['description'] + '\n\n' for i in invoiceData['details']: desc = i['description'] amount = i['amount'] amount_str = ', сумма ' + str(amount) + ' тг' debt = i['debt'] sum += amount + debt debt_str = '' if debt > 0: debt_str = ', долг ' + str(debt) + ' тг' result += desc + debt_str + amount_str + '\n' result += '\nИтого: ' + format(sum, '.2f') + ' тг' except: main.reply(last_sender_message['sender'], "Произошла непредвиденная ошибка, попробуйте позднее") logging.error(helper.PrintException()) return 'error', status return result, status
def get_komuslugi_invoice(last_sender_message): message = last_sender_message['astanaErc_last_acc'] data = {'operatorId': 'astanaErcWf', 'data': message} invoiceData = {} try: session = main.get_authorized_session( last_sender_message['encodedLoginPass']) url_login = '******' r = session.post(url_login, json=data) subscriptionId = str(r.json()['subscriptionData']['id']) url_login = '******' + subscriptionId + '/invoices' data = session.get(url_login).json() invoiceData = data['invoiceData'][0] except: main.reply(last_sender_message['sender'], "Произошла непредвиденная ошибка, попробуйте позднее") logging.error(helper.PrintException()) return invoiceData
def reply_pdd_shtrafy_gosnomer(sender, message, last_sender_message): main.reply_typing_on(sender) data = {'operatorId': 'pddVehicle', 'data': message.replace(' ', '/')} result = check_penalties_pdd(last_sender_message, data) try: if not "pddGosnomers" in last_sender_message: last_sender_message['pddGosnomers'] = [] if not message in last_sender_message['pddGosnomers'] and len( last_sender_message['pddIINs']) < 10: last_sender_message['pddGosnomers'].append(message) except: logging.error(helper.PrintException()) result += "(Выберите или введите другой номер авто/техпаспорт через пробел (пример: 123AAA01 AA00000000), " \ "чтобы посмотреть штрафы ПДД, либо нажмите (y) для перехода в главное меню)" reply_pdd_shtrafy_gosnomer_quick_replies_with_delete( sender, last_sender_message['pddGosnomers'], result) main.mongo_update_record(last_sender_message)
def reply_pdd_shtrafy_iin(sender, message, last_sender_message): main.reply_typing_on(sender) try: year = int(message[:2]) month = int(message[2:4]) day = int(message[4:6]) century = int(message[6:7]) assert month <= 12 month31days = [1, 3, 5, 7, 8, 10, 12] month30days = [4, 6, 9, 11] if year % 4 == 0 and month == 2: assert day <= 28 if month in month30days: assert day <= 30 if month in month31days: assert day <= 31 assert century <= 6 except: main.reply(sender, "Вы ввели неправильный ИИН, введите еще раз") return "again" url_login = '******' + message r = requests.get(url_login).json() try: name = r['name'] except: main.reply(sender, "Такой ИИН не найден, введите еще раз") return "again" data = {'operatorId': 'pddIin', 'data': message} result = check_penalties_pdd(last_sender_message, data) try: if not "pddIINs" in last_sender_message: last_sender_message['pddIINs'] = [] if not message in last_sender_message['pddIINs'] and len( last_sender_message['pddIINs']) < 10: last_sender_message['pddIINs'].append(message) except: logging.error(helper.PrintException()) result += "(Выберите или введите другой ИИН, чтобы посмотреть штрафы ПДД, " \ "либо нажмите (y) для перехода в главное меню)" reply_pdd_shtrafy_iin_quick_replies_with_delete( sender, last_sender_message['pddIINs'], result) main.mongo_update_record(last_sender_message)
def reply_astanaErc(sender, message, last_sender_message): main.reply_typing_on(sender) try: if not main.check_login(sender, last_sender_message): return data = {'operatorId': 'astanaErcWf', 'data': message} result, status = get_komuslugi(last_sender_message, data) if result == 'error': return if not "astanaErc_accounts" in last_sender_message: last_sender_message['astanaErc_accounts'] = [] if not message in last_sender_message['astanaErc_accounts'] and len( last_sender_message['astanaErc_accounts']) < 10: last_sender_message['astanaErc_accounts'].append(message) reply_astanaErc_quick_replies_with_delete( sender, last_sender_message['astanaErc_accounts'], result, status) last_sender_message['astanaErc_last_acc'] = message main.mongo_update_record(last_sender_message) except: logging.error(helper.PrintException())
def send_voice(sender, msg): try: ya_url = 'https://tts.voicetech.yandex.net/generate?key=' + api_key + '&text=' ya_url += msg ya_url += '&format=mp3&quality=hi&lang=ru-RU&speaker=omazh&speed=1.0&emotion=good' r = requests.get(ya_url) voice_file = 'ya_' + sender + '.mp3' with open(voice_file, "wb") as o: o.write(r.content) data = { 'recipient': '{id:' + sender + '}', 'message': '{"attachment":{"type":"audio", "payload":{}}}' } files = {'filedata': (voice_file, open(voice_file, "rb"), 'audio/mp3')} requests.post(fb_url, data=data, files=files) try: os.remove(voice_file) except: pass except: logging.error(helper.PrintException())
def reply_card2cash_history_startPayment(sender, message, last_sender_message): if not helper.check_csc(message): main.reply( sender, "Вы неправильно ввели трёхзначный код CSC/CVV2 на обратной стороне карты, введите заново" ) return "ok" main.reply(sender, "Идёт обработка перевода, подождите 1-2 минуты...") main.reply_typing_on(sender) try: token = last_sender_message['card2cash_token'] session = requests.Session() headers = { 'Content-Type': 'application/x-www-form-urlencoded', 'X-Channel-Id': x_channel_id, 'X-IV-Authorization': 'Identifier ' + last_sender_message['mobileNumber'] } url_token_show = url + portal_id + '/payment/' + token r = session.get(url_token_show, headers=headers) data = r.json() url_token = url + portal_id + '/token' r = session.post(url_token, headers=headers) new_token = r.json()['token'] data1 = { 'paymentId': "MoneyTransfer_KazPost_Card2Cash", 'returnUrl': 'https://post.kz/static/return.html', 'src.type': 'card_id', 'src.cardholder': 'NAME', 'src.cardId': data['src']['cardId'], 'src.csc': message, 'src.addToProfile': 'true', 'amount': str(data['amount']), 'commission': str(data['commission']), 'total': str(data['amount'] + data['commission']), 'currency': data['currency'], 'params.transfType': data['params']['transfType'], 'params.transfPurpose': data['params']['transfPurpose'], 'params.cliResident': data['params']['cliResident'], 'params.cliTaxcode': data['params']['cliTaxcode'], 'params.cliLastname': data['params']['cliLastname'], 'params.cliName': data['params']['cliName'], 'params.cliAddr': data['params']['cliAddr'], 'params.cliPhone': data['params']['cliPhone'], 'params.passportType': data['params']['passportType'], 'params.passportNum': data['params']['passportNum'], 'params.passportDate': data['params']['passportDate'], 'params.passportOrg': data['params']['passportOrg'], 'params.rcpnLastname': data['params']['rcpnLastname'], 'params.rcpnName': data['params']['rcpnName'], 'params.rcpnAddr': data['params']['rcpnAddr'], 'params.rcpnPhone': data['params']['rcpnPhone'], 'params.codeWord': data['params']['codeWord'], } url_start = url + portal_id + '/payment/' + new_token + '/start' requests.post(url_start, data1, headers=headers) url_status = url + portal_id + '/payment/' + new_token timer = 0 urlSent = False main.reply_typing_on(sender) while timer < timeout: if urlSent: time.sleep(1) r = session.post(url_status, headers=headers).json() if r['state'] == 'redirect' and not urlSent: main.reply_send_redirect_url(sender, r['url']) urlSent = True if r['state'] == 'result': if r['result']['status'] == 'fail': main.reply( sender, "Перевод не был завершен успешно. Попробуйте снова") if r['result']['status'] == 'suspended': main.reply( sender, "Возникла проблема на стороне банка, перевод не был осуществлён. Попробуйте позже" ) if r['result']['status'] == 'success': res = "Поздравляю! Перевод был проведен успешно!" res += "\nВнимание! Сообщите контрольный номер перевода и кодовое слово получателю перевода" res += "\nКонтрольный номер перевода: " + r['result'][ 'transferCode'] res += "\nКонтрольное слово: " + data['params']['codeWord'] main.reply(sender, res) main.reply_main_menu_buttons(sender, last_sender_message) return timer += 1 last_sender_message = main.mongo_get_by_sender(sender) if last_sender_message['payload'] == 'card2cash.show': strminutes = str(timeout // 60) main.reply( sender, "Прошло больше " + strminutes + " минут: перевод отменяется") main.reply_main_menu_buttons(sender, last_sender_message) return "time exceed" except: main.reply(sender, "Произошла непредвиденная ошибка, попробуйте позднее") logging.error(helper.PrintException())
def reply_onai_startPayment(sender, message, last_sender_message): if not helper.check_csc(message): main.reply(sender, "Вы неправильно ввели трёхзначный код CSC/CVV2 на обратной стороне карты, введите заново") return "ok" main.reply(sender, "Идет обработка платежа...") main.reply_typing_on(sender) # 1 - авторизация на post.kz try: session = main.get_authorized_session(last_sender_message['encodedLoginPass']) # 2 - вызов createSubscription() из PaymentAPI url_login2 = 'https://post.kz/mail-app/api/v2/subscriptions' login = last_sender_message['login'] operatorId = 'onai' onaiToRefill = last_sender_message['onaiToRefill'] amount = last_sender_message['amount'] sd2 = {"id": "", "login": login, "operatorId": operatorId, "data": onaiToRefill, "name": "", "invoiceIds": ""} r = session.post(url_login2, json=sd2) data = r.json() subscriptionId = str(data['subscriptionData']['id']) invoiceId = data['subscriptionData']['invoiceIds'][0] # 3 - вызов getInvoices() из PaymentAPI url_login3 = 'https://post.kz/mail-app/api/v2/subscriptions/' + subscriptionId + '/invoices' r = session.get(url_login3) body = r.json()['invoiceData'][0] # 4 - вызов getToken() mobileNumber = last_sender_message['mobileNumber'] token = main.get_token_postkz(session, mobileNumber) body['token'] = token body['invoiceId'] = invoiceId body['systemId'] = 'POSTKZ' body['details'][0]['amount'] = amount body['details'][0]['commission'] = 0 # 5 - вызов createPayment() url_login5 = 'https://post.kz/mail-app/api/v2/payments/create' r = session.post(url_login5, json=body) payment_id = r.json()['paymentData']['id'] # 6 - вызов getCards() url_login6 = 'https://post.kz/mail-app/api/intervale/card?device=mobile' sd2 = {"blockedAmount": "", "phone": mobileNumber, "paymentId": "", "returnUrl": "", "transferId": ""} r = session.post(url_login6, json=sd2) card = r.json()[last_sender_message['chosenCardIndex']] sd2 = {} sd2['phone'] = mobileNumber sd2['paymentId'] = payment_id sd2['cardId'] = card['id'] sd2['csc'] = message sd2['token'] = token sd2['returnUrl'] = 'https://post.kz/static/return.html' # 7 - вызов startPayment() url_login7 = 'https://post.kz/mail-app/api/intervale/payment/start/' + token r = session.post(url_login7, json=sd2) # 8 - вызов statusPayment() url_login8 = 'https://post.kz/mail-app/api/intervale/payment/status/' + token sd22 = {} sd22['phone'] = mobileNumber sd22['paymentId'] = payment_id r = session.post(url_login8, json=sd22) # 9 - вызов acceptPayment() url_login9 = 'https://post.kz/mail-app/api/intervale/payment/accept/' + token r = session.post(url_login9, json=sd2) # 10 - вызов statusPayment() url_login10 = 'https://post.kz/mail-app/api/intervale/payment/status/' + token r = session.post(url_login10, json=sd22) data = r.json() if data['state'] == 'redirect': main.reply_send_redirect_url(sender, data['url']) time.sleep(5) timer = 0 while timer < timeout: time.sleep(1) r = session.post(url_login10, json=sd22) data = r.json() if data['state'] == 'result': result_status = data['result']['status'] if result_status == 'fail': main.reply(sender, "Платеж не был завершен успешно. Попробуйте снова") elif result_status == 'success': res = "Поздравляю! Платеж был проведен успешно, карта Онай " + onaiToRefill + " пополнена на сумму " + str( amount) + " тг.\n" res += "Номер квитанции: " + str(payment_id) res += ", она доступна на post.kz в разделе История платежей" main.reply(sender, res) main.reply_main_menu_buttons(sender, last_sender_message) return "ok" timer += 1 last_sender_message = main.mongo_get_by_sender(sender) if last_sender_message['payload'] == 'onai.startPayment': strminutes = str(timeout // 60) main.reply(sender, "Прошло больше " + strminutes + " минут: платеж отменяется") main.reply_main_menu_buttons(sender, last_sender_message) return "time exceed" except: main.reply(sender, "Произошла непредвиденная ошибка, попробуйте позднее") main.reply_main_menu_buttons(sender, last_sender_message) logging.error(helper.PrintException()) return "fail"
def reply_addcard_startAdding(sender, message, last_sender_message): if not helper.check_csc(message): main.reply( sender, "Вы неправильно ввели трёхзначный код CSC/CVV2 на обратной стороне карты, введите заново" ) return "ok" main.reply(sender, "Идет обработка добавления карты...") main.reply_typing_on(sender) try: # 1 - авторизация на post.kz url_login = '******' headers = { "Authorization": "Basic " + last_sender_message['encodedLoginPass'], 'Content-Type': 'application/json' } # 2 - создаём токен session = requests.Session() r = session.get(url_login, headers=headers) mobileNumber = r.json()['mobileNumber'] # 3 - инициируем start registration url_login2 = 'https://post.kz/mail-app/api/intervale/token' data = {"phone": mobileNumber} r = session.post(url_login2, json=data) token = r.json()['token'] # 4 - передаём все данные карты для регистрации карты url_login3 = 'https://post.kz/mail-app/api/intervale/card/registration/start/' + token data = { "phone": mobileNumber, "returnUrl": "https://post.kz/static/return.html" } r = session.post(url_login3, json=data) # 4 - передаём все данные карты для регистрации карты url_login5 = 'https://openapi-entry.intervale.ru/api/v3/' + portal_id_2 + '/card/registration/' url_login5 += token + '/card-page-submit?fallback=https%3A%2F%2Fpost.kz%2Fstatic%2Freturn.html' data = { 'pan': last_sender_message['addcard_cardnumber'], 'expiry': last_sender_message['addcard_expiredate'], 'csc': message, 'cardholder': last_sender_message['addcard_cardowner'].lower(), 'pageType': 'reg' } r = session.post(url_login5, data=data) result = r.json() try: if result['error'] == 'ALREADY_REGISTERED': main.reply( sender, "Эта карта уже добавлена в вашем профиле на post.kz") main.reply_main_menu_buttons(sender, last_sender_message) return "ALREADY_REGISTERED" except: pass # 5 - дергаём статус, вытаскиваем url для 3DSecure url_login4 = 'https://post.kz/mail-app/api/intervale/card/registration/status/' + token data = {"phone": mobileNumber} r = session.post(url_login4, json=data) d = r.json() if d['state'] == 'redirect': main.reply_send_redirect_url(sender, d['url']) time.sleep(9) if d['state'] == 'confirmation': message = 'Для подтверждения карты, введите сумму, блокированную на вашей карте.\n' message += 'Блокированную сумму можно узнать через интернет-банкинг или call-центр вашего банка.\n' message += 'Осталось попыток: 3' main.reply(sender, message) last_sender_message['token'] = token last_sender_message['mobileNumber'] = mobileNumber last_sender_message['payload'] = 'addcard.confirmation' main.mongo_update_record(last_sender_message) return "confirmation" timer = 0 while timer < timeout: time.sleep(1) r = session.post(url_login4, json=data) d = r.json() if d['state'] == 'result': status = d['result']['status'] if status == 'success': res = "Поздравляю! Карта успешно добавлена!" main.reply(sender, res) if status == 'fail': main.reply(sender, "Карта не была добавлена. Попробуйте снова") main.reply_main_menu_buttons(sender, last_sender_message) return "ok" last_sender_message = main.mongo_get_by_sender(sender) if last_sender_message['payload'] == 'addcard.csc': strminutes = str(timeout // 60) main.reply( sender, "Прошло больше " + strminutes + " минут: добавление карты отменяется") main.reply_main_menu_buttons(sender, last_sender_message) return "time exceed" except: logging.error(helper.PrintException()) main.reply(sender, "Произошла непредвиденная ошибка, попробуйте позднее") main.reply_main_menu_buttons(sender, last_sender_message) return "fail"
def reply_card2card_startPayment(sender, message, last_sender_message): if not helper.check_csc(message): main.reply(sender, "Вы неправильно ввели трёхзначный код CSC/CVV2 на обратной стороне карты, введите заново") return "ok" main.reply(sender, "Идет обработка перевода...") main.reply_typing_on(sender) # 1 - авторизация на post.kz try: session = main.get_authorized_session(last_sender_message['encodedLoginPass']) mobileNumber = last_sender_message['mobileNumber'] # 2 - вызов getCards() url_login6 = 'https://post.kz/mail-app/api/intervale/card?device=mobile' sd2 = {"blockedAmount": "", "phone": mobileNumber, "paymentId": "", "returnUrl": "", "transferId": ""} r = session.post(url_login6, json=sd2) card = r.json()[last_sender_message['chosenCardIndex']] # 3 - вызов getToken() url_login4 = url + portal_id + '/token' headers = {'Content-Type': 'application/x-www-form-urlencoded', 'X-Channel-Id': x_channel_id, 'X-IV-Authorization': 'Identifier ' + mobileNumber} r = session.post(url_login4, headers=headers) token = r.json()['token'] # 4 - вызов startPayment() amount = last_sender_message['amount'] data = {'paymentId': 'MoneyTransfer_KazPost_Card2Card', 'currency': 'KZT', 'amount': str(amount) + '00', 'commission': str(last_sender_message['commission']) + '00', 'total': str(last_sender_message['total']) + '00', 'src.type': 'card_id', 'src.cardId': card['id'], 'src.csc': message, 'dst.type': 'card', 'dst.pan': last_sender_message['lastCardDst'], 'returnUrl': 'https://transfer.post.kz/?token=' + token} url_login5 = url + portal_id + '/payment/' + token + '/start' r = session.post(url_login5, data=data, headers=headers) # 5 - вызов statusPayment() url_login10 = url + portal_id + '/payment/' + token r = session.post(url_login10, headers=headers) data = r.json() state = data['state'] if state == 'redirect': main.reply_send_redirect_url(sender, data['url']) card_w_spaces = helper.insert_4_spaces(last_sender_message['lastCardDst']) timer = 0 while timer < timeout: time.sleep(1) r = session.post(url_login10, headers=headers) data = r.json() try: result_status = data['result']['status'] if result_status == 'fail': main.reply(sender, "Платеж не был завершен успешно. Попробуйте снова") elif result_status == 'success': res = "Поздравляю! Платеж был проведен успешно, карта " + card_w_spaces + " пополнена на сумму " + str( amount) + " тг.\n" res += "Номер квитанции: " + str(data['result']['trxId']) res += ", она доступна в профиле post.kz в разделе История платежей" main.reply(sender, res) main.reply_main_menu_buttons(sender, last_sender_message) return "ok" except: pass timer += 1 last_sender_message = main.mongo_get_by_sender(sender) if last_sender_message['payload'] == 'card2card.startPayment': strminutes = str(timeout // 60) main.reply(sender, "Прошло больше " + strminutes + " минут: платеж отменяется") main.reply_main_menu_buttons(sender, last_sender_message) return "time exceed" except: main.reply(sender, "Произошла непредвиденная ошибка, попробуйте позднее") main.reply_main_menu_buttons(sender, last_sender_message) logging.error(helper.PrintException()) return "fail"
def handle_intent(sender, last_sender_message, value): try: if value == 'greeting': message = "Здравствуйте, " + last_sender_message[ 'first_name'] + "!\n" message += "Меня зовут Е-Сау+ле, я голосовая помощница этого бота." main.reply_just_text(sender, message.replace('+', '')) main.send_voice(sender, message) elif value == 'postamat': main.reply(sender, helper.postamat) elif value == 'hybridpost_def': main.reply(sender, helper.hybridpost_def) elif value == 'supermarket': main.reply(sender, helper.what_is_supermarket) elif value == 'trackbynumber_query': main.reply(sender, helper.trackbynumber_query) elif value == 'fastmail_options': main.reply(sender, helper.fastmail_options) elif value == 'postamat_how': main.reply(sender, helper.postamat_how) elif value == 'hybridpost_time': main.reply(sender, helper.hybridpost_time) elif value == 'postamat_info_access': main.reply(sender, helper.postamat_info_access) elif value == 'hybridpost_info': main.reply(sender, helper.hybridpost_info) elif value == 'trackbynumber': main.reply(sender, helper.trackbynumber) elif value == 'redirect': main.reply(sender, helper.redirect) elif value == 'redirect_why': main.reply(sender, helper.redirect_why) elif value == 'package_how_long': main.reply(sender, helper.package_how_long) elif value == 'COMMAND_exchange_rates': main.reply_currencies_kursy(sender) elif value == 'COMMAND_go_home': main.reply_main_menu_buttons(sender, last_sender_message) elif value == 'COMMAND_card2card': card2card.reply_card2card_enter_cardDst(sender, last_sender_message) elif value == 'COMMAND_paymobile': mobile.reply_mobile_enter_number(sender, last_sender_message) elif value == 'COMMAND_payonai': bot_server.call_onai(sender, last_sender_message, 'onai') elif value == 'COMMAND_sendmessage': bot_server.call_sendmessage(sender, last_sender_message, 'send.message') elif value == 'COMMAND_my_cards': bot_server.call_addcard(sender, last_sender_message, 'addcard') elif value == 'COMMAND_nearest': main.reply_nearest(sender) elif value == 'COMMANDS_nearest_postamat' or value == 'find_postamat': bot_server.call_request_nearest_location(sender, last_sender_message, 'nearest.postamats') elif value == 'COMMANDS_nearest_office' or value == 'find_dep': bot_server.call_request_nearest_location(sender, last_sender_message, 'nearest.offices') elif value == 'COMMANDS_nearest_atm': bot_server.call_request_nearest_location(sender, last_sender_message, 'nearest.atms') elif value == 'COMMAND_nearest': main.reply_nearest(sender) elif value == 'COMMAND_disable_bot': bot_server.call_disable_bot(sender, last_sender_message, 'disable.bot') elif value == 'COMMAND_track': tracking.reply_tracking_enter_number(sender, last_sender_message) elif value == 'penalties_pdd' or value == 'COMMAND_penalties': shtrafy.reply_pdd_shtrafy(sender) elif value == 'info_post': tracking.reply_tracking_enter_number(sender, last_sender_message) elif value == 'how_are_you': main.reply(sender, "У меня всё замечательно!") elif value == 'FUN_anekdot': r = feedparser.parse('http://anekdotme.ru/RSS') random_int = randint(0, len(r['entries']) - 1) anekdot = r['entries'][random_int]['summary_detail']['value'] anekdot = anekdot.replace('<br />', '\n').replace('—', '').replace( '<BR>', '').replace('<br>', '') logging.info("Anekdot = " + anekdot) main.reply(sender, anekdot) elif value == 'thanx': main.reply( sender, "Всегда рада Вам служить, " + last_sender_message['first_name'] + "!") else: main.reply(sender, "Я не поняла Вашу команду") except: logging.error(helper.PrintException())
def reply_mobile_startPayment(sender, message, last_sender_message): main.reply(sender, "Идет обработка платежа...") main.reply_typing_on(sender) # 1 - авторизация на post.kz try: url_login = '******' headers = {"Authorization": "Basic " + last_sender_message['encodedLoginPass'], 'Content-Type': 'application/json'} session = requests.Session() r = session.get(url_login, headers=headers) # 2 - вызов createSubscription() из PaymentAPI url_login2 = 'https://post.kz/mail-app/api/v2/subscriptions' login = last_sender_message['login'] operatorId = last_sender_message['mobileOperator'] phoneToRefill = last_sender_message['phoneToRefill'] amount = last_sender_message['amount'] sd2 = {"id": "", "login": login, "operatorId": operators_dict[operatorId], "data": phoneToRefill, "name": "", "invoiceIds": ""} r = session.post(url_login2, json=sd2) data = r.json() subscriptionId = str(data['subscriptionData']['id']) invoiceId = data['subscriptionData']['invoiceIds'][0] # 3 - вызов getInvoices() из PaymentAPI url_login3 = 'https://post.kz/mail-app/api/v2/subscriptions/' + subscriptionId + '/invoices' r = session.get(url_login3) body = r.json()['invoiceData'][0] # 4 - вызов getToken() url_login4 = 'https://post.kz/mail-app/api/intervale/token?device=mobile' mobileNumber = last_sender_message['mobileNumber'] sd2 = {"blockedAmount": "", "phone": mobileNumber, "paymentId": "", "returnUrl": "", "transferId": ""} r = session.post(url_login4, json=sd2) token = r.json()['token'] body['token'] = token body['invoiceId'] = invoiceId body['systemId'] = 'mobile' body['details'][0]['amount'] = amount body['details'][0]['commission'] = last_sender_message['commission'] # print ('#############################################') # print (body) # 5 - вызов createPayment() url_login5 = 'https://post.kz/mail-app/api/v2/payments/create?device=mobile' r = session.post(url_login5, json=body) payment_id = r.json()['paymentData']['id'] # print ('#############################################') # print (r.json()) # 6 - вызов getCards() url_login6 = 'https://post.kz/mail-app/api/intervale/card?device=mobile' sd2 = {"blockedAmount": "", "phone": mobileNumber, "paymentId": "", "returnUrl": "", "transferId": ""} r = session.post(url_login6, json=sd2) card = r.json()[last_sender_message['chosenCardIndex']] sd2 = {} sd2['phone'] = mobileNumber sd2['paymentId'] = payment_id sd2['cardId'] = card['id'] sd2['csc'] = message sd2['token'] = token sd2['returnUrl'] = 'https://post.kz/static/return.html' # 7 - вызов startPayment() url_login7 = 'https://post.kz/mail-app/api/intervale/payment/start/' + token + '?device=mobile' r = session.post(url_login7, json=sd2) # 8 - вызов statusPayment() url_login8 = 'https://post.kz/mail-app/api/intervale/payment/status/' + token + '?device=mobile' sd22 = {} sd22['phone'] = mobileNumber sd22['paymentId'] = payment_id r = session.post(url_login8, json=sd22) # 9 - вызов acceptPayment() url_login9 = 'https://post.kz/mail-app/api/intervale/payment/accept/' + token + '?device=mobile' r = session.post(url_login9, json=sd2) # 10 - вызов statusPayment() url_login10 = 'https://post.kz/mail-app/api/intervale/payment/status/' + token + '?device=mobile' r = session.post(url_login10, json=sd22) data = r.json() if data['state'] == 'redirect': main.reply_send_redirect_url(sender, data['url']) time.sleep(9) timer = 0 while timer < timeout: time.sleep(1) r = session.post(url_login10, json=sd22) data = r.json() if data['state'] == 'result': result_status = data['result']['status'] if result_status == 'fail': main.reply(sender, "Платеж не был завершен успешно. Попробуйте снова") elif result_status == 'success': res = "Поздравляю! Платеж был проведен успешно, номер " + phoneToRefill + " пополнен на сумму " + str( amount) + " тг.\n" res += "Номер квитанции: " + str(payment_id) res += ", она доступна в профиле post.kz в разделе История платежей" main.reply(sender, res) main.reply_main_menu_buttons(sender, last_sender_message) return "ok" timer += 1 last_sender_message = main.mongo_get_by_sender(sender) if last_sender_message['payload'] == 'mobile.startPayment': strminutes = str(timeout // 60) main.reply(sender, "Прошло больше " + strminutes + " минут: платеж отменяется") main.reply_main_menu_buttons(sender, last_sender_message) return "time exceed" except Exception: logging.error(helper.PrintException()) main.reply(sender, "Произошла непредвиденная ошибка, попробуйте позднее") main.reply_main_menu_buttons(sender, last_sender_message) return "fail"
def reply_card2cash_history(sender, last_sender_message): main.reply_typing_on(sender) if main.check_login(sender, last_sender_message): try: main.reply_typing_on(sender) url_history = url + portal_id + '/payment/?pageSize=30&pageNumber=0&result=success&portalType=web' headers = { 'Content-Type': 'application/x-www-form-urlencoded', 'X-Channel-Id': x_channel_id, 'X-IV-Authorization': 'Identifier ' + last_sender_message['mobileNumber'] } r = requests.get(url_history, headers=headers) history_items = r.json()['items'] card2cash_items = [] for h in history_items: if h['paymentId'] == 'MoneyTransfer_KazPost_Card2Cash': amount = str(h['amount'] // 100) card_title = h['src']['title'][-4:] desc_length = 20 - 2 - len( amount ) - 4 # 20 - button title limit, 2 - for > and :, 4 - last 4 digits description = h['description'][:desc_length] title = card_title + '>' + description + ':' + amount item = {'title': title, 'token': h['token']} card2cash_items.append(item) elements = [] buttons = [] count = 0 if len(card2cash_items) == 0: main.reply( sender, 'Пожалуйста, инициируйте операцию по переводу на руки на портале transfer.post.kz\n' 'Данная функция предназначена только для повторных операций' ) return for i in card2cash_items: if count > 0 and count % 3 == 0: elements.append({ 'title': 'Выберите перевод (Карта>Кому:Сумма)', 'buttons': buttons }) buttons = [] buttons.append({ "type": "postback", "title": i['title'], "payload": i['token'] }) count += 1 elements.append({ 'title': 'Выберите перевод (Карта>Кому:Сумма)', 'buttons': buttons }) data_items_buttons = { "recipient": { "id": sender }, "message": { "attachment": { "type": "template", "payload": { "template_type": "generic", "elements": elements } } } } requests.post(fb_url, json=data_items_buttons) last_sender_message['payload'] = 'card2cash' main.mongo_update_record(last_sender_message) except: logging.error(helper.PrintException())
def reply_astanaErc_startPayment(sender, message, last_sender_message): if not helper.check_csc(message): main.reply( sender, "Вы неправильно ввели трёхзначный код CSC/CVV2 на обратной стороне карты, введите заново" ) return "ok" main.reply(sender, "Идет обработка платежа...") main.reply_typing_on(sender) # 1 - авторизация на post.kz try: session = main.get_authorized_session( last_sender_message['encodedLoginPass']) mobileNumber = last_sender_message['mobileNumber'] token = main.get_token_postkz(session, mobileNumber) invoiceData = get_komuslugi_invoice(last_sender_message) invoiceData['systemId'] = 'POSTKZ' invoiceData['token'] = token invoiceData['invoiceId'] = invoiceData['id'] c = 0 for i in invoiceData['details']: invoiceData['details'][c]['amount'] = math.ceil( invoiceData['details'][c]['amount']) c += 1 # 5 - createPayment url_login5 = 'https://post.kz/mail-app/api/v2/payments/create' r = session.post(url_login5, json=invoiceData) payment_id = r.json()['paymentData']['id'] # 6 - вызов getCards() url_login6 = 'https://post.kz/mail-app/api/intervale/card?device=mobile' sd2 = { "blockedAmount": "", "phone": mobileNumber, "paymentId": "", "returnUrl": "", "transferId": "" } r = session.post(url_login6, json=sd2) card = r.json()[last_sender_message['chosenCardIndex']] sd2 = {} sd2['phone'] = mobileNumber sd2['paymentId'] = payment_id sd2['cardId'] = card['id'] sd2['csc'] = message sd2['token'] = token sd2['returnUrl'] = 'https://post.kz/static/return.html' # 7 - вызов startPayment() url_login7 = 'https://post.kz/mail-app/api/intervale/payment/start/' + token r = session.post(url_login7, json=sd2) # 8 - вызов statusPayment() url_login8 = 'https://post.kz/mail-app/api/intervale/payment/status/' + token sd22 = {} sd22['phone'] = mobileNumber sd22['paymentId'] = payment_id r = session.post(url_login8, json=sd22) # 9 - вызов acceptPayment() url_login9 = 'https://post.kz/mail-app/api/intervale/payment/accept/' + token r = session.post(url_login9, json=sd2) # 10 - вызов statusPayment() url_login10 = 'https://post.kz/mail-app/api/intervale/payment/status/' + token r = session.post(url_login10, json=sd22) data = r.json() if data['state'] == 'redirect': main.reply_send_redirect_url(sender, data['url']) time.sleep(5) timer = 0 while timer < main.timeout: time.sleep(1) r = session.post(url_login10, json=sd22) data = r.json() if data['state'] == 'result': result_status = data['result']['status'] if result_status == 'fail': main.reply( sender, "Платеж не был завершен успешно. Попробуйте снова") elif result_status == 'success': res = "Поздравляю! Платеж был проведен успешно, квитанция счёта Астана ЕРЦ " + \ last_sender_message['astanaErc_last_acc'] + " оплачена на сумму " + str(amount) + " тг.\n" res += "Номер квитанции: " + str(payment_id) res += ", она доступна на post.kz в разделе История платежей" main.reply(sender, res) last_sender_message['payload'] = 'astanaErc.finished' main.mongo_update_record(last_sender_message) main.reply_typing_off(sender) main.reply_main_menu_buttons(sender) return "ok" timer += 1 last_sender_message = main.mongo_get_by_sender(sender) if last_sender_message['payload'] == 'astanaErc.startPayment': strminutes = str(main.timeout // 60) main.reply( sender, "Прошло больше " + strminutes + " минут: платеж отменяется") main.reply_typing_off(sender) main.reply_main_menu_buttons(sender) last_sender_message['payload'] = 'mainMenu' main.mongo_update_record(last_sender_message) return "time exceed" except Exception as e: main.reply(sender, "Произошла непредвиденная ошибка, попробуйте позднее") main.reply_typing_off(sender) main.reply_main_menu_buttons(sender) logging.error(helper.PrintException()) return "fail"