Решил заняться написанием кода для бота, который будет рассылать сообщения в чаты. Работает он следующим образом: Из-за того, что сообщения должны отправляться со стороны пользователя, а не бота, то бот запрашивает api_id и api_hash, нужные для того, чтобы библиотека telethon могла подключится к аккаунту. Я сделал так, чтобы бот просил у пользователя номер телефона, после чего телетон запускался и бот передавал его телетону , чтобы все это происходило на стороне пользователя. Однако с кодом аутентификации я не смог это провернуть, потому что для получение кода аутентификации нужна попытка входа, которую должен совершать телетон . Поэтому телетон запрашивает код аутентификации на стороне владельца. Можно ли сделать так, чтобы это происходило на стороне пользователя, как с номером телефона? Ниже предоставлю код: 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()) 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())
извините можете объяснить как где и когда использовать библиотеки Telethon sqlite сталкиваюсь с проблемой что не знаю где и когда нужно использовать ту или иную библиотеку