diff --git a/README.md b/README.md index 0657935..9753539 100644 --- a/README.md +++ b/README.md @@ -18,8 +18,7 @@ dhapi buy-lotto645 -y # '로또6/45' 자동모드로 5장 구매 & 확인절차 - [로또6/45 구매](https://dhlottery.co.kr/gameInfo.do?method=gameMethod&wiselog=H_B_1_1) (`buy-lotto645`) - 자동, 수동, 반자동 모드로 구매 가능합니다. - 한 번에 최대 5장까지 구매 가능합니다. - - 매주 최대 5장까지 구매 가능합니다 (온라인 구매 제약사항입니다). - - 구매한 내역을 이메일로 전송할 수 있습니다. 고급 설정 섹션을 참고해주세요. + - 매주 최대 5장까지 구매 가능합니다 (동행복권 측의 온라인 구매 관련 정책입니다). - [예치금 현황 조회](https://dhlottery.co.kr/userSsl.do?method=myPage) (`show-balance`) - 현재 보유한 예치금 정보를 조회합니다. - [고정 가상계좌 입금을 위한 세팅](https://dhlottery.co.kr/userSsl.do?method=myPage) (`assign-virtual-account`) @@ -51,42 +50,10 @@ password = "dhlotter_second_pw" 이후 `-p` 플래그로 프로필을 골라 사용합니다. -### 이메일로 결과 전송 하기 - -> [!IMPORTANT] -> 아래 세팅대로 진행한다면 구매 결과를 담은 이메일이 아주 높은 확률로 스팸 메일함에 들어갑니다. 이럴 경우 해당 메일을 찾아서 '스팸이 아님' 체크를 해야 이후 메일들이 일반 메일함에 들어갑니다. - - -`-e` 플래그로 수신할 이메일을 지정합니다. 이렇게 하면 **콘솔에 결과가 출력되지 않고 지정한 이메일로 전송됩니다.** 아래 세팅이 추가적으로 필요합니다. - -무료로 이메일을 보내기 위해 [Mailjet](https://www.mailjet.com/)을 사용합니다. 가입한 후, API KEY, SECRET KEY 를 발급합니다 (https://app.mailjet.com/account/apikeys). - -키 정보를 ~/.dhapi/credentials 파일에 다음과 같이 기입합니다. - -```text -[default] -username = "dhlotter_id" -password = "dhlotter_pw" -mailjet_api_key = "YOUR_API_KEY" -mailjet_api_secret = "YOUR_SECRET_KEY" -mailjet_sender_email = "YOUR_MAILJET_EMAIL" -[another_profile] -... -``` - -이메일 전송이 필요한 프로필에만 세팅하면 됩니다. - -> [!WARNING] -> `mailjet_sender_email` 값은 '발신 이메일 주소'로 활용되며, Mailjet 회원가입에 사용한 이메일이 아닐 경우 Mailjet 사이트에서 추가로 도메인 인증 절차를 거쳐야 합니다. -> -> 따로 세팅을 하지 않은 상태로 별도의 이메일을 기입하게 되면, 실제 메일이 발송되지 않고 'Senders and domains page'를 확인하라는 안내 메일을 받게 됩니다. - ## 기부하기 이 프로그램을 사용해서 1등에 당첨된다면, 저에게 꼭 1000만원을 기부해주시길 바랍니다. -Toss Donation QR Code - 그리고 딱히 당첨된 적은 없지만 그래도 커피를 사주고 싶다면, 절대 망설이지 마십시오. [!["Buy Me A Coffee"](https://www.buymeacoffee.com/assets/img/custom_images/yellow_img.png)](https://www.buymeacoffee.com/roeniss) diff --git a/src/dhapi/domain/email_form.py b/src/dhapi/domain/email_form.py deleted file mode 100644 index 0d600da..0000000 --- a/src/dhapi/domain/email_form.py +++ /dev/null @@ -1,6 +0,0 @@ -class EmailForm: - def __init__(self, api_key, api_secret, sender_email, recipient_email): - self.api_key = api_key - self.api_secret = api_secret - self.sender_email = sender_email - self.recipient_email = recipient_email diff --git a/src/dhapi/endpoint/lottery_email_sender.py b/src/dhapi/endpoint/lottery_email_sender.py deleted file mode 100644 index d27f7a4..0000000 --- a/src/dhapi/endpoint/lottery_email_sender.py +++ /dev/null @@ -1,13 +0,0 @@ -import logging - -logger = logging.getLogger(__name__) - - -class LotteryEmailSender: - def __init__(self, email_client, sender_email, recipient_email): - self._email_client = email_client - self._sender_email = sender_email - self._recipient_email = recipient_email - - def send_email(self, subject, body): - self._email_client.send_email(self._sender_email, "동행복권 API", self._recipient_email, self._recipient_email, subject, body) diff --git a/src/dhapi/port/credentials_provider.py b/src/dhapi/port/credentials_provider.py index 3b1a3f2..0844cf5 100644 --- a/src/dhapi/port/credentials_provider.py +++ b/src/dhapi/port/credentials_provider.py @@ -4,7 +4,6 @@ import tomli import tomli_w -from dhapi.domain.email_form import EmailForm from dhapi.domain.user import User logger = logging.getLogger(__name__) @@ -23,9 +22,6 @@ def _get(self, key): def get_user(self) -> User: return User(self._get("username"), self._get("password")) - def get_email_form(self, recipient_email: str) -> EmailForm: - return EmailForm(self._get("mailjet_api_key"), self._get("mailjet_api_secret"), self._get("mailjet_sender_email"), recipient_email) - def _get_credentials(self, profile_name): try: _ = self._read_credentials_file(profile_name) diff --git a/src/dhapi/port/mailjet_email_client.py b/src/dhapi/port/mailjet_email_client.py deleted file mode 100644 index 125eecb..0000000 --- a/src/dhapi/port/mailjet_email_client.py +++ /dev/null @@ -1,34 +0,0 @@ -import logging - -from mailjet_rest import Client - -logger = logging.getLogger(__name__) - - -class MailjetEmailClient: - def __init__(self, api_key, api_secret): - self._mailjet = Client(auth=(api_key, api_secret), version="v3.1") - - def send_email(self, sender_email, sender_name, recipient_email, recipient_name, subject, body): - data = { - "Messages": [ - { - "From": {"Email": sender_email, "Name": sender_name}, - "To": [{"Email": recipient_email, "Name": recipient_name}], - "Subject": subject, - "TextPart": body, - "HTMLPart": "", - } - ] - } - - result = self._mailjet.send.create(data=data) - logger.debug(f"status_code: {result.status_code}") - - json = result.json() - logger.debug(f"result.json: {json}") - - if result.status_code == 200: - print("✉️ 메일 전송에 성공했습니다.") - else: - raise RuntimeError(f"❗ 메일 전송에 실패했습니다. (result.json: {json})") diff --git a/src/dhapi/router/dependency_factory.py b/src/dhapi/router/dependency_factory.py index b041998..8b9152d 100644 --- a/src/dhapi/router/dependency_factory.py +++ b/src/dhapi/router/dependency_factory.py @@ -1,18 +1,13 @@ -from typing import Optional - -from dhapi.domain.email_form import EmailForm from dhapi.domain.user import User -from dhapi.endpoint.lottery_email_sender import LotteryEmailSender from dhapi.endpoint.lottery_stdout_printer import LotteryStdoutPrinter from dhapi.endpoint.version_stdout_printer import VersionStdoutPrinter from dhapi.meta.version_provider import VersionProvider from dhapi.port.lottery_client import LotteryClient -from dhapi.port.mailjet_email_client import MailjetEmailClient from dhapi.purchase.lotto645_buy_confirmer import Lotto645BuyConfirmer -def build_lottery_client(user_profile: User, email_form: Optional[EmailForm]): - lottery_endpoint = build_lottery_endpoint(email_form) +def build_lottery_client(user_profile: User): + lottery_endpoint = build_lottery_endpoint() return LotteryClient(user_profile, lottery_endpoint) @@ -20,16 +15,8 @@ def build_lotto645_buy_confirmer(): return Lotto645BuyConfirmer() -def build_email_client(api_key, api_secret): - return MailjetEmailClient(api_key, api_secret) - - -def build_lottery_endpoint(email_form: EmailForm): - if email_form: - email_client = build_email_client(email_form.api_key, email_form.api_secret) - return LotteryEmailSender(email_client, email_form.sender_email, email_form.recipient_email) - else: - return LotteryStdoutPrinter() +def build_lottery_endpoint(): + return LotteryStdoutPrinter() def build_version_provider(): diff --git a/src/dhapi/router/router.py b/src/dhapi/router/router.py index 1c719b3..beaa6f3 100644 --- a/src/dhapi/router/router.py +++ b/src/dhapi/router/router.py @@ -38,16 +38,16 @@ def version_callback(show_version: Optional[bool]): """, ) def assign_virtual_account( - amount: Annotated[ - int, typer.Argument(help="입금할 금액을 지정합니다 (5천원, 1만원, 2만원, 3만원, 5만원, 10만원, 20만원, 30만원, 50만원, 70만원, 100만원 중 하나)", metavar="amount") - ] = 50000, - profile: Annotated[str, typer.Option("-p", "--profile", help="프로필을 지정합니다", metavar="")] = "default", - _debug: Annotated[bool, typer.Option("-d", "--debug", help="debug 로그를 활성화합니다.", callback=logger_callback)] = False, + amount: Annotated[ + int, typer.Argument(help="입금할 금액을 지정합니다 (5천원, 1만원, 2만원, 3만원, 5만원, 10만원, 20만원, 30만원, 50만원, 70만원, 100만원 중 하나)", metavar="amount") + ] = 50000, + profile: Annotated[str, typer.Option("-p", "--profile", help="프로필을 지정합니다", metavar="")] = "default", + _debug: Annotated[bool, typer.Option("-d", "--debug", help="debug 로그를 활성화합니다.", callback=logger_callback)] = False, ): user = CredentialsProvider(profile).get_user() deposit = Deposit(amount) - client = build_lottery_client(user, None) + client = build_lottery_client(user) client.assign_virtual_account(deposit) @@ -57,12 +57,12 @@ def assign_virtual_account( """ ) def show_balance( - profile: Annotated[str, typer.Option("-p", "--profile", help="프로필을 지정합니다", metavar="")] = "default", - _debug: Annotated[bool, typer.Option("-d", "--debug", help="debug 로그를 활성화합니다.", callback=logger_callback)] = False, + profile: Annotated[str, typer.Option("-p", "--profile", help="프로필을 지정합니다", metavar="")] = "default", + _debug: Annotated[bool, typer.Option("-d", "--debug", help="debug 로그를 활성화합니다.", callback=logger_callback)] = False, ): user = CredentialsProvider(profile).get_user() - client = build_lottery_client(user, None) + client = build_lottery_client(user) client.show_balance() @@ -88,18 +88,16 @@ def show_balance( """ ) def buy_lotto645( - tickets: Annotated[List[str], typer.Argument(help="구매할 번호를 입력합니다. 생략 시 자동모드로 5장 구매합니다.", metavar="tickets", show_default=False)] = None, - email: Annotated[str, typer.Option("-e", "--email", metavar="", help="구매 결과를 표준 출력이 아니라 지정한 이메일로 전송합니다.")] = None, - always_yes: Annotated[bool, typer.Option("-y", "--yes", help="구매 전 확인 절차를 스킵합니다.")] = False, - profile: Annotated[str, typer.Option("-p", "--profile", help="프로필을 지정합니다", metavar="")] = "default", - _debug: Annotated[bool, typer.Option("-d", "--debug", help="debug 로그를 활성화합니다.", callback=logger_callback)] = False, + tickets: Annotated[List[str], typer.Argument(help="구매할 번호를 입력합니다. 생략 시 자동모드로 5장 구매합니다.", metavar="tickets", show_default=False)] = None, + always_yes: Annotated[bool, typer.Option("-y", "--yes", help="구매 전 확인 절차를 스킵합니다.")] = False, + profile: Annotated[str, typer.Option("-p", "--profile", help="프로필을 지정합니다", metavar="")] = "default", + _debug: Annotated[bool, typer.Option("-d", "--debug", help="debug 로그를 활성화합니다.", callback=logger_callback)] = False, ): cred = CredentialsProvider(profile) user = cred.get_user() - form = cred.get_email_form(email) if email else None tickets = Lotto645Ticket.create_tickets(tickets) if tickets else Lotto645Ticket.create_auto_tickets(count=5) - client = build_lottery_client(user, form) + client = build_lottery_client(user) confirmer = build_lotto645_buy_confirmer() ok = confirmer.confirm(tickets, always_yes) diff --git a/tests/dhapi/endpoint/__init__.py b/tests/dhapi/endpoint/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/tests/dhapi/endpoint/test_lottery_email_sender.py b/tests/dhapi/endpoint/test_lottery_email_sender.py deleted file mode 100644 index 72d2adc..0000000 --- a/tests/dhapi/endpoint/test_lottery_email_sender.py +++ /dev/null @@ -1,12 +0,0 @@ -from pytest_mock import MockerFixture - -from dhapi.endpoint.lottery_email_sender import LotteryEmailSender - - -def test_send_email_call_email_client_with_expected_arguments(mocker: MockerFixture): - mock_client = mocker.patch('dhapi.port.mailjet_email_client.MailjetEmailClient') - sut = LotteryEmailSender(mock_client, "sender@email.com", "recipient@email.com") - - sut.send_email("subject", "body") - - mock_client.send_email.assert_called_once_with("sender@email.com", "동행복권 API", "recipient@email.com", "recipient@email.com", "subject", "body") diff --git a/tests/dhapi/port/__init__.py b/tests/dhapi/port/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/tests/dhapi/port/test_mailjet_email_client.py b/tests/dhapi/port/test_mailjet_email_client.py deleted file mode 100644 index d582fc3..0000000 --- a/tests/dhapi/port/test_mailjet_email_client.py +++ /dev/null @@ -1,10 +0,0 @@ -import pytest - -from dhapi.port.mailjet_email_client import MailjetEmailClient - - -@pytest.mark.skip("sending real email is not needed after checking success") -def test_send_email(): - sut = MailjetEmailClient("TO_EMAIL", "FROM_EMAIL", "API_KEY", "SECRET_KEY") - - sut.send_email("hello", "world")