Загрузка...

How to use telethon on user side?

Thread in Python created by Dadryy Oct 30, 2024. 154 views

  1. Dadryy
    Dadryy Topic starter Oct 30, 2024 0 Aug 19, 2023
    Решил заняться написанием кода для бота, который будет рассылать сообщения в чаты. Работает он следующим образом:
    Из-за того, что сообщения должны отправляться со стороны пользователя, а не бота, то бот запрашивает api_id и api_hash, нужные для того, чтобы библиотека telethon могла подключится к аккаунту.
    Я сделал так, чтобы бот просил у пользователя номер телефона, после чего телетон запускался и бот передавал его телетону , чтобы все это происходило на стороне пользователя. Однако с кодом аутентификации я не смог это провернуть, потому что для получение кода аутентификации нужна попытка входа, которую должен совершать телетон .
    Поэтому телетон запрашивает код аутентификации на стороне владельца.
    Можно ли сделать так, чтобы это происходило на стороне пользователя, как с номером телефона?
    Ниже предоставлю код:



    Python
    import logging

    import sqlite3

    import asyncio

    from telegram import Update

    from telegram.ext import ApplicationBuilder, CommandHandler, CallbackContext, MessageHandler, filters, ConversationHandler

    from telethon import TelegramClient

    from telethon.errors import SessionPasswordNeededError

    import nest_asyncio

    nest_asyncio.apply()

    logging.basicConfig(format='%(asctime)s - %(name)s - %(levelname)s', level=logging.INFO)

    logger = logging.getLogger(__name__)

    def setup_database():

    conn = sqlite3.connect('groups.db')

    cursor = conn.cursor()

    cursor.execute('''CREATE TABLE IF NOT EXISTS groups (

    id INTEGER PRIMARY KEY AUTOINCREMENT,

    chat_link TEXT NOT NULL UNIQUE

    )''')

    cursor.execute('''CREATE TABLE IF NOT EXISTS messages (

    id INTEGER PRIMARY KEY AUTOINCREMENT,

    text TEXT NOT NULL

    )''')

    conn.commit()

    conn.close()

    async def start(update: Update, context: CallbackContext) -> None:

    await update.message.reply_text('Привет! Введите ваш API ID:')

    return 0

    async def get_api_id(update: Update, context: CallbackContext) -> int:

    context.user_data['api_id'] = update.message.text

    await update.message.reply_text('Введите ваш API Hash:')

    return 1

    async def get_api_hash(update: Update, context: CallbackContext) -> int:

    context.user_data['api_hash'] = update.message.text

    await update.message.reply_text('Введите номер телефона (в формате +123456789):')

    return 2

    async def get_phone_number(update: Update, context: CallbackContext) -> int:

    context.user_data['phone_number'] = update.message.text

    context.user_data['client'] = TelegramClient("session_name", context.user_data['api_id'], context.user_data['api_hash'])

    await context.user_data['client'].start(phone=context.user_data['phone_number'])

    await update.message.reply_text('Код аутентификации был отправлен на ваш номер телефона. Пожалуйста, введите код:')

    return 3

    async def get_auth_code(update: Update, context: CallbackContext) -> int:

    code = update.message.text

    try:

    await context.user_data['client'].sign_in(phone=context.user_data['phone_number'], code=code)

    await update.message.reply_text('Вы успешно авторизованы!')

    except SessionPasswordNeededError:

    await update.message.reply_text('Введите ваш пароль:')

    return 4

    except Exception as e:

    await update.message.reply_text(f"Ошибка аутентификации: {e}. Пожалуйста, попробуйте еще раз.")

    return ConversationHandler.END



    return ConversationHandler.END

    async def get_password(update: Update, context: CallbackContext) -> int:

    password = update.message.text

    try:

    await context.user_data['client'].sign_in(password=password)

    await update.message.reply_text('Вы успешно авторизованы!')

    except Exception as e:

    await update.message.reply_text(f"Ошибка аутентификации: {e}")



    return ConversationHandler.END

    async def cancel(update: Update, context: CallbackContext) -> int:

    await update.message.reply_text('Отмена процесса.')

    return ConversationHandler.END

    async def main() -> None:

    application = ApplicationBuilder().token("YOUR_BOT_TOKEN").build()

    setup_database()

    conv_handler = ConversationHandler(

    entry_points=[CommandHandler("start", start)],

    states={

    0: [MessageHandler(filters.TEXT & ~filters.COMMAND, get_api_id)],

    1: [MessageHandler(filters.TEXT & ~filters.COMMAND, get_api_hash)],

    2: [MessageHandler(filters.TEXT & ~filters.COMMAND, get_phone_number)],

    3: [MessageHandler(filters.TEXT & ~filters.COMMAND, get_auth_code)],

    4: [MessageHandler(filters.TEXT & ~filters.COMMAND, get_password)],

    },

    fallbacks=[CommandHandler('cancel', cancel)]

    )

    application.add_handler(conv_handler)

    await application.run_polling()

    if __name__ == '__main__':

    setup_database()

    asyncio.run(main())
     
  2. antihack
    antihack Jan 24, 2025 0 Jan 24, 2025
    извините можете объяснить как где и когда использовать библиотеки Telethon sqlite сталкиваюсь с проблемой что не знаю где и когда нужно использовать ту или иную библиотеку
     
Top
Loading...