-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathbot.py
More file actions
193 lines (166 loc) · 7.14 KB
/
Copy pathbot.py
File metadata and controls
193 lines (166 loc) · 7.14 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
#!/usr/bin/env python3
"""
STP Proxy Bot – Telegram bot for selling residential proxies with crypto payments.
"""
import asyncio
import logging
import secrets
import time
from aiogram import Bot, Dispatcher, F, types
from aiogram.filters import Command
from aiogram.types import ReplyKeyboardMarkup, KeyboardButton
from config import (
TELEGRAM_TOKEN, OPERATOR_ID, NOWPAYMENTS_API_KEY,
PUBLIC_DOMAIN, PUBLIC_PORT, PRICE_PER_PROXY,
WEBHOOK_HOST, WEBHOOK_PORT, WEBHOOK_URL
)
from db import (
init_db, get_available_child_for_country, set_child_credentials,
add_issued_proxy, get_user_balance, update_balance, deduct_balance
)
from nowpayments import NowPayments
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)
bot = Bot(token=TELEGRAM_TOKEN)
dp = Dispatcher()
# ---------- Платежи ----------
payments = NowPayments(api_key=NOWPAYMENTS_API_KEY, webhook_path="/webhook")
# ---------- Список стран (пример, можно менять) ----------
COUNTRIES = {
"GB": "🇬🇧 United Kingdom",
"DE": "🇩🇪 Germany",
"ES": "🇪🇸 Spain",
"FR": "🇫🇷 France",
"IT": "🇮🇹 Italy",
"US": "🇺🇸 USA",
}
# ---------- Колбэк при успешной оплате ----------
def on_payment_success(user_id: int, amount: float, invoice_id: str):
logger.info(f"Payment success: user {user_id}, amount {amount}, invoice {invoice_id}")
# Здесь можно добавить логику, если нужно уведомить оператора
asyncio.create_task(
bot.send_message(
OPERATOR_ID,
f"✅ Оплата получена!\nПользователь ID: {user_id}\nСумма: {amount} USD"
)
)
payments.set_on_payment_callback(on_payment_success)
# ---------- Клавиатуры ----------
def main_keyboard():
return ReplyKeyboardMarkup(
keyboard=[
[KeyboardButton(text="📘 Инструкция"), KeyboardButton(text="📊 Тарифы")],
[KeyboardButton(text="🚀 Купить"), KeyboardButton(text="🌟 О нас")],
],
resize_keyboard=True
)
def countries_keyboard():
buttons = [[KeyboardButton(text=name)] for name in COUNTRIES.values()]
buttons.append([KeyboardButton(text="« Назад")])
return ReplyKeyboardMarkup(keyboard=buttons, resize_keyboard=True)
# ---------- Команды ----------
@dp.message(Command("start"))
async def start_cmd(message: types.Message):
await message.answer(
"🌟 Добро пожаловать в STP Proxy Bot!\n\n"
"Я продаю резидентские прокси с оплатой в криптовалюте.\n"
"Выберите действие ниже 👇",
reply_markup=main_keyboard()
)
@dp.message(F.text == "📘 Инструкция")
async def instruction_cmd(message: types.Message):
await message.answer(
"📘 **Как использовать прокси:**\n\n"
"1. Пополните баланс через кнопку «Купить».\n"
"2. Выберите страну.\n"
"3. Получите прокси в формате:\n"
"`host:port:login:password`\n\n"
"Прокси выдаётся на 24 часа. Поддерживаются SOCKS5 и HTTP CONNECT.",
parse_mode="Markdown"
)
@dp.message(F.text == "📊 Тарифы")
async def tariffs_cmd(message: types.Message):
await message.answer(
"📊 **Тарифы:**\n\n"
"🔹 1 день — 0.50 USD\n"
"🔹 7 дней — 3.00 USD\n"
"🔹 30 дней — 10.00 USD\n\n"
"Выберите «Купить» для оплаты.",
parse_mode="Markdown"
)
@dp.message(F.text == "🌟 О нас")
async def about_cmd(message: types.Message):
await message.answer(
"🌟 **О нас:**\n\n"
"Мы предоставляем надёжные резидентские прокси для обхода блокировок.\n"
"Наши прокси работают с любыми приложениями и браузерами.\n"
"Поддержка: @volttecc"
)
@dp.message(F.text == "🚀 Купить")
async def buy_start(message: types.Message):
await message.answer(
"Выберите страну:",
reply_markup=countries_keyboard()
)
@dp.message(F.text.in_(COUNTRIES.values()))
async def country_selected(message: types.Message):
user_id = message.from_user.id
# Находим код страны по названию
country_code = None
for code, name in COUNTRIES.items():
if name == message.text:
country_code = code
break
if not country_code:
await message.answer("❌ Страна не найдена.")
return
# Проверяем баланс
balance = get_user_balance(user_id)
if balance < PRICE_PER_PROXY:
await message.answer(
f"❌ Недостаточно средств. Нужно ${PRICE_PER_PROXY:.2f}, у вас ${balance:.2f}.\n"
"Пополните баланс через кнопку «Купить»."
)
return
# Ищем свободный канал
child = get_available_child_for_country(country_code)
if not child:
await message.answer("❌ Нет свободных прокси для этой страны. Попробуйте позже.")
return
# Генерируем логин/пароль
login = f"u{secrets.token_hex(4)}"
password = secrets.token_hex(6)
child_id = child["id"]
set_child_credentials(child_id, login, password)
# Записываем выдачу на 24 часа
expires_at = int(time.time()) + 86400
add_issued_proxy(user_id, child_id, expires_at)
# Списываем средства
deduct_balance(user_id, PRICE_PER_PROXY)
# Формируем строку прокси
proxy_str = f"{PUBLIC_DOMAIN}:{PUBLIC_PORT}:{login}:{password}"
await message.answer(
f"✅ Прокси для {COUNTRIES[country_code]} куплен!\n\n"
f"📡 Данные:\n`{proxy_str}`\n\n"
f"⏳ Действует до: {time.ctime(expires_at)}\n"
f"💰 Остаток: ${get_user_balance(user_id):.2f}",
parse_mode="Markdown",
reply_markup=main_keyboard()
)
@dp.message(F.text == "« Назад")
async def back_to_main(message: types.Message):
await message.answer("Главное меню:", reply_markup=main_keyboard())
@dp.message()
async def unknown(message: types.Message):
await message.answer("Используйте кнопки меню.", reply_markup=main_keyboard())
# ---------- Запуск вебхук-сервера ----------
async def run_webhook():
await payments.start_webhook_server(host=WEBHOOK_HOST, port=WEBHOOK_PORT)
# ---------- Запуск бота ----------
async def main():
init_db() # создаём таблицы, если их нет
asyncio.create_task(run_webhook())
logger.info("STP Proxy Bot started")
await dp.start_polling(bot)
if __name__ == "__main__":
asyncio.run(main())