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 check_login_and_cards(sender, last_sender_message): try: encodedLoginPass = last_sender_message['encodedLoginPass'] assert encodedLoginPass != None session = requests.Session() headers = { "Authorization": "Basic " + encodedLoginPass, 'Content-Type': 'application/json' } url_login = '******' r = session.get(url_login, headers=headers) assert r.status_code != 401 except: main.reply( sender, "Требуется авторизация, пожалуйста, отправьте логин и пароль профиля на post.kz через " "пробел. Если у вас нет аккаунта, то зарегистрируйтесь в https://post.kz/register" ) last_sender_message['payload'] = 'auth' main.mongo_update_record(last_sender_message) return False hasCards = main.reply_has_cards(sender, last_sender_message) if not hasCards: main.reply( sender, "У вас отсутствуют добавленные карты в post.kz. " "Чтобы добавить, введите 16ти-значный номер карты") last_sender_message['payload'] = 'addcard' main.mongo_update_record(last_sender_message) return False return True
def reply_pdd_shtrafy_iin_enter(sender, last_sender_message): pddIINs = [] try: pddIINs = last_sender_message['pddIINs'] except: last_sender_message['pddIINs'] = [] try: assert len(pddIINs) > 0 buttons = [] for iin in pddIINs: buttons.append({ "content_type": "text", "payload": "pddIIN.last", "title": iin }) buttons.append({ "content_type": "text", "payload": "pddIIN.delete", "title": "Удалить ИИН" }) data_quick_replies = { "recipient": { "id": sender }, "message": { "text": "Выберите ИИН или введите его\n" + hint_main_menu, "quick_replies": buttons } } requests.post(fb_url, json=data_quick_replies) except: main.reply(sender, "Введите 12-ти значный ИИН\n" + hint_main_menu) last_sender_message['payload'] = '4.IIN' main.mongo_update_record(last_sender_message)
def reply_card2card_amount(sender, message, last_sender_message, is_voice=None): added_text = '' if is_voice: added_text = 'Вы продиктовали сумму ' + message + '.\n' amount = 0 minAmount = 500 maxAmount = 494070 try: amount = int(message) except: main.reply(sender, added_text + "Вы неправильно ввели сумму перевода. Введите сумму заново") return "again" if amount < minAmount: main.reply(sender, added_text + "Сумма перевода должна быть не менее " + str(minAmount) + " тг. Введите сумму заново") return "again" if amount > maxAmount: main.reply(sender, added_text + "Сумма перевода должна быть не более " + str(maxAmount) + " тг. Введите сумму заново") return "again" if is_voice: main.reply_just_text(sender, added_text) last_sender_message['payload'] = 'card2card.chooseCard' last_sender_message['amount'] = amount main.mongo_update_record(last_sender_message) main.reply_display_cards(sender, last_sender_message)
def reply_tracking(sender, tracking_number, last_sender_message): tracking_number = tracking_number.upper() data = requests.get("https://post.kz/external-api/tracking/api/v2/" + tracking_number + "/events").json() data2 = requests.get("https://post.kz/external-api/tracking/api/v2/" + tracking_number).json() try: error = data2['error'] main.reply( sender, error + '\n(Чтобы узнать статус другой посылки, отправьте её трек-номер либо нажмите (y) для перехода в главное меню)' ) return "not found" except: new_mapping = requests.get( "https://post.kz/static/new_mappings.json").json() t_date = data['events'][0]['date'] t_time = data['events'][0]['activity'][0]['time'] t_datetime = t_date + " " + t_time t_status = data['events'][0]['activity'][0]['status'][0] t_address = data2['last']['address'] t_status_mapping = new_mapping[t_status]['mapping'] result = "Информация об отправлении " + tracking_number + '\n' result += "Статус: " + t_status_mapping + '\n' + t_address + '\n' + t_datetime + '\n' result += "(Чтобы узнать статус другой посылки, выберите или отправьте её трек-номер " \ "либо нажмите (y) для перехода в главное меню)" + '\n' if not tracking_number in last_sender_message['trackingNumbers'] and \ len(last_sender_message['trackingNumbers']) < 10: last_sender_message['trackingNumbers'].append(tracking_number) reply_tracking_quick_replies_with_delete( sender, last_sender_message['trackingNumbers'], result) main.mongo_update_record(last_sender_message) return "ok"
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_mobile_amount(sender, message, last_sender_message, is_voice=None): added_text = '' if is_voice: added_text = 'Вы продиктовали сумму ' + message + '.\n' amount = 0 minAmount = last_sender_message['minAmount'] try: amount = int(message) except: main.reply(sender, added_text + "Вы неправильно ввели сумму пополнения баланса. Введите сумму заново") return "again" if amount < minAmount: main.reply(sender, added_text + "Сумма пополнения баланса должна быть не менее " + str(minAmount) + " тг. Введите сумму заново") return "again" if is_voice: main.reply_just_text(sender, added_text) main.reply_display_cards(sender, last_sender_message) operator = last_sender_message['mobileOperator'] commission = 0 if operator == 'Activ' or operator == 'Kcell': commission = amount / 10 if commission > 70: commission = 70 elif operator == 'Tele2' or operator == 'Beeline': commission = 50 last_sender_message['commission'] = commission last_sender_message['payload'] = 'mobile.chooseCard' last_sender_message['amount'] = amount main.mongo_update_record(last_sender_message)
def reply_card2card_enter_cardDst(sender, last_sender_message): if main.check_login(sender, last_sender_message): try: cardDsts = last_sender_message['cardDsts'] assert len(cardDsts) > 0 buttons = [] for card in cardDsts: card = helper.insert_4_spaces(card) buttons.append({"content_type": "text", "payload": "card2card.last", "title": card}) buttons.append({"content_type": "text", "payload": "card2card.delete", "title": "Удалить карту"}) buttons.append({"content_type": "text", "payload": "card2card.info", "title": "Информация"}) data_quick_replies = { "recipient": {"id": sender}, "message": { "text": "Выберите номер карты получателя или введите его\n" + hint_main_menu, "quick_replies": buttons } } requests.post(fb_url, json=data_quick_replies) except: main.reply(sender, card2card_info + "\n\nВведите 16ти-значный номер карты, на который Вы хотите перевести деньги\n" + hint_main_menu) last_sender_message['lastCommand'] = 'card2card' last_sender_message['payload'] = 'card2card' main.mongo_update_record(last_sender_message)
def call_addcard(sender, last_sender_message, payload): if main.check_login(sender, last_sender_message): addcard.reply_addcard_entercard(sender, last_sender_message) last_sender_message['payload'] = payload main.mongo_update_record(last_sender_message) return True return False
def reply_pdd_shtrafy_gosnomer_delete_gosnomer(sender, text, last_sender_message): last_sender_message['pddGosnomers'].remove(text) main.reply(sender, "Авто " + text + " успешно удалён") reply_pdd_shtrafy_gosnomer_enter(sender, last_sender_message) last_sender_message['payload'] = '4.GosNomer' main.mongo_update_record(last_sender_message)
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_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_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 reply_tracking_enter_number(sender, last_sender_message): if not 'trackingNumbers' in last_sender_message: last_sender_message['trackingNumbers'] = [] trackingNumbers = last_sender_message['trackingNumbers'] if len(trackingNumbers) > 0: text = "Выберите трек-номер или введите его\n" + hint_main_menu reply_tracking_quick_replies_with_delete(sender, trackingNumbers, text) else: main.reply(sender, "Введите трек-номер посылки\n" + hint_main_menu) last_sender_message['payload'] = 'tracking' main.mongo_update_record(last_sender_message)
def reply_addcard_checkcardowner(sender, message, last_sender_message): last_sender_message['addcard_cardowner'] = message res = 'Проверьте данные:\n' res += 'Номер карты: ' + helper.insert_4_spaces( last_sender_message['addcard_cardnumber']) + '\n' res += 'Срок действия: ' + last_sender_message['addcard_expiredate'][:2] + '/' + \ last_sender_message['addcard_expiredate'][2:] + '\n' res += 'Имя на карте: ' + last_sender_message['addcard_cardowner'] + '\n' res += '\nЕсли всё верно, введите трехзначный код CSC/CVV2 на обратной стороне карты, чтобы добавить эту карту' last_sender_message['payload'] = 'addcard.csc' main.mongo_update_record(last_sender_message) main.reply(sender, res)
def reply_addcard_checkcard(sender, message, last_sender_message): message = message.replace(' ', '') if len(message) != 16: main.reply(sender, "Вы ввели не все 16 цифр карты, попробуйте ещё раз") return "addcard.again" if not helper.isAllDigits(message): main.reply( sender, "Некоторые введенные Вами цифры не являются цифрами, попробуйте ещё раз" ) return "addcard.again" last_sender_message['addcard_cardnumber'] = message last_sender_message['payload'] = 'addcard.expiredate' main.mongo_update_record(last_sender_message) main.reply( sender, "Введите месяц и год срока действия карты (например, 0418)\n" + hint_main_menu)
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 reply_astanaErc_enter(sender, last_sender_message): astanaErc_accounts = [] try: astanaErc_accounts = last_sender_message['astanaErc_accounts'] except: last_sender_message['astanaErc_accounts'] = [] try: assert len(astanaErc_accounts) > 0 buttons = [] for acc in astanaErc_accounts: buttons.append({ "content_type": "text", "payload": "astanaErc.last", "title": acc }) buttons.append({ "content_type": "text", "payload": "astanaErc.delete", "title": "Удалить лицевой счёт" }) data_quick_replies = { "recipient": { "id": sender }, "message": { "text": "Выберите номер лицевого счёта Астана ЕРЦ или введите его\n" + main.hint_main_menu, "quick_replies": buttons } } requests.post(fb_url, json=data_quick_replies) except: main.reply( sender, "Введите номер лицевого счёта Астана ЕРЦ\n" + main.hint_main_menu) last_sender_message['payload'] = 'astanaErc.enter' main.mongo_update_record(last_sender_message)
def handle_messages_when_deactivated(sender, data, last_sender_message): try: sticker_id = data['entry'][0]['messaging'][0]['message']['sticker_id'] data_quick_replies = { "recipient": { "id": sender }, "message": { "text": "Вы хотите включить бота?", "quick_replies": [{ "content_type": "text", "title": "Да, включить бота", "payload": "activate.bot" }, { "content_type": "text", "title": "Нет", "payload": "deactivate.bot" }] } } requests.post(fb_url, json=data_quick_replies) return except: pass try: payload = data['entry'][0]['messaging'][0]['message']['quick_reply'][ 'payload'] if payload == 'activate.bot': last_sender_message['isBotActive'] = True main.mongo_update_record(last_sender_message) main.reply(sender, "Бот включен") main.reply_main_menu_buttons(sender, last_sender_message) if payload == 'deactivate.bot': main.reply( sender, "Хорошо! Если Вы хотите включить бота, нажмите кнопку (y)") except: return
def call_disable_bot(sender, last_sender_message, payload): data_quick_replies = { "recipient": { "id": sender }, "message": { "text": "Вы хотите отключить бота?", "quick_replies": [{ "content_type": "text", "title": "Да, отключить бота", "payload": "disable.bot.yes" }, { "content_type": "text", "title": "Нет", "payload": "disable.bot.no" }] } } requests.post(fb_url, json=data_quick_replies) last_sender_message['payload'] = payload main.mongo_update_record(last_sender_message)
def reply_addcard_checkexpiredate(sender, message, last_sender_message): message = message.replace(' ', '') message = message.replace('.', '') message = message.replace('/', '') if len(message) != 4: main.reply( sender, "Вы должны ввести 4 цифры (2 на месяц, 2 на год), попробуйте ещё раз" ) return "addcard.expiredateagain" if not helper.isAllDigits(message): main.reply( sender, "Некоторые введенные Вами цифры не являются цифрами, попробуйте ещё раз" ) return "addcard.expiredateagain" last_sender_message['addcard_expiredate'] = message last_sender_message['payload'] = 'addcard.cardowner' main.mongo_update_record(last_sender_message) main.reply( sender, "Введите имя и фамилию на карте латинскими буквами\n" + hint_main_menu)
def reply_pdd_shtrafy_gosnomer_enter(sender, last_sender_message): pddGosnomers = [] try: pddGosnomers = last_sender_message['pddGosnomers'] except: last_sender_message['pddGosnomers'] = [] try: assert len(pddGosnomers) > 0 buttons = [] for gn in pddGosnomers: buttons.append({ "content_type": "text", "payload": "pddGosnomer.last", "title": gn }) buttons.append({ "content_type": "text", "payload": "pddGosnomer.delete", "title": "Удалить авто" }) data_quick_replies = { "recipient": { "id": sender }, "message": { "text": "Выберите номер авто/техпаспорт или введите из через пробел (пример: 123AAA01 AA00000000)\n" + hint_main_menu, "quick_replies": buttons } } requests.post(fb_url, json=data_quick_replies) except: main.reply(sender, gosnomer_text + "\n" + hint_main_menu) last_sender_message['payload'] = '4.GosNomer' main.mongo_update_record(last_sender_message)
def reply_mobile_enter_number(sender, last_sender_message): if main.check_login(sender, last_sender_message): phonesToRefill = last_sender_message['phonesToRefill'] if len(phonesToRefill) > 0: buttons = [] for phone in phonesToRefill: buttons.append({"content_type": "text", "payload": "mobile.last", "title": phone}) buttons.append({"content_type": "text", "payload": "mobile.delete", "title": "Удалить номер"}) data_quick_replies = { "recipient": {"id": sender}, "message": { "text": "Выберите номер телефона или введите его, либо продиктуйте номер, " "отправив голосовое сообщение\n" + hint_main_menu, "quick_replies": buttons } } requests.post(fb_url, json=data_quick_replies) else: main.reply(sender, "Введите номер телефона\n" + hint_main_menu) last_sender_message['payload'] = 'balance' main.mongo_update_record(last_sender_message)
def reply_astanaErc_delete_acc(sender, text, last_sender_message): last_sender_message['astanaErc_accounts'].remove(text) main.reply(sender, "Лицевой счёт " + text + " успешно удалён") reply_astanaErc_enter(sender, last_sender_message) last_sender_message['payload'] = 'astanaErc.enter' main.mongo_update_record(last_sender_message)
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"
def reply_mobile_delete_phone(sender, text, last_sender_message): last_sender_message['phonesToRefill'].remove(text) main.reply(sender, "Номер " + text + " успешно удалён") reply_mobile_enter_number(sender, last_sender_message) last_sender_message['payload'] = 'balance' main.mongo_update_record(last_sender_message)
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_astanaErc_chooseCard(sender, last_sender_message): main.reply_typing_on(sender) main.reply_display_cards(sender, last_sender_message) last_sender_message['lastCommand'] = 'astanaErc' main.mongo_update_record(last_sender_message)