Загрузка...

Script to get a code from a letter without authorization

Thread in Python created by НикотиновыйКодер Jul 5, 2023. (bumped May 20, 2024) 1,209 views

  1. НикотиновыйКодер



    [IMG]


    • Ускоряет ручную регистрацию акков с получением кода через письмо на почту
    • Работа с почтой выполняется в отдельном потоке через IMAP
    • Обработка ошибок
    • Копирование кода нажатием на кнопку
    • Поиск кода по регулярке
    • Сохранение значений регулярки и IMAP после повторного запуска программы


     
  2. kipsad
    выглядит солидно, оформлено красиво
     
  3. Stomi
    Stomi Jul 5, 2023 138 Feb 24, 2022
    Топ
     
  4. KOliShka
    KOliShka Jul 6, 2023 Banned 24 Apr 24, 2023
    А че так можно было?
     
  5. vtlstolyarov
    Пару комментов по коду - надо всё таки разделять код на зоны ответственности, а то у тебя всё в одной куче (хорошо хоть проверку письма вынес в отдельный файл) - я слегка модифицировал код и оставил пару комментов

    Python
    import email
    import imaplib
    import re

    from PyQt5.QtCore import QThread, pyqtSignal


    class GetCode(QThread):
    send_code = pyqtSignal(str)

    def __init__(self, mail_data, regular_string):
    super().__init__()
    self.mail_data = mail_data
    self.regular_string = regular_string

    def get_last_email_text(imap_server, username, password):
    # Подключение к почтовому серверу
    mail = imaplib.IMAP4_SSL(imap_server)
    mail.login(username, password)

    # Выбор почтового ящика (в данном случае - входящие)
    mail.select('INBOX')

    # Поиск последнего письма
    result, data = mail.search(None, 'ALL')

    # Тут может оказаться что почтовый ящик пустой и в нем нет писем вообще - ты это не проверяешь
    last_email_id = data[0].split()[-1]
    result, data = mail.fetch(last_email_id, '(RFC822)')

    # Извлечение текста письма
    raw_email = data[0][1]
    email_message = email.message_from_bytes(raw_email)
    text = ""

    if email_message.is_multipart():
    for part in email_message.walk():
    if part.get_content_type() == 'text/plain':
    text = part.get_payload(decode=True).decode('utf-8')
    else:
    text = email_message.get_payload(decode=True).decode('utf-8')

    # Закрытие соединения с почтовым сервером
    mail.close()
    mail.logout()

    return text


    def run(self):
    try:
    # это лучше делать снаружи класса и в конструктор передавать уже распаршенные данные
    # типа GetCode(IMAP_SERVER, username, password), потому что это не обязанность метода GetCode знать в каком формате у тебя данные - это знает UI
    split_string = self.mail_data.split(":")
    USERNAME = split_string[0]
    PASSWORD = split_string[1]
    IMAP_SERVER = 'imap.rambler.ru'
    except IndexError:
    self.send_code.emit("Неверные данные")
    return

    try:
    email_text = get_last_email_text(IMAP_SERVER, USERNAME, PASSWORD)

    # Извлечение кода с помощью регулярного выражения
    match = re.search(self.regular_string, email_text)
    if match:
    # а вот тут ты очень оптимистично думаешь что переданная в конструктор регулярка будет иметь хоть одну группу
    # (или что код будет именно в первой группе)
    code = match.group(1)
    self.send_code.emit(code)
    else:
    self.send_code.emit("Код не найден.")
    except imaplib.IMAP4_SSL.error as e:
    self.send_code.emit("Ошибка подключения")
    except imaplib.IMAP4.error as e:
    self.send_code.emit("Неверные данные")
    except Exception as e:
    print(e)
     
    1. НикотиновыйКодер Topic starter
    2. vtlstolyarov
      avatarНикотиновыйКодер, а зачем ты передаёшь параметры подключения если они доступны в self?
      Python
      def get_last_email_text(self):
      # Подключение к почтовому серверу
      mail = imaplib.IMAP4_SSL(self.IMAP_SERVER)
      mail.login(self.USERNAME, self.PASSWORD)
      и когда пишешь какой-то код его надо тестировать - ты пробовал запускать это на пустом ящике? ты же не проверяешь что текст письма может быть None и скармливаешь его регулярке, которая бросит ошибку. Кроме того когда ты делаешь ранний возврат в следующем коде, ты не закрываешь почтовый ящик - возвращать значение надо один раз - после того как ящик закрыт:
      Python
      if len(data[0].split()) == 0:
      self.send_code.emit("Почтовый ящик пуст")
      return None
  6. НикотиновыйКодер
    НикотиновыйКодер Topic starter Jul 9, 2023 2,395 Nov 5, 2022
    Доработал скрипт на обработку ошибки пустой почты
     
    1. vtlstolyarov
      avatarНикотиновыйКодер, А чем тебя не устраивала проверка
      Python
      if email_text == None:
      self.send_code.emit("Почтовый ящик пуст")
      return
      Зачем вводить это магическое значение "Empty"?

      И правильно обрабатывать регулярку ты не хочешь? https://github.com/Underneach/Get-Mail-Code-Rambler/commit/301fa92594e392a260aafe502595f100af87d7c7
  7. НикотиновыйКодер
    НикотиновыйКодер Topic starter Oct 1, 2023 2,395 Nov 5, 2022
    переход на pyside6
    реворк UI
    реворк бека
     
  8. пикми
    пикми Mar 1, 2026 донат в игры и стим тут!!! lolz.live/threads/9100644/
Loading...