Nnjj
🧩 Syntax:
import logging
from aiogram import Bot, Dispatcher, types
from aiogram.fsm.storage.memory import MemoryStorage # تغییر مسیر
from aiogram.fsm.context import FSMContext # تغییر مسیر
from aiogram.fsm.state import State, StatesGroup # تغییر مسیر
import sqlite3
# تنظیمات اولیه
API_TOKEN = '8066029104:AAH6ll2BnXLEU3z8CytDV8RWURbxKM_N3R8' # توکن ربات خود را اینجا وارد کنید
CHANNEL_ID = '@SACRIFICECODM' # شناسه کانال تلگرام
YOUTUBE_LINK = 'https://youtube.com/sacrificecodm' # لینک کانال یوتیوب
ADMIN_ID = 5172157462 # شناسه عددی ادمین خود را وارد کنید
# تنظیمات لاگ
logging.basicConfig(level=logging.INFO)
# اتصال به دیتابیس SQLite
conn = sqlite3.connect('bot.db', check_same_thread=False)
cursor = conn.cursor()
# ایجاد جداول دیتابیس
cursor.execute('''
CREATE TABLE IF NOT EXISTS users (
user_id INTEGER PRIMARY KEY,
is_golden INTEGER DEFAULT 0,
invites INTEGER DEFAULT 0
)
''')
cursor.execute('''
CREATE TABLE IF NOT EXISTS requests (
request_id INTEGER PRIMARY KEY AUTOINCREMENT,
user_id INTEGER,
status TEXT DEFAULT 'pending',
screenshot_message_id INTEGER
)
''')
conn.commit()
# راهاندازی ربات
bot = Bot(token=API_TOKEN)
storage = MemoryStorage()
dp = Dispatcher(storage=storage) # تغییر در ایجاد Dispatcher
# تعریف وضعیتها
class Form(StatesGroup):
waiting_for_screenshot = State()
# تابع بررسی عضویت در کانال
async def check_membership(user_id):
try:
member = await bot.get_chat_member(CHANNEL_ID, user_id)
return member.status != 'left'
except:
return False
# دستور /start
@dp.message_handler(commands=['start'])
async def start(message: types.Message):
user_id = message.from_user.id
ref = message.get_args() # دریافت ref_id از لینک دعوت
# بررسی عضویت
if not await check_membership(user_id):
await message.reply(f"لطفاً ابتدا در کانال {CHANNEL_ID} عضو شوید:\nhttps://t.me/{CHANNEL_ID[1:]}")
return
# ثبت کاربر در دیتابیس
cursor.execute("INSERT OR IGNORE INTO users (user_id) VALUES (?)", (user_id,))
conn.commit()
# مدیریت دعوتها
if ref and ref.startswith('ref_'):
ref_id = int(ref.split('_')[1])
if ref_id != user_id:
cursor.execute("UPDATE users SET invites = invites + 1 WHERE user_id = ?", (ref_id,))
conn.commit()
cursor.execute("SELECT invites FROM users WHERE user_id = ?", (ref_id,))
invites = cursor.fetchone()[0]
if invites >= 1:
cursor.execute("UPDATE users SET is_golden = 1 WHERE user_id = ?", (ref_id,))
conn.commit()
# ارسال لینک دعوت
invite_link = f"https://t.me/{(await bot.get_me()).username}?start=ref_{user_id}"
await message.reply(f"به ربات خوش آمدید!\nلینک دعوت شما: {invite_link}\nبرای طلایی شدن، حداقل یک نفر را دعوت کنید.")
# نمایش منو
keyboard = types.InlineKeyboardMarkup()
if cursor.execute("SELECT is_golden FROM users WHERE user_id = ?", (user_id,)).fetchone()[0]:
keyboard.add(types.InlineKeyboardButton("🎁 دریافت اکانت رایگان", callback_data="get_account"))
await message.reply("منوی اصلی:", reply_markup=keyboard)
# دکمه دریافت اکانت رایگان
@dp.callback_query_handler(lambda c: c.data == 'get_account')
async def get_account(callback_query: types.CallbackQuery):
user_id = callback_query.from_user.id
await callback_query.answer()
await bot.send_message(user_id, f"لطفاً کانال یوتیوب زیر را سابسکرایب کنید و اسکرینشات بفرستید:\n{YOUTUBE_LINK}")
await dp.current_state(user=user_id).set_state(Form.waiting_for_screenshot) # تغییر در تنظیم استیت
# دریافت اسکرینشات
@dp.message_handler(content_types=['photo'], state=Form.waiting_for_screenshot)
async def receive_screenshot(message: types.Message, state: FSMContext):
user_id = message.from_user.id
screenshot = message.photo[-1].file_id
# ثبت درخواست
cursor.execute("INSERT INTO requests (user_id, screenshot_message_id) VALUES (?, ?)", (user_id, message.message_id))
conn.commit()
# فوروارد به ادمین
await bot.forward_message(ADMIN_ID, user_id, message.message_id)
await bot.send_message(ADMIN_ID, f"درخواست جدید از کاربر {user_id}", reply_markup=types.InlineKeyboardMarkup().add(
types.InlineKeyboardButton("✅ تایید", callback_data=f"approve_{user_id}"),
types.InlineKeyboardButton("❌ رد", callback_data=f"reject_{user_id}")
))
await message.reply("اسکرینشات شما ارسال شد. منتظر تایید باشید.")
await state.clear() # تغییر در پاک کردن استیت
# مدیریت درخواستها توسط ادمین
@dp.callback_query_handler(lambda c: c.data.startswith(('approve_', 'reject_')))
async def process_request(callback_query: types.CallbackQuery):
action, user_id = callback_query.data.split('_')
user_id = int(user_id)
if callback_query.from_user.id != ADMIN_ID:
await callback_query.answer("شما ادمین نیستید!", show_alert=True)
return
if action == 'approve':
account = "نام کاربری: example\nرمز عبور: 123456" # اینجا میتوانید اکانت را از دیتابیس بخوانید
await bot.send_message(user_id, f"تبریک! اکانت رایگان شما:\n{account}")
cursor.execute("UPDATE requests SET status = 'approved' WHERE user_id = ?", (user_id,))
else:
await bot.send_message(user_id, "اسکرینشات شما رد شد. دوباره تلاش کنید.")
cursor.execute("UPDATE requests SET status = 'rejected' WHERE user_id = ?", (user_id,))
conn.commit()
await callback_query.answer("انجام شد!")
if __name__ == '__main__':
from aiogram import executor
executor.start_polling(dp, skip_updates=True)