Просто оффтопик о скамере, который создал расширение XSS против скамеров 
Месяц назад мой заказчик бинанс чекера написал мне, что AGN заскамил его на Binance чекер без капчи (под спойлер закинул код, который он ему продал):
AGN активничал на форуме и не создавал впечатление скамера, поэтому я решил написать ему в шуточно-уважительном стиле:
Что сделал бы человек, который ничего не знает об этой ситуации? Ответил, наверное. Он - нет)
Спустя время он создал статью "[JS] ScammerController | Расширение для xss.pro с детектом СКАМЕРОВ!" и случайно напомнил мне об этой ситуации, поэтому я решил написать еще раз (конечно, я не ожидал что он признается, просто хотел посмотреть на его ответы):
Это был далеко не первый человек которого он заскамил, если верить моему заказчику:
Мораль истории: никому не верьте
Месяц назад мой заказчик бинанс чекера написал мне, что AGN заскамил его на Binance чекер без капчи (под спойлер закинул код, который он ему продал):
Python:
import tkinter as tk
from tkinter import filedialog, messagebox, ttk
import asyncio
import aiohttp
import random
# Asynchronous function to check a single phone number
async def check_phone_binance(session, phone_number, country_code, proxy=None):
url = "https://www.binance.com/bapi/accounts/v1/public/authcenter/verify-phone"
headers = {"Content-Type": "application/json"}
formatted_phone = f"+{country_code}{phone_number}" if not phone_number.startswith("+") else phone_number
data = {"phone": formatted_phone, "countryCode": country_code, "type": "1"}
proxy = f"http://{proxy}" if proxy else None
try:
async with session.post(url, json=data, headers=headers, proxy=proxy, timeout=10) as response:
if response.status != 200:
raise Exception(f"HTTP Error {response.status}: {await response.text()}")
result = await response.json()
if result.get("success"):
return phone_number, "Exists"
return phone_number, result.get("msg", "Unknown error")
except aiohttp.ClientProxyConnectionError:
return phone_number, "Proxy Error"
except aiohttp.ClientConnectionError:
return phone_number, "Network Error"
except aiohttp.ClientResponseError as e:
return phone_number, f"HTTP Error: {e.status}"
except Exception as e:
return phone_number, f"Unknown Error: {e}"
# Main asynchronous function to handle checking
async def check_numbers(file_path, country_code, proxies, max_connections, update_progress):
with open(file_path, "r") as file:
phone_numbers = [line.strip() for line in file.readlines()]
results = []
proxy_errors = []
phone_errors = []
network_errors = []
unknown_errors = []
connector = aiohttp.TCPConnector(limit=max_connections)
async with aiohttp.ClientSession(connector=connector) as session:
tasks = []
for idx, phone in enumerate(phone_numbers):
proxy = random.choice(proxies) if proxies else None
tasks.append(check_phone_binance(session, phone, country_code, proxy))
# Update progress every 100 tasks
if len(tasks) % 100 == 0:
update_progress(idx + 1, len(phone_numbers))
# Process all tasks
for idx, result in enumerate(await asyncio.gather(*tasks)):
phone_number, status = result
if status == "Exists":
results.append(f"{phone_number}: Exists")
elif status == "Proxy Error":
proxy_errors.append(phone_number)
elif status == "Network Error":
network_errors.append(phone_number)
elif "HTTP Error" in status:
phone_errors.append(f"{phone_number}: {status}")
else:
unknown_errors.append(f"{phone_number}: {status}")
update_progress(idx + 1, len(phone_numbers))
# Save results and errors to files
with open("results.txt", "w") as result_file:
result_file.write("\n".join(results))
if proxy_errors:
with open("proxy_errors.txt", "w") as proxy_file:
proxy_file.write("\n".join(proxy_errors))
if phone_errors:
with open("phone_errors.txt", "w") as phone_file:
phone_file.write("\n".join(phone_errors))
if network_errors:
with open("network_errors.txt", "w") as network_file:
network_file.write("\n".join(network_errors))
if unknown_errors:
with open("unknown_errors.txt", "w") as unknown_file:
unknown_file.write("\n".join(unknown_errors))
return len(results)
# Function to start the checking process
def start_checking():
file_path = file_label.cget("text")
proxy_path = proxy_label.cget("text")
country_code = geo_entry.get()
max_connections = int(thread_entry.get())
if not file_path or file_path == "No file selected":
messagebox.showerror("Error", "Please select a file with phone numbers!")
return
if not country_code and not all([line.startswith("+") for line in open(file_path).readlines()]):
messagebox.showerror("Error", "Please specify the country code or ensure all numbers include the '+' prefix!")
return
proxies = []
if proxy_path and proxy_path != "No proxy file selected":
try:
with open(proxy_path, "r") as proxy_file:
proxies = [line.strip() for line in proxy_file.readlines()]
except Exception as e:
messagebox.showerror("Error", f"Failed to load proxy file: {e}")
return
# Update progress callback
def update_progress(current, total):
progress_bar["maximum"] = total
progress_bar["value"] = current
progress_label.config(text=f"{int((current / total) * 100)}%")
root.update_idletasks()
# Run the asynchronous function
async def run_check():
try:
total_checked = await check_numbers(file_path, country_code, proxies, max_connections, update_progress)
messagebox.showinfo("Done", f"Check completed. {total_checked} numbers processed. Results are saved in results.txt.")
except Exception as e:
messagebox.showerror("Error", f"An error occurred: {e}")
asyncio.run(run_check())
# Function to select the file with phone numbers
def select_file():
file_path = filedialog.askopenfilename(filetypes=[("Text files", "*.txt")])
if file_path:
file_label.config(text=file_path)
# Function to select the proxy file
def select_proxy_file():
proxy_path = filedialog.askopenfilename(filetypes=[("Text files", "*.txt")])
if proxy_path:
proxy_label.config(text=proxy_path)
# Create the main window
root = tk.Tk()
root.title("Binance Phone Checker with AsyncIO")
root.geometry("400x600")
# Label for the phone numbers file
file_label = tk.Label(root, text="No file selected", wraplength=300)
file_label.pack(pady=10)
# Button to select the phone numbers file
file_button = tk.Button(root, text="Select Phone Numbers File", command=select_file)
file_button.pack(pady=5)
# Label for the proxy file
proxy_label = tk.Label(root, text="No proxy file selected", wraplength=300)
proxy_label.pack(pady=10)
# Button to select the proxy file
proxy_button = tk.Button(root, text="Select Proxy File", command=select_proxy_file)
proxy_button.pack(pady=5)
# Input for country code
geo_label = tk.Label(root, text="Enter country code (e.g., RU):")
geo_label.pack(pady=5)
geo_entry = tk.Entry(root)
geo_entry.pack(pady=5)
# Input for number of threads
thread_label = tk.Label(root, text="Enter max connections (e.g., 500):")
thread_label.pack(pady=5)
thread_entry = tk.Entry(root)
thread_entry.insert(0, "500")
thread_entry.pack(pady=5)
# Progress bar
progress_bar = ttk.Progressbar(root, orient="horizontal", length=300, mode="determinate")
progress_bar.pack(pady=10)
# Progress percentage label
progress_label = tk.Label(root, text="0%")
progress_label.pack()
# Button to start checking
start_button = tk.Button(root, text="Start Checking", command=start_checking)
start_button.pack(pady=20)
# Run the GUI
root.mainloop()
AGN активничал на форуме и не создавал впечатление скамера, поэтому я решил написать ему в шуточно-уважительном стиле:
Что сделал бы человек, который ничего не знает об этой ситуации? Ответил, наверное. Он - нет)
Спустя время он создал статью "[JS] ScammerController | Расширение для xss.pro с детектом СКАМЕРОВ!" и случайно напомнил мне об этой ситуации, поэтому я решил написать еще раз (конечно, я не ожидал что он признается, просто хотел посмотреть на его ответы):
Это был далеко не первый человек которого он заскамил, если верить моему заказчику:
Мораль истории: никому не верьте
Я думал написать админу, но было недостаточно доказательств.
Мой заказчик создавал арбитраж, но его за что-то забанили.
Мой заказчик создавал арбитраж, но его за что-то забанили.