Create app.py
Browse files
app.py
ADDED
|
@@ -0,0 +1,100 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import telebot
|
| 2 |
+
from telebot import types
|
| 3 |
+
import time
|
| 4 |
+
import threading
|
| 5 |
+
import gradio as gr
|
| 6 |
+
|
| 7 |
+
# --- НАСТРОЙКИ ---
|
| 8 |
+
TOKEN = '8317707454:AAHRAInErEdeLVO5d_NDWkYZtCMxU1wXBdw'
|
| 9 |
+
ADMIN_ID = 0
|
| 10 |
+
BOT_START_TIME = int(time.time())
|
| 11 |
+
|
| 12 |
+
# Создаем бота напрямую БЕЗ apihelper.proxy (если DNS на HF заработает)
|
| 13 |
+
bot = telebot.TeleBot(TOKEN)
|
| 14 |
+
user_data = {}
|
| 15 |
+
|
| 16 |
+
def get_stats():
|
| 17 |
+
now = int(time.time())
|
| 18 |
+
diff = now - BOT_START_TIME
|
| 19 |
+
gifts = (diff if diff > 0 else 0) + 5243
|
| 20 |
+
hours_passed = diff // 3600
|
| 21 |
+
saved_money = (hours_passed * 5000) + 8125
|
| 22 |
+
return gifts, saved_money
|
| 23 |
+
|
| 24 |
+
def main_menu():
|
| 25 |
+
gifts, saved = get_stats()
|
| 26 |
+
kb = types.InlineKeyboardMarkup(row_width=1)
|
| 27 |
+
kb.add(
|
| 28 |
+
types.InlineKeyboardButton("🎁 Подарки", callback_data="nft_list"),
|
| 29 |
+
types.InlineKeyboardButton("📱 Написать комментарий в TikTok - + 100⭐", callback_data="tiktok_task"),
|
| 30 |
+
types.InlineKeyboardButton("👤 Профиль", callback_data="profile")
|
| 31 |
+
)
|
| 32 |
+
text = (f"📍 Главное меню\n\n"
|
| 33 |
+
f"🎁 Подарено подарков: **{gifts}**⠀\n"
|
| 34 |
+
f"💸 Сэкономили для вас: **{saved}** ⭐\n\n"
|
| 35 |
+
"Выбери категорию 👇")
|
| 36 |
+
return text, kb
|
| 37 |
+
|
| 38 |
+
def nft_menu():
|
| 39 |
+
kb = types.InlineKeyboardMarkup(row_width=1)
|
| 40 |
+
items = ["🎭 Маска", "💼 Рюкзак", "📅 Календарь", "🍭 Лолипоп", "🦩 Фламинго",
|
| 41 |
+
"🥥 Кокос", "🥚 Яйцо", "🍦 Мороженое", "💩 Какашка", "🧁 Кекс"]
|
| 42 |
+
for item in items:
|
| 43 |
+
kb.add(types.InlineKeyboardButton(f"{item} — 35 ⭐", callback_data=f"buy_{item}"))
|
| 44 |
+
kb.add(types.InlineKeyboardButton("Назад 🔙", callback_data="to_main"))
|
| 45 |
+
return kb
|
| 46 |
+
|
| 47 |
+
@bot.message_handler(commands=['start'])
|
| 48 |
+
def start_cmd(message):
|
| 49 |
+
user_data[message.chat.id] = {'photos': 0, 'is_uploading': False}
|
| 50 |
+
text, kb = main_menu()
|
| 51 |
+
bot.send_message(message.chat.id, text, reply_markup=kb, parse_mode="Markdown")
|
| 52 |
+
|
| 53 |
+
@bot.callback_query_handler(func=lambda call: True)
|
| 54 |
+
def handle_calls(call):
|
| 55 |
+
chat_id = call.message.chat.id
|
| 56 |
+
if call.data == "to_main":
|
| 57 |
+
text, kb = main_menu()
|
| 58 |
+
bot.edit_message_text(text, chat_id, call.message.message_id, reply_markup=kb, parse_mode="Markdown")
|
| 59 |
+
elif call.data == "nft_list":
|
| 60 |
+
bot.edit_message_text("✨ НФТ подарки:", chat_id, call.message.message_id, reply_markup=nft_menu())
|
| 61 |
+
elif call.data == "profile":
|
| 62 |
+
profile_text = (f"📊 Ваш профиль!\n\n💡 ID: `{call.from_user.id}`\n"
|
| 63 |
+
f"👤 Имя: {call.from_user.first_name}\n"
|
| 64 |
+
f"💰 Баланс: 50\n⭐ Потрачено: 0")
|
| 65 |
+
kb = types.InlineKeyboardMarkup().add(types.InlineKeyboardButton("Назад 🔙", callback_data="to_main"))
|
| 66 |
+
bot.edit_message_text(profile_text, chat_id, call.message.message_id, reply_markup=kb, parse_mode="Markdown")
|
| 67 |
+
elif call.data == "tiktok_task":
|
| 68 |
+
kb = types.InlineKeyboardMarkup().add(types.InlineKeyboardButton("✅ Отправить скриншот", callback_data="send_screens"),
|
| 69 |
+
types.InlineKeyboardButton("Назад 🔙", callback_data="to_main"))
|
| 70 |
+
bot.edit_message_text("📱 Задание: 10 комментов в TikTok за 100⭐", chat_id, call.message.message_id, reply_markup=kb)
|
| 71 |
+
elif call.data == "send_screens":
|
| 72 |
+
user_data[chat_id] = {'photos': 0, 'is_uploading': True}
|
| 73 |
+
bot.send_message(chat_id, "📸 Кидай 10 скринов подряд.")
|
| 74 |
+
|
| 75 |
+
@bot.message_handler(content_types=['photo'])
|
| 76 |
+
def handle_photo(message):
|
| 77 |
+
chat_id = message.chat.id
|
| 78 |
+
if chat_id in user_data and user_data[chat_id].get('is_uploading'):
|
| 79 |
+
user_data[chat_id]['photos'] += 1
|
| 80 |
+
if user_data[chat_id]['photos'] == 10:
|
| 81 |
+
bot.send_message(chat_id, "✅ Получено! Жди проверки.")
|
| 82 |
+
user_data[chat_id]['is_uploading'] = False
|
| 83 |
+
else:
|
| 84 |
+
bot.send_message(chat_id, f"Принято {user_data[chat_id]['photos']}/10")
|
| 85 |
+
|
| 86 |
+
# --- ЗАПУСК БОТА С ПЕРЕЗАПУСКОМ ПРИ ОШИБКЕ ---
|
| 87 |
+
def run_bot():
|
| 88 |
+
while True:
|
| 89 |
+
try:
|
| 90 |
+
bot.polling(none_stop=True, timeout=60)
|
| 91 |
+
except Exception as e:
|
| 92 |
+
print(f"Ошибка: {e}")
|
| 93 |
+
time.sleep(10)
|
| 94 |
+
|
| 95 |
+
threading.Thread(target=run_bot, daemon=True).start()
|
| 96 |
+
|
| 97 |
+
# --- ОБЯЗАТЕЛЬНО ДЛЯ HUGGING FACE GRADIO ---
|
| 98 |
+
with gr.Blocks() as demo:
|
| 99 |
+
gr.Markdown("# БОТ ВКЛЮЧЕН")
|
| 100 |
+
demo.launch(server_name="0.0.0.0", server_port=7860)
|