Не могу подтвердить девайс через бота Aiogram + Telethon
Телеграм выдает ошибку что кто-то чужой пытается войти в аккаунт но вхожу я, как это пофиксить
Incomplete login attempt. Dear User, Telegram blocked an attempt to log into your account from a new device on 09/06/2024 at 17:03:08 UTC.
Device: mdsadas, 1.35.0, Linux 5.15.0, Android, Ubuntu 20.04.6 LTS Location: Location
Nobody gained access to your chats because the login was not completed. The code was entered correctly, but sign in was not allowed, because this code was previously shared by your account.
Please don't share login codes with others, because they allow anyone to log in to your account and access your chats.
@txt_router.message(Txt.file)
async def process_txt_file(message: Message, state: FSMContext):
document = message.document
if document.mime_type == 'text/plain' and document.file_name.endswith('.txt'):
bot = message.bot
file = await bot.download(document)
file_path = f'files/new_file_user_id_{message.from_user.id}.txt'
with open(file_path, 'w', encoding='utf-8') as new_file:
file.seek(0)
new_file.write(file.read().decode('utf-8'))
client = TelegramClient(session_name, api_id, api_hash, device_model="Linux 5.15.0", system_version="Ubuntu 20.04.6 LTS")
await client.connect()
if not await client.is_user_authorized():
sent_code = await client.send_code_request(phone_number)
await state.update_data(phone_code_hash=sent_code.phone_code_hash, client=client, file_path=file_path)
await state.set_state(Txt.code)
print(await state.get_data())
await message.answer('Enter the code from telegram:')
else:
await state.clear()
return await process_file(api_id, api_hash, phone_number, message, bot, file_path)
else:
await message.answer("Please send a valid .txt file")
@txt_router.message(Txt.code)
async def auth_user(message: Message, state: FSMContext):
code = message.text
bot = message.bot
data = await state.get_data()
client = data['client']
file_path = data['file_path']
print(data)
try:
await client.sign_in(phone=phone_number, code=code, phone_code_hash=data['phone_code_hash'])
await message.answer('Successfully connected.')
await state.clear()
return await process_file(api_id, api_hash, phone_number, message, bot, file_path)
except PhoneCodeExpiredError:
await message.answer('The confirmation code has expired. Sending a new code...')
sent_code = await client.send_code_request(phone_number)
await state.update_data(phone_code_hash=sent_code.phone_code_hash)
await message.answer('Enter the new code from telegram:')
except PhoneCodeInvalidError:
await message.answer('The confirmation code is invalid. Please try again:')
except SessionPasswordNeededError:
await message.answer('Two-step verification is enabled. Please enter your password:')
password = await wait_for_code(state)
await client.sign_in(password=password)
await message.answer('Successfully connected.')
await state.clear()
return await process_file(api_id, api_hash, phone_number, message, bot, file_path)
Ответы (1 шт):
У Телеграма стоит система защиты для случаев, когда ты кому-то сообщаешь код доступа от своего конта. Тут е три варианта:
1) Обфусцировать код так, чтобы защита Телеграма не сработала. Например, пользователь может добавить в код 30712
какие-нибудь буквенные значения (3a0d7b1s2
) и ты будешь избавляться от них на сервере через регулярные выражения.
import re
code = re.sub(r"\D", "", "3a0d7b1s2")
print(code) #30712
Вось так оно реализовано, например, в одном из моих проектов.
2) Просто не отправлять свой код доступа со своего собсвенного конта и делать се через посредников.
3) Сделать отдельную клавиатуру, где с нажатием каждой кнопки, в состояние будет добавляться цифра кода (ну и чтобы данные состояния отображалось у пользователя в изменяющемся сообщении). Потом, когда пользователь подтвердит ввод, просто берёшь значение из состояния и отдаёшь telethon'у.
Лично я предпочитаю использовать третий вариант, так как он наиболее красивый и удобный для пользователя. Однако для более простых проектов можно использовать способ с обфускацией.