diff --git a/.env b/.env new file mode 100644 index 0000000..241a887 --- /dev/null +++ b/.env @@ -0,0 +1,3 @@ +ADMIN_ID=776149633 +BOT_TOKEN=1491703059:AAEIkkEyx9bB2WxmGdYA2bcXf7eu7h1h_cA +ip=localhost \ No newline at end of file diff --git a/.env.dist b/.env.dist deleted file mode 100644 index f42c367..0000000 --- a/.env.dist +++ /dev/null @@ -1,3 +0,0 @@ -ADMIN_ID=12345678 -BOT_TOKEN=123452345243:Asdfasdfasf -ip=localhost \ No newline at end of file diff --git a/app.py b/app.py index 08f8cf4..4f54d85 100644 --- a/app.py +++ b/app.py @@ -1,3 +1,7 @@ + +from loader import db +#from utils.set_bot_commands import set_default_commands + async def on_startup(dp): import filters import middlewares @@ -5,9 +9,16 @@ async def on_startup(dp): middlewares.setup(dp) from utils.notify_admins import on_startup_notify - await on_startup_notify(dp) + try: + db.create_table_users() + except Exception as e: + print(e) + db.delete_users() + await on_startup_notify(dp) + #await set_default_commands(dp) + if __name__ == '__main__': from aiogram import executor from handlers import dp diff --git a/data/main.db b/data/main.db new file mode 100644 index 0000000..43a8575 Binary files /dev/null and b/data/main.db differ diff --git a/handlers/users/__init__.py b/handlers/users/__init__.py index 4f3c9f7..bef86a1 100644 --- a/handlers/users/__init__.py +++ b/handlers/users/__init__.py @@ -1,5 +1,6 @@ from .help import dp from .start import dp +from .body import dp from .echo import dp __all__ = ["dp"] diff --git a/handlers/users/body.py b/handlers/users/body.py new file mode 100644 index 0000000..fececbf --- /dev/null +++ b/handlers/users/body.py @@ -0,0 +1,174 @@ +import logging + + + +import asyncio + +from aiogram.types import InputFile +from aiogram.utils.callback_data import CallbackData +from aiogram.dispatcher.filters import Command +from aiogram.dispatcher import FSMContext +from aiogram.types import Message, CallbackQuery +from aiogram.types import ContentType, Message + +from photos import * +from photos.credit_image import * +from keyboards.inline.callback_buttom import * + +from loader import dp, bot + + + + +@dp.message_handler(text='🛸Поделиться с другом') +async def send_friends(message: Message): + await message.answer('Жми на "Поделиться ботом" 👇', reply_markup=send_bot) + + +@dp.message_handler(text="🏪Подобрать банк") +async def found_bank(message: Message): + photo = InputFile(path_or_bytesio="photos/loading1.jpg") + await bot.send_photo(chat_id=message.from_user.id, photo=photo, caption=(f"Приступаю к поиску ")) + + await asyncio.sleep(3) + + photo1 = InputFile(path_or_bytesio="photos/loading2.jpg") + await bot.send_photo(chat_id=message.from_user.id, photo=photo1, caption=(f"Поиск успешно выполнен!\n" + f"Мне было очень сложно найти банки с хорошими условиями\n" + f"которые могут продолжать свою работу во время кризиса! \n" + f"Поэтому если тебе нужны деньги срочно\n" + f"советую тебе заполнить анкеты во всех банках"), reply_markup=show_search) + +@dp.message_handler(text='👑Популяриные предложения') +async def popular_value(message: Message): + await message.answer("Выбери подходящее предложение👇🏻", reply_markup=popular_menu) + + +# ВНИЗУ БУДЕ КРЕДИТНЕ МЕНЮ +@dp.callback_query_handler(text="show_credit") +async def firs_catalog(call: CallbackQuery): + photo2 = InputFile(path_or_bytesio="photos/credit_image/Miloan.jpg") + await call.message.reply_photo(photo=photo2, caption=("Miloan - При помощи нашего сервиса, каждый желающий\n" + "может получить кредит прямо на свою банковскую карту и \n" + "всего за 15 минут. Первый кредит бесплатно (под 0,01%). Сумма\n" + "первого займа – до 15000 гривен.\n" + "Подробнее👈\n\n" + "Условия:\n" + "• Сумма займа: Первый займ – до 15000 гривен\n" + "• Срок займа: до 30 дней\n" + "• Скидки на повторные кредиты\n\n" + "Требование к заёмщику:\n" + "• Возраст: от 18 до 65 лет\n" + "• Гражданство Украины\n" + "• Наличие действующей банковской карты любого украинского банка\n" + "• Отсутствие просрочек по кредитам" + ), reply_markup=first_klick) + + +@dp.callback_query_handler(text="give_next") +async def second_catalog(call: CallbackQuery): + photo3 = InputFile(path_or_bytesio="photos/credit_image/bistro_dengi.jpg") + await call.message.reply_photo(photo=photo3, caption=("ШвидкоГроші - лидер украинского рынка моментального\n" + "кредитования. Компания предоставляет моментальные \n" + "кредиты ОНЛАЙН и наличными до 5000 грн. без залога, справок и\n" + "поручителей.\n" + "Подробнее👈\n\n" + "Условия:\n" + "• Сумма займа: от 600 до 10 000 грн.\n" + "• Для повторных клиентов - до 20 000 грн. под 1%\n" + "• Сроки пользования кредитом можно продлевать, при оплате процентов за пользование\n\n" + "Требование к заёмщику:\n" + "• Возраст: от 18 до 60 лет\n" + "• Гражданство Украины\n" + "• Наличие у клиента постоянного трудового дохода (может работать неофициально)" + ), reply_markup=second_menu) + + +@dp.callback_query_handler(text="next_variant") +async def gotovka_catalog(call: CallbackQuery): + photo3 = InputFile(path_or_bytesio="photos/credit_image/credit1.jpg") + await call.message.reply_photo(photo=photo3, caption=("Ваша Готивочка - Главной составляющей системы \n" + "кредитования 'Ваша Готівочка' является удобство! \n" + "Мы предлагаем простые и понятные условия займа.\n" + + "Подробнее👈\n\n" + "Условия:\n" + "• Сумма займа: от 200 до 9000 грн.\n" + "• Время рассмотрения заявки – 15 мин.\n" + "• Без справки о доходах\n\n" + + "Преимущества.\n" + "не просим клиента ксерокопию документов или фото документов\n" + "не просим клиента фото с паспортом или банковской картой\n" + "не просим клиента указывать аккаунт в социальной сети\n" + "не просим у клиента справку о доходах\n" + "не просим клиента телефон родственника\n\n" + + "Требование к заёмщику:\n" + "• Возраст: от 18 до 60 лет\n" + "• Гражданство Украины\n" + "• наличие банковской карты (для перечисления кредитных средств) и мобильного телефона" + ), reply_markup=there_menu) + + + +@dp.callback_query_handler(text="gotivochka3") +async def credit_plus(call: CallbackQuery): + photo3 = InputFile(path_or_bytesio="photos/credit_image/credit2.jpg") + await call.message.reply_photo(photo=photo3, caption=("CreditPlus - Мы являемся обществом со 100% иностранным \n" + "капиталом. Благодаря этому ведем ответственный бизнес в\n" + "Украине, который включает набор обязательных целей и \n" + "гарантий для всех заинтересованных сторон.\n" + "Подробнее👈\n\n" + "Условия:\n" + "• Сумма займа: до 15 000 грн.\n" + "• Время рассмотрения заявки – до 7 минут\n" + "• Без справки о доходах\n\n" + "Требование к заёмщику:\n" + "• Возраст: от 18 до 55 лет\n" + "• Гражданство Украины\n" + "• наличие банковской карты (для перечисления кредитных средств) и мобильного телефона" + ), reply_markup=foo_menu) + + + +@dp.callback_query_handler(text="crediplus") +async def evro_groshi(call: CallbackData): + photo4 = InputFile(path_or_bytesio="photos/credit_image/evrogroshi.jpg") + await call.message.reply_photo(photo=photo4, caption=( + 'Eurogroshi - При помощи нашего сервиса, каждый желающий \n' + 'может получить кредит прямо на свою банковскую карту и \n' + 'всего за 15 минут\n' + 'Подробнее👈\n\n' + 'Условия:\n' + '• Сумма первого займа: до 4500 грн.\n' + '• Срок займа: до 30 дней\n' + '• Скидки на повторные кредиты\n\n' + "Требование к заёмщику:\n" + '• Возраст: от 18 лет\n' + '• Гражданство Украины\n' + '• Наличие действующей банковской карты любого украинского банка\n' + '• Отсутствие просрочек по кредитам\n' + ), reply_markup=five_menu) + +@dp.callback_query_handler(text="evrogroshi") +async def zecredit(call: CallbackData): + photo5 = InputFile(path_or_bytesio="photos/credit_image/zecreditor.jpg") + await call.message.reply_photo(photo=photo5, caption=( + 'Zecredit - это онлайн сервис благодаря которому наш клиент \n' + 'может получить кредит всего за считанные минуты на \n' + 'банковскую карту. Благодаря условиям конкуренции рынка т\n' 'Подробнее👈\n\n' + 'нашей компанией была выбрана стратегия программы \n' + 'лояльности для клиентов. Компания работает прозрачно, что \n' + 'формирует доверие у основного сегмента рынка.\n' + 'Подробнее👈\n\n' + 'Условия:\n' + '• Сумма первого займа: до 3000 грн.\n' + '• Срок займа: до 30 дней\n' + '• Cервис работает круглосуточно, акция 1% на первый кредит\n\n' + "Требование к заёмщику:\n" + '• Возраст: от 18 лет\n' + '• Гражданство Украины\n' + '• Наличие действующей банковской карты любого украинского банка\n' + '• Отсутствие просрочек по кредитам\n' + ), reply_markup=six_menu) diff --git a/handlers/users/start.py b/handlers/users/start.py index 54abb72..7dcba25 100644 --- a/handlers/users/start.py +++ b/handlers/users/start.py @@ -1,9 +1,75 @@ from aiogram import types +from aiogram.types import ContentType, Message + +from photos import * +from aiogram.types import InputFile +from keyboards.default.text_button import start_button, menu + +from aiogram.dispatcher import FSMContext +from aiogram.dispatcher.filters import Command, Text from aiogram.dispatcher.filters.builtin import CommandStart -from loader import dp +from loader import dp, db, bot +import sqlite3 + @dp.message_handler(CommandStart()) async def bot_start(message: types.Message): - await message.answer(f'Привет, {message.from_user.full_name}!') + name = message.from_user.full_name + try: + db.add_user(id=message.from_user.id, name=name) + except sqlite3.IntegrityError as err: + print(err) + + photo = InputFile(path_or_bytesio="photos/photo1.jpg") + await bot.send_photo(chat_id=message.from_user.id, + photo=photo, + caption=(f'Привет, {message.from_user.full_name}!\n\n' + f'Я твой финансовый бот-помошник 😊\n' + f'Я могу помочь тебе получить деньги на самых выгодных условиях под 0%!\n' + f'Для этого мне нужно задать пару вопросов.\n\n' + f'Жми на кнопку «Запустить»👇'), reply_markup=start_button) + + +@dp.message_handler(Command("data")) +async def database(message: types.Message): + count_users = db.count_users()[0] + await message.answer( + "\n".join([ + f'Привет, {message.from_user.full_name}!', + 'Ти есть в базе', + f'В базе {count_users} Пользователей', + ]) + ) + + +@dp.message_handler(text="Запустить 🚀") +async def user_old(message: types.Message, state:FSMContext): + await message.answer(f"Сколько вам лет ?\n" + f"Напиши свой возраст...") + await state.set_state("years") + + +@dp.message_handler(state="years") +async def enter_old(message: types.Message, state: FSMContext): + years = message.text + db.update_user_age(age=years, id=message.from_user.id) + + photo = InputFile(path_or_bytesio='photos/photo2.jpg') + await bot.send_photo(chat_id=message.from_user.id, + photo=photo, + caption=(f'Благодарю тебя, {message.from_user.full_name}!\n' + f'Чтобы подобрать банк, который готов дать тебе деньги\n' + f'на самых лучших условиях\n' + f'воспользуйся кнопкой "🏪Подобрать банк"' + f'Тестови данние '), reply_markup=menu) + + await state.finish() + +@dp.message_handler(text="📝Мои настройки") +async def My_setting(message: Message): + user = db.select_user(id=message.from_user.id) + await message.answer(f"Страна: Україна\n" + f"Возраст: {user}") + diff --git a/handlers/users/update_db.py b/handlers/users/update_db.py new file mode 100644 index 0000000..e69de29 diff --git a/keyboards/default/text_button.py b/keyboards/default/text_button.py new file mode 100644 index 0000000..1e51866 --- /dev/null +++ b/keyboards/default/text_button.py @@ -0,0 +1,27 @@ +from aiogram.types import ReplyKeyboardMarkup, KeyboardButton + +start_button = ReplyKeyboardMarkup( + keyboard=[ + [ + KeyboardButton(text="Запустить 🚀") + ], + ], + resize_keyboard=True, one_time_keyboard=True +) + + +menu = ReplyKeyboardMarkup( + keyboard=[ + [ + KeyboardButton(text="🏪Подобрать банк"), + KeyboardButton(text="👑Популяриные предложения") + ], + [ + KeyboardButton(text="📝Мои настройки") + ], + [ + KeyboardButton(text="🛸Поделиться с другом") + ] + ], + resize_keyboard=True +) \ No newline at end of file diff --git a/keyboards/inline/callback_buttom.py b/keyboards/inline/callback_buttom.py new file mode 100644 index 0000000..e598fa6 --- /dev/null +++ b/keyboards/inline/callback_buttom.py @@ -0,0 +1,112 @@ +from aiogram.types import InlineKeyboardButton, InlineKeyboardMarkup +from aiogram.utils.callback_data import CallbackData + +#Поделится с другом +send_bot = InlineKeyboardMarkup(inline_keyboard=[ + [ + InlineKeyboardButton(text="Поделиться ботом👍🏼", switch_inline_query=f"\n" + f"https://t.me/money_zaim_bot\n" + f"Смотри какой крутой бот 😊") + ] +]) + +show_search = InlineKeyboardMarkup(inline_keyboard=[ + [ + InlineKeyboardButton(text="🔍Показать результат поиска ", callback_data="show_credit") + ] +]) + +popular_menu = InlineKeyboardMarkup(inline_keyboard=[ + [ + InlineKeyboardButton(text="Под 0%", callback_data="crediplus") + ], + [ + InlineKeyboardButton(text="С плохой кредитной историей", callback_data="gotivochka3") + ], + [ + InlineKeyboardButton(text="Лучшие займы", callback_data="next_variant") + ], + [ + InlineKeyboardButton(text="Все варианты", callback_data="give_next") + ] +]) + + +#______________________менюшка для кредитив____________--- + +first_klick = InlineKeyboardMarkup(inline_keyboard=[ + [ + InlineKeyboardButton(text="Получить деньги", url="https://rozetka.com.ua/") + ], + [ + InlineKeyboardButton(text="Еще варианты", callback_data="give_next") + ], + +]) + +second_menu = InlineKeyboardMarkup(inline_keyboard=[ + [ + InlineKeyboardButton(text="Получить деньги", url="https://rozetka.com.ua/") + ], + [ + InlineKeyboardButton(text="Назад", callback_data="show_credit"), + InlineKeyboardButton(text="Еще варианты", callback_data="next_variant") + ], + +]) + +there_menu = InlineKeyboardMarkup(inline_keyboard=[ + [ + InlineKeyboardButton(text="Получить деньги", url="https://rozetka.com.ua/") + ], + [ + InlineKeyboardButton(text="Назад", callback_data="give_next"), + InlineKeyboardButton(text="Еще варианты", callback_data="gotivochka3") + ], + +]) + +foo_menu = InlineKeyboardMarkup(inline_keyboard=[ + [ + InlineKeyboardButton(text="Получить деньги", url="https://rozetka.com.ua/") + ], + [ + InlineKeyboardButton(text="Назад", callback_data="next_variant"), + InlineKeyboardButton(text="Еще варианты", callback_data="crediplus") + ], + +]) + +five_menu = InlineKeyboardMarkup(inline_keyboard=[ + [ + InlineKeyboardButton(text="Получить деньги", url="https://rozetka.com.ua/") + ], + [ + InlineKeyboardButton(text="Назад", callback_data="gotivochka3"), + InlineKeyboardButton(text="Еще варианты", callback_data="evrogroshi") + ], + +]) + +six_menu = InlineKeyboardMarkup(inline_keyboard=[ + [ + InlineKeyboardButton(text="Получить деньги", url="https://rozetka.com.ua/") + ], + [ + InlineKeyboardButton(text="Назад", callback_data="crediplus"), + InlineKeyboardButton(text="Еще варианты", callback_data="zeccredit") + ], + +]) + +seven_menu = InlineKeyboardMarkup(inline_keyboard=[ + [ + InlineKeyboardButton(text="Получить деньги", url="https://rozetka.com.ua/") + ], + [ + InlineKeyboardButton(text="Назад", callback_data="crediplus"), + InlineKeyboardButton(text="Еще варианты", callback_data="done") + ], + +]) + diff --git a/loader.py b/loader.py index ba42d33..6d7c720 100644 --- a/loader.py +++ b/loader.py @@ -1,8 +1,11 @@ from aiogram import Bot, Dispatcher, types from aiogram.contrib.fsm_storage.memory import MemoryStorage + from data import config +from utils.db_api.sqlite import Database bot = Bot(token=config.BOT_TOKEN, parse_mode=types.ParseMode.HTML) storage = MemoryStorage() dp = Dispatcher(bot, storage=storage) +db = Database(path_to_db="data/main.db") diff --git a/photos/credit_image/Miloan.jpg b/photos/credit_image/Miloan.jpg new file mode 100644 index 0000000..85b86d0 Binary files /dev/null and b/photos/credit_image/Miloan.jpg differ diff --git a/photos/credit_image/bistro_dengi.jpg b/photos/credit_image/bistro_dengi.jpg new file mode 100644 index 0000000..9ee1340 Binary files /dev/null and b/photos/credit_image/bistro_dengi.jpg differ diff --git a/photos/credit_image/credit1.jpg b/photos/credit_image/credit1.jpg new file mode 100644 index 0000000..f08b32b Binary files /dev/null and b/photos/credit_image/credit1.jpg differ diff --git a/photos/credit_image/credit2.jpg b/photos/credit_image/credit2.jpg new file mode 100644 index 0000000..b91a4ad Binary files /dev/null and b/photos/credit_image/credit2.jpg differ diff --git a/photos/credit_image/evrogroshi.jpg b/photos/credit_image/evrogroshi.jpg new file mode 100644 index 0000000..0ce2f45 Binary files /dev/null and b/photos/credit_image/evrogroshi.jpg differ diff --git a/photos/credit_image/zecreditor.jpg b/photos/credit_image/zecreditor.jpg new file mode 100644 index 0000000..155547a Binary files /dev/null and b/photos/credit_image/zecreditor.jpg differ diff --git a/photos/loading1.jpg b/photos/loading1.jpg new file mode 100644 index 0000000..6acda42 Binary files /dev/null and b/photos/loading1.jpg differ diff --git a/photos/loading2.jpg b/photos/loading2.jpg new file mode 100644 index 0000000..9f83a91 Binary files /dev/null and b/photos/loading2.jpg differ diff --git a/photos/photo1.jpg b/photos/photo1.jpg new file mode 100644 index 0000000..b731e3f Binary files /dev/null and b/photos/photo1.jpg differ diff --git a/photos/photo2.jpg b/photos/photo2.jpg new file mode 100644 index 0000000..92b7083 Binary files /dev/null and b/photos/photo2.jpg differ diff --git a/utils/db_api/sqlite.py b/utils/db_api/sqlite.py new file mode 100644 index 0000000..264fb13 --- /dev/null +++ b/utils/db_api/sqlite.py @@ -0,0 +1,99 @@ +import sqlite3 + + +class Database: + def __init__(self, path_to_db="main.db"): + self.path_to_db = path_to_db + + @property + def connection(self): + return sqlite3.connect(self.path_to_db) + + def execute(self, sql: str, parameters: tuple = None, fetchone=False, fetchall=False, commit=False): + if not parameters: + parameters = () + connection = self.connection + connection.set_trace_callback(logger) + cursor = connection.cursor() + data = None + cursor.execute(sql, parameters) + + if commit: + connection.commit() + if fetchall: + data = cursor.fetchall() + if fetchone: + data = cursor.fetchone() + connection.close() + return data + + def create_table_users(self): + sql = """ + CREATE TABLE Users ( + id int NOT NULL, + Name varchar(255) NOT NULL, + email varchar(255), + age varchar(50), + PRIMARY KEY (id) + ); +""" + self.execute(sql, commit=True) + + @staticmethod + def format_args(sql, parameters: dict): + sql += " AND ".join([ + f"{item} = ?" for item in parameters + ]) + return sql, tuple(parameters.values()) + + def add_user(self, id: int, name: str, email: str = None, age: str = None): + # SQL_EXAMPLE = "INSERT INTO Users(id, Name, email) VALUES(1, 'John', 'John@gmail.com')" + + sql = """ + INSERT INTO Users(id, Name, email, age) VALUES(?, ?, ?, ?) + """ + self.execute(sql, parameters=(id, name, email, age), commit=True) + + def select_all_users(self): + sql = """ + SELECT * FROM Users + """ + return self.execute(sql, fetchall=True) + + def select_user(self, **kwargs): + # SQL_EXAMPLE = "SELECT * FROM Users where id=1 AND Name='John'" + sql = "SELECT * FROM Users WHERE " + sql, parameters = self.format_args(sql, kwargs) + + return self.execute(sql, parameters=parameters, fetchone=True) + + + def count_users(self): + return self.execute("SELECT COUNT(*) FROM Users;", fetchone=True) + + def update_user_email(self, email, id): + # SQL_EXAMPLE = "UPDATE Users SET email=mail@gmail.com WHERE id=12345" + + sql = f""" + UPDATE Users SET email=? WHERE id=? + """ + return self.execute(sql, parameters=(email, id), commit=True) + + def update_user_age(self, age, id): + sql = f""" + UPDATE Users SET age=? WHERE id=? + """ + return self.execute(sql, parameters=(age, id), commit=True) + + + def delete_users(self): + self.execute("DELETE FROM Users WHERE TRUE", commit=True) + + +def logger(statement): + print(f""" +_____________________________________________________ +Executing: +{statement} +_____________________________________________________ +""") diff --git a/utils/db_api/test.py b/utils/db_api/test.py new file mode 100644 index 0000000..2572b7b --- /dev/null +++ b/utils/db_api/test.py @@ -0,0 +1,6 @@ +from utils.db_api.sqlite import Database + +db = Database() + +def test(): + \ No newline at end of file