@k1nster

Как брать код подтверждения пользователя исходя из его ввода в чат?

Как брать код подтверждения для подключения телефона из чата в боте Telethon?

Я уже писал подобный вопрос, но требуется помощь в другом. После подвязки телефона, телеграмм требует код подтверждения. Этот код у меня сейчас вводится в консоле, мне нужно реализовать так, дабы пользователь его вводил в боте.

Я знаю как работать с состояниями в телеграмме и т.д, но мне не понятен сам метод user_client.start(phone), как в нём брать код подтверждения, а так же пароль от телеграмма (если он есть) именно из чата?

# Main telegram bot imports
import asyncio
from aiogram import Bot, Dispatcher, F, types
from aiogram.types import Message, CallbackQuery, InputFile
from aiogram.fsm.context import FSMContext
from aiogram.fsm.state import State, StatesGroup
from telethon import TelegramClient, utils
from telethon.errors.rpcerrorlist import PhoneNumberInvalidError

# Import BD
import pymysql

# Import files
import keyboard as kb
from config import TOKEN, API_ID, API_HASH
from texts import MESSAGES
from database import create_connection


api_id = API_ID
api_hash = API_HASH
bot = Bot(token=TOKEN)
dp = Dispatcher()
client = TelegramClient('Kinster', api_id, api_hash)

connection = create_connection()

# DB function
# Function to retrieve user information from the database
# def get_user_info(user_id):
#     with connection.cursor() as cursor:
#         select_user_query = "SELECT * FROM fiverr WHERE user_id = %s"
#         cursor.execute(select_user_query, (user_id,))
#         user_info = cursor.fetchone()
#     return user_info


class Form(StatesGroup):
    first_connection = State()

# Start function
@dp.message(F.text == '/start')
async def cmd_start(message:Message):
    user_name = message.from_user.first_name # get user usermame
    await message.answer(MESSAGES['welcome'].format(name=user_name), reply_markup=kb.main, parse_mode='Markdown')


# @dp.callback_query(F.data == 'first_connection')
# async def first_connection(callback: CallbackQuery):
#     await callback.message.answer(MESSAGES['first_connection'], parse_mode='Markdown')

@dp.message(F.text.startswith('/connect'))
async def cmd_start(message: Message, state: FSMContext):
    # Получаем текст сообщения и разделяем его на части по пробелу
    text = message.text.strip()
    parts = text.split(' ')
    
    if len(parts) == 1:
        # Пользователь отправил только команду /connect, отправляем инструкцию
        await message.answer(MESSAGES['first_connection'], parse_mode='Markdown')
    elif len(parts) == 2:
        phone = parts[1]
        # Попытка авторизации
        try:
            await message.reply(MESSAGES['phone_handler'])
            # Авторизуемся с использованием сессии, связанной с аккаунтом пользователя
            user_client = TelegramClient(str(message.from_user.id), api_id, api_hash)
            await user_client.start(phone)
            
            # Ожидание кода подтверждения от пользователя
            await message.answer("Пожалуйста, введите код подтверждения:")
            await state.set_state(Form.first_connection)
            
            await user_client.disconnect()
        except PhoneNumberInvalidError:
            await message.answer("❌ The phone number is invalid.")


# Тут будет состояние обрабатывающие сообщение

# Основной цикл бота
async def main():
    await dp.start_polling(bot)

if __name__ == '__main__':
    asyncio.run(main())






# Run
async def main():
    await dp.start_polling(bot)

if __name__ == '__main__':
    asyncio.run(main())
  • Вопрос задан
  • 395 просмотров
Пригласить эксперта
Ответы на вопрос 1
SoreMix
@SoreMix
yellow
Если по простому:

1. Создаете объекта класса TelegramClient
2. Шлете смс через send_code_request
3. Заходите через sign_in
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы