• Добро пожаловать на сайт - Forumteam.bet !

    Что бы просматривать темы форума необходимо зарегестрироваться или войти в свой аккаунт.

    Группа в телеграме (подпишитесь, что бы не потерять нас) - ForumTeam Chat [Подписатся]
    Связь с администратором - @ftmadmin

Серый Белый Скам-бот для мобилизованных

Дэээн

Эксперт
Эксперт
Регистрация
08.02.20
TG
@@Fit001
Итак, сегодня будем скамить челов на актуальной теме - Мобилизация.

Сейчас каждый второй-третий ссытся, что его могут хапнуть прямо в общественном толкане, челы готовы платить чтобы утешиться хоть немного, так что темка актуальная.

Суть проста: нашел слив БД анонимусов, написал бота для чека введенной фамилии в списке, конечно за мани, создал канал с одним постом где написано про то, "какой бот крутой", "проверь себя, пока не поздно" и т.д. Накрутил туда ботов, чтобы вывести канал в топ. Бота делал на скорую руку.

Почему скамить, если БД слили анонимусы? Все просто - база фуфлыжная, ни одного призванного знакомого там нет, сделал выводы.
Что потребуется?
1. Питон 3.х
2. aiogram 2.x
3. PostgreSQL (чтобы делать рассылку, можно опустить данный пункт)
4. Киви, либо любая другая платежка
5. Прямые руки

Разберу бота по самым азам:

main.py
Python:
# импорт библиотек

import asyncio
import asyncpg

from aiogram import Bot, Dispatcher
from aiogram.contrib.fsm_storage.memory import MemoryStorage

# импорт конфига из файла .env
from tgbot.config import load_config

# импорт хендлеров и мидлварей
from tgbot.middlewares.db import DbMiddleware
from tgbot.handlers.command_start import register_command_start
from tgbot.handlers.update_callback import register_update_callback
from tgbot.handlers.enter_name import register_enter_name


# регаем мидлвари (для нашей БД юзеров)
def register_all_middlewares(dp, pool):
    dp.middleware.setup(DbMiddleware(pool))

# регаем хендлеры
def register_all_handlers(dp):
    register_command_start(dp)
    register_update_callback(dp)
    register_enter_name(dp)
    
# запуск бота
async def main():
    # загружаем конфиг
    config = load_config('.env')
    
    # создаем пул для юзер БД
    pool = await asyncpg.create_pool(dsn=config.db.dsn)
    
    # создаем память, бота и диспетчер
    storage = MemoryStorage()
    bot = Bot(token=config.bot.token, parse_mode=config.bot.parse_mode)
    dp = Dispatcher(bot, storage=storage)

    # регистрация хендлеров
    register_all_middlewares(dp, pool=pool)
    register_all_handlers(dp)
    bot.config = config

    try:
        # запуск
        await asyncio.gather(
            dp.start_polling()
        )
    finally:
        await bot.session.close()


if __name__ == '__main__':
    try:
        asyncio.run(main())
    except (KeyboardInterrupt, SystemExit):
        print('Bot stopped!')

Команда /start в боте
Python:
from aiogram import Dispatcher
from aiogram.types import Message
from aiogram.dispatcher import FSMContext

from tgbot.dialogs.root import in_state # импорт перенаправления в диалоговое окно
from tgbot.states.State import State # импорт всех состояний
from tgbot.services.repository import Repo # импорт класса для работы с юзер БД

# хендлер срабатывает при команде /start
async def welcome(message: Message, repo: Repo, state: FSMContext):
    # регаем юзера в БД, если его нет
    if not (await repo.get_user(message.from_user.id)):
        await repo.add_user(message.from_user.id)
    
    # если у юзера есть активное состояние, то сбрасываем его
    if not (await state.get_state() is None):
        await state.finish()
        
     # устанавливаем состояние
    await State.menu.main.set()
    
    # перенаправление в диалог соответсвующего состояния
    await in_state(
        state=state, # состояния
        message=message, # сообщение
        repo=repo, # репозиторий БД
        edit=False # не редектировать сообщение, отправить новое
    )


# регистрация хендлера

def register_command_start(dp: Dispatcher):
    dp.register_message_handler(welcome, commands=["start"], state='*')


Что происходит? После ввода команды старт записываем user_id в БД, сбрасываем все состояния если таковы имеются, присваиваем новое состояние, отправляем соответсвующий диалог функцией in_state.

После команды /start юзеру отправляется диалог
Python:
from tgbot.dialogs.dialog import dialog, migrate[/LEFT][/SIZE]
[LEFT][SIZE=5]from tgbot.keyboards.keyboard import keyboard

from tgbot.states.State import State


async def menu(message, state, repo, edit):
    await state.reset_data() # сбрасываем все записанные данные в состоянии (введенная фамилия, счет и т.д.)
    title = ' 21 сентября 2022 года В. В. Путин объявил о частичной мобилизации в РФ'
    text = [
        "Мы смогли достать слитую базу данных на 305 тысяч мужчин, предположительно которых должны мобилизовать в близжайшее время.\n",
        '<b>Мы не даём 100% гарантий</b> актуальности это базы данных, но некоторых из мужчин, которые есть в БД уже призвали. Сервис разработан создателями <b><a href="https://eyeofgod.live/">Глаза Бога</a></b>\n',
        " <b>Канал</b> - @rus_mobilization\n",
        " Нажмите кнопку ниже и введите свою фамилию, чтобы узнать есть ли Вы в базе данных!"
    ]

    markup = await keyboard.main_menu.main() # создаем клавиатуру
    
    # отправляем диалог
    await dialog(message, edit=edit, text=text, markup=markup, title=title, image=None)


# регистрация и проверка диалога по состоянию
async def dialog_menu(state, message, current_state, repo, edit: bool=True):
    if current_state == State.menu.main.state:
        await menu(message, state, repo, edit)


Вот такое сообщение мы получаем при вводе команды /start
1665146185775.png

Далее после нажатии кнопки, юзер попадает в следующий диалог:
1665146215834.png

После ввода фамилии юзера выкидывает в диалог оплаты счета:

1665146252442.png

Python:
async def enter(message: Message, repo: Repo, state: FSMContext):[/LEFT][/SIZE]
[LEFT][SIZE=5]    # записываем данные в состояние
    await state.update_data(name=message.text.upper(), result=[])
    await message.delete()
    
    # проверяем чтобы в поиске было только одно слово - фамилия
    if len(message.text.split()) > 1:
        await message.answer('Нужно вводить только фамилию!')
        return False
    
    # присваиваем состояние
    await State.menu.preresult.set()
    
    # запускаем функцию для проверки фамилии в слитой БД
    message = await message.answer(' Проверяем базу данных...')
    await get_names(message, repo, state)


async def get_names(message, repo, state):
    async with state.proxy() as data:
        
        # читаем слитую БД
        with open('data.txt') as file:
            
            # проверяем соответствие фамилий в списке
            lines = file.read().split('\n')
            for line in lines:
                name = line.split()
                try:
                    if name[0] == data['name']:
                        data['result'].append(line)
                except:
                    pass
    
    # отправляем диалог с оплатой
    await in_state(
        state=state,
        message=message,
        repo=repo,
        edit=True
    )
После оплаты юзер получает все данные в очередном порядке.
Из собсетвенного опыта могу сказать, что бот за 3 дня принес мне около ~1500 рублей, цену изначально ставил 99 рублей, потом шёл на понижение аргументируя это некой акцией.



1665146345873.png

Пример этого бота - КЛИК
Исходный преокт - КЛИК

Всем больших профитов !
Мои темы не являются призывающим кого-либо к каким-либо действиям. Все темы публикуются категорически для ознакомительных целей.


Схемы, мануалы, СИ, безопасность и анонимность, всё это в нашем канале
https://t.me/perehodnicResidentEvil
 
Telegram
@Fit001
Сверху Снизу