|
29 | 29 | from datetime import datetime, timedelta |
30 | 30 | from hashlib import sha256 |
31 | 31 | from importlib import import_module |
32 | | -from io import StringIO, BytesIO |
| 32 | +from io import BytesIO, StringIO |
33 | 33 | from mimetypes import MimeTypes |
34 | 34 | from pathlib import Path |
35 | | -from typing import Union, List, Optional, Callable, AsyncGenerator, Type |
| 35 | +from typing import AsyncGenerator, Callable, List, Optional, Type, Union |
36 | 36 |
|
37 | 37 | import pyrogram |
38 | | -from pyrogram import __version__, __license__ |
39 | | -from pyrogram import enums |
40 | | -from pyrogram import raw |
41 | | -from pyrogram import utils |
| 38 | +from pyrogram import __license__, __version__, enums, raw, utils |
42 | 39 | from pyrogram.crypto import aes |
43 | | -from pyrogram.errors import CDNFileHashMismatch |
44 | 40 | from pyrogram.errors import ( |
| 41 | + AuthBytesInvalid, |
| 42 | + BadRequest, |
| 43 | + CDNFileHashMismatch, |
| 44 | + ChannelPrivate, |
| 45 | + EmailNotAllowed, |
| 46 | + FloodPremiumWait, |
| 47 | + FloodWait, |
| 48 | + PersistentTimestampInvalid, |
| 49 | + PersistentTimestampOutdated, |
45 | 50 | SessionPasswordNeeded, |
46 | | - VolumeLocNotFound, ChannelPrivate, |
47 | | - BadRequest, AuthBytesInvalid, |
48 | | - FloodWait, FloodPremiumWait, |
49 | | - PersistentTimestampInvalid, PersistentTimestampOutdated |
| 51 | + VolumeLocNotFound, |
50 | 52 | ) |
51 | 53 | from pyrogram.handlers.handler import Handler |
52 | 54 | from pyrogram.methods import Methods |
| 55 | +from pyrogram.qrlogin import QRLogin |
53 | 56 | from pyrogram.session import Auth, Session |
54 | | -from pyrogram.storage import Storage, FileStorage, MemoryStorage |
55 | | -from pyrogram.types import User, TermsOfService, LinkPreviewOptions |
| 57 | +from pyrogram.storage import FileStorage, MemoryStorage, Storage |
| 58 | +from pyrogram.types import LinkPreviewOptions, TermsOfService, User |
56 | 59 | from pyrogram.utils import ainput |
57 | | -from pyrogram.qrlogin import QRLogin |
| 60 | + |
58 | 61 | from .connection import Connection |
59 | 62 | from .connection.transport import TCP, TCPAbridged |
60 | 63 | from .dispatcher import Dispatcher |
@@ -475,16 +478,53 @@ async def authorize(self) -> User: |
475 | 478 | else: |
476 | 479 | break |
477 | 480 |
|
478 | | - sent_code_descriptions = { |
479 | | - enums.SentCodeType.APP: "Telegram app", |
480 | | - enums.SentCodeType.SMS: "SMS", |
481 | | - enums.SentCodeType.CALL: "phone call", |
482 | | - enums.SentCodeType.FLASH_CALL: "phone flash call", |
483 | | - enums.SentCodeType.FRAGMENT_SMS: "Fragment SMS", |
484 | | - enums.SentCodeType.EMAIL_CODE: "email code" |
485 | | - } |
| 481 | + if sent_code.type == enums.SentCodeType.SETUP_EMAIL_REQUIRED: |
| 482 | + print("Setup email required for authorization") |
| 483 | + |
| 484 | + while True: |
| 485 | + try: |
| 486 | + email = await ainput("Enter email: ", loop=self.loop) |
| 487 | + |
| 488 | + await self.app.invoke( |
| 489 | + raw.functions.account.SendVerifyEmailCode( |
| 490 | + purpose=raw.types.EmailVerifyPurposeLoginSetup( |
| 491 | + phone_number=self.phone_number, |
| 492 | + phone_code_hash=sent_code.phone_code_hash, |
| 493 | + ), |
| 494 | + email=email, |
| 495 | + ) |
| 496 | + ) |
486 | 497 |
|
487 | | - print(f"The confirmation code has been sent via {sent_code_descriptions[sent_code.type]}") |
| 498 | + email_code = await ainput("Enter confirmation code: ", loop=self.loop) |
| 499 | + |
| 500 | + try: |
| 501 | + await self.app.invoke( |
| 502 | + raw.functions.account.VerifyEmail( |
| 503 | + purpose=raw.types.EmailVerifyPurposeLoginSetup( |
| 504 | + phone_number=self.phone_number, |
| 505 | + phone_code_hash=sent_code.phone_code_hash, |
| 506 | + ), |
| 507 | + verification=raw.types.EmailVerificationCode(code=email_code), |
| 508 | + ) |
| 509 | + ) |
| 510 | + except EmailNotAllowed: |
| 511 | + print("This email is not allowed for authorization") |
| 512 | + continue |
| 513 | + except BadRequest as e: |
| 514 | + print(e.MESSAGE) |
| 515 | + else: |
| 516 | + break |
| 517 | + else: |
| 518 | + sent_code_descriptions = { |
| 519 | + enums.SentCodeType.APP: "Telegram app", |
| 520 | + enums.SentCodeType.SMS: "SMS", |
| 521 | + enums.SentCodeType.CALL: "phone call", |
| 522 | + enums.SentCodeType.FLASH_CALL: "phone flash call", |
| 523 | + enums.SentCodeType.FRAGMENT_SMS: "Fragment", |
| 524 | + enums.SentCodeType.EMAIL_CODE: "email code" |
| 525 | + } |
| 526 | + |
| 527 | + print(f"The confirmation code has been sent via {sent_code_descriptions[sent_code.type]}") |
488 | 528 |
|
489 | 529 | while True: |
490 | 530 | if not self.phone_code: |
|
0 commit comments