S0nder88
@S0nder88
Мойте тарелку после гречки сразу!

Как обойти первоначальную авторизацию через терминал при создании TelegramClienta (telethon)?

Вот мой код, который выполняет создание клиента телеграмм с использованием данных из бд, данные я добавляю через бота.

async def update_tags(queue, code_callback):
    while True:
        accounts = apidb.get_accounts()
        new_accounts = await queue.get()
        for account in accounts + new_accounts:
            api_id = account['api_id']
            api_hash = account['api_hash']
            acc_name = account['acc_name']
            phone_number = account['number']  

            last_changed_tag = {}
            with open(f'{acc_name}_last_changed_tags.json', 'r') as f:
                last_changed_tag = json.load(f)

            client = TelegramClient(phone_number, api_id, api_hash)
            await client.start(phone=phone_number)


Так же я написал обработчик для ввода кода из смс которая отправляется при срабатывании моего скрипта, но не понимаю как мне передать код который был введен пользователем и сохранен в машинном состоянии, в свою функцию, что бы выполнить первичную авторизацию.

@dp.message_handler(lambda message: message.text == " Авторизация аккаунта")
async def auth_account_handler(message: types.Message, state: FSMContext):
    await message.answer('Введите код авторизации:')
    await AccountManagementStateFSM.auth_account_code.set()


@dp.message_handler(state=AccountManagementStateFSM.auth_account_code)
async def proces_auth_code(message: types.Message, state: FSMContext):
    async with state.proxy() as data:
        data['auth_code'] = message.text
        await state.update_data()
        await AccountManagementStateFSM.next()

        await message.answer('Спасибо!')


Может кто сталкивался с подобным, прошу натолкнуть на правильный путь
  • Вопрос задан
  • 268 просмотров
Пригласить эксперта
Ответы на вопрос 1
phaggi
@phaggi Куратор тега Python
лужу, паяю, ЭВМы починяю
В простейшем случае делают так:
Одна функция (регистрации) вызывает другую (получения кода) а другая функция возвращается полученный код по return.
def get_code():
    code = input('code, please:')
    return code

def authorise():
    reg_code = get_code()
    print(f'received code: {reg_code}')

authorise()

Заметки на полях
В вашем случае в коде вижу и FSM, и хранение каких-то данных в уникальных JSON, и всякое… тут по-хорошему вы, как автор кода, представляющий структуру и отношения между объектами, должен спроектировать свою программу и если не получается, приносить сюда уже конкретную проблему, что не получается при реализации, а не вот это.
Кроме того, вопрос популярный, и вы сначала обязаны поискать самостоятельно.


Как бы я сделал, зная то, что видно из фрагментов кода?
Первое, что приходит в голову, это хранение в JSON
раз у нас есть уникальные JSON, относящиеся каждый к своему аккаунту, почему бы не сделать там соотвествующий ключ и через него не передавать относящееся к соответствующему аккаунту значение? Изначально пусть None, периодически проверять его значение, по получении ключа пишем туда значение, если не None - завершаем регистрацию, используя это значение, после использования опять выставить None.

Но это так… первое, что пришло в голову. Тут есть много нюансов. Во-первых, возможно блокирование JSON-файлов и асинхронная гонка, соответственно надо сочинять какую-нибудь синхронизацию (а тут можно начудить так, что потом не распутать); во-вторых, не все хостинги поддерживают хранение созданных файлов; в-третьих, для этого придуманы Redis, in-memory SQLite и т.п.


Есть варианты с глобальной переменной-словарем, есть с БД, наверное есть и с FSM (я ее вообще не знаю, поэтому не могу советовать, но раз там есть метод set, то надо смотреть внимательно, может уже там всё предусмотрено).
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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