Untitled

 avatar
unknown
plain_text
22 days ago
8.8 kB
6
Indexable
import os
import json
from telegram import Update
from telegram.ext import (
    Application,
    CommandHandler,
    MessageHandler,
    filters,
    ContextTypes,
    ConversationHandler,
)
from telethon import TelegramClient
from telethon.sessions import StringSession
from telethon.errors import SessionPasswordNeededError

ACCOUNTS_FILE = "accounts.json"

user_sessions = {}

API_CREDENTIALS, PHONE_NUMBER, LOGIN_CODE, PASSWORD = range(4)

def load_accounts():
    if os.path.exists(ACCOUNTS_FILE):
        with open(ACCOUNTS_FILE, "r") as file:
            return json.load(file)
    return {}

def save_accounts(accounts):
    with open(ACCOUNTS_FILE, "w") as file:
        json.dump(accounts, file, indent=4)

def add_account(user_id, api_id, api_hash, session_string):
    accounts = load_accounts()
    accounts[str(user_id)] = {
        "api_id": api_id,
        "api_hash": api_hash,
        "session_string": session_string,
    }
    save_accounts(accounts)

def get_account(user_id):
    accounts = load_accounts()
    return accounts.get(str(user_id))

async def start(update: Update, context: ContextTypes.DEFAULT_TYPE):
    await update.message.reply_text(
        "Welcome to the Manager Bot! 🤖\n\n"
        "📌 Use /addaccount to add a new Telegram account.\n"
        "📌 Use /viewaccounts to see your saved accounts.\n"
        "📌 Use /startbot to launch the main bot."
    )

async def add_account_command(update: Update, context: ContextTypes.DEFAULT_TYPE):
    await update.message.reply_text(
        "Please send your `API_ID API_HASH` in this format:\n\n"
        "`123456 abcdef1234567890abcdef1234567890`\n\n"
        "🔹 Example: `123456 abcdef1234567890abcdef1234567890`",
        parse_mode="Markdown",
    )
    return API_CREDENTIALS

async def handle_api_credentials(update: Update, context: ContextTypes.DEFAULT_TYPE):
    user_id = update.message.from_user.id
    text = update.message.text.strip()

    try:
        api_id, api_hash = text.split()
        api_id = int(api_id)  

        user_sessions[user_id] = {
            "api_id": api_id,
            "api_hash": api_hash,
        }

        await update.message.reply_text("📞 Please send your phone number (including country code, e.g., +1234567890).")
        return PHONE_NUMBER

    except ValueError:
        await update.message.reply_text("❌ Invalid format! Please use `/addaccount` and try again.")
        return ConversationHandler.END

async def handle_phone_number(update: Update, context: ContextTypes.DEFAULT_TYPE):
    user_id = update.message.from_user.id
    phone_number = update.message.text.strip()

    if user_id not in user_sessions:
        await update.message.reply_text("❌ Please send API_ID and API_HASH first using /addaccount.")
        return ConversationHandler.END

    user_sessions[user_id]["phone"] = phone_number

    credentials = user_sessions[user_id]
    client = TelegramClient(StringSession(), credentials["api_id"], credentials["api_hash"])

    try:
        await client.connect()

        if not await client.is_user_authorized():
            result = await client.send_code_request(phone_number)
            user_sessions[user_id]["phone_code_hash"] = result.phone_code_hash  # Store phone_code_hash
            await update.message.reply_text("🔑 Please enter the login code you received via Telegram.")
            return LOGIN_CODE
        else:
            session_string = client.session.save()
            add_account(user_id, credentials["api_id"], credentials["api_hash"], session_string)
            await update.message.reply_text("✅ You're already logged in.")
            return ConversationHandler.END

    except Exception as e:
        await update.message.reply_text(f"❌ Error while connecting to Telegram: {e}")
        return ConversationHandler.END

async def handle_login_code(update: Update, context: ContextTypes.DEFAULT_TYPE):
    user_id = update.message.from_user.id
    login_code = update.message.text.strip()

    if user_id not in user_sessions or "phone" not in user_sessions[user_id]:
        await update.message.reply_text("❌ Please restart with /addaccount.")
        return ConversationHandler.END

    credentials = user_sessions[user_id]
    client = TelegramClient(StringSession(), credentials["api_id"], credentials["api_hash"])

    try:
        await client.connect()

        phone_code_hash = user_sessions[user_id].get("phone_code_hash")
        await client.sign_in(phone=credentials["phone"], code=login_code, phone_code_hash=phone_code_hash)

        if await client.is_user_authorized():
            session_string = client.session.save()
            add_account(user_id, credentials["api_id"], credentials["api_hash"], session_string)
            await update.message.reply_text("✅ Account added successfully!")
        else:
            await update.message.reply_text("❌ Login failed. Please try again.")

    except Exception as e:
        if "confirmation code has expired" in str(e):
            await update.message.reply_text("❌ The code has expired. Please send your phone number again to receive a new code.")
            return PHONE_NUMBER
        else:
            await update.message.reply_text(f"❌ Error: {e}")

    return ConversationHandler.END

async def handle_password(update: Update, context: ContextTypes.DEFAULT_TYPE):
    user_id = update.message.from_user.id
    password = update.message.text.strip()

    if user_id not in user_sessions or "awaiting_password" not in user_sessions[user_id]:
        await update.message.reply_text("❌ No password was requested.")
        return ConversationHandler.END

    credentials = user_sessions[user_id]
    client = TelegramClient(StringSession(), credentials["api_id"], credentials["api_hash"])

    try:
        await client.connect()
        await client.sign_in(password=password)

        if await client.is_user_authorized():
            session_string = client.session.save()
            add_account(user_id, credentials["api_id"], credentials["api_hash"], session_string)
            await update.message.reply_text("✅ Account added successfully!")
        else:
            await update.message.reply_text("❌ Login failed. Please try again.")

    except Exception as e:
        await update.message.reply_text(f"❌ Error: {e}")

    return ConversationHandler.END

async def view_accounts_command(update: Update, context: ContextTypes.DEFAULT_TYPE):
    user_id = update.message.from_user.id
    account = get_account(user_id)

    if account:
        await update.message.reply_text(
            f"Your account details:\n\n"
            f"API ID: {account['api_id']}\n"
            f"API Hash: {account['api_hash']}\n"
            "✅ Session is stored securely."
        )
    else:
        await update.message.reply_text("No account found. Use /addaccount to add one.")

async def start_bot_command(update: Update, context: ContextTypes.DEFAULT_TYPE):
    user_id = update.message.from_user.id
    account = get_account(user_id)

    if account:
        await update.message.reply_text("Starting the main bot...")

        # Run bot.py with API credentials
        os.system(f"python bot.py {account['api_id']} {account['api_hash']} {account['session_string']}")

    else:
        await update.message.reply_text("No account found. Use /addaccount to add one.")

async def cancel(update: Update, context: ContextTypes.DEFAULT_TYPE):
    await update.message.reply_text("❌ Operation canceled.")
    return ConversationHandler.END

def main():
    application = Application.builder().token("***************").build()

    conv_handler = ConversationHandler(
        entry_points=[CommandHandler("addaccount", add_account_command)],
        states={
            API_CREDENTIALS: [MessageHandler(filters.TEXT & ~filters.COMMAND, handle_api_credentials)],
            PHONE_NUMBER: [MessageHandler(filters.TEXT & ~filters.COMMAND, handle_phone_number)],
            LOGIN_CODE: [MessageHandler(filters.TEXT & ~filters.COMMAND, handle_login_code)],
            PASSWORD: [MessageHandler(filters.TEXT & ~filters.COMMAND, handle_password)],
        },
        fallbacks=[CommandHandler("cancel", cancel)],
    )

    application.add_handler(conv_handler)
    application.add_handler(CommandHandler("start", start))
    application.add_handler(CommandHandler("viewaccounts", view_accounts_command))
    application.add_handler(CommandHandler("startbot", start_bot_command))

    application.run_polling()

if __name__ == "__main__":
    main()
Editor is loading...
Leave a Comment