dhapi


Namedhapi JSON
Version 4.0.3 PyPI version JSON
download
home_pagehttps://github.com/roeniss/dhlottery-api
Summary동행복권 비공식 API
upload_time2024-03-10 12:39:12
maintainer
docs_urlNone
authorRoeniss Moon
requires_python>=3.8, <4
license
keywords donghaeng lottery lotto645 api korean
VCS
bugtrack_url
requirements beautifulsoup4 certifi charset-normalizer exceptiongroup html5lib idna iniconfig packaging pluggy pytest requests six soupsieve tomli urllib3 webencodings tomli-w mailjet-rest pytz typer rich pytest-mock
Travis-CI No Travis.
coveralls test coverage No coveralls.
            # 비공식 동행복권 API

[![PyPI version](https://badge.fury.io/py/dhapi.svg)](https://badge.fury.io/py/dhapi)

[동행복권](https://dhlottery.co.kr/) 사이트를 터미널에서 이용할 수 있게 랩핑한 API입니다.

### 설치 밎 사용법

```sh
pip install dhapi --upgrade # pip 최신 버전을 권장합니다: pip install --upgrade pip
dhapi --help # 기본 도움말 보기 
dhapi buy-lotto645 --help # '로또6/45' 구매 명령어의 도움말 보기
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장까지 구매 가능합니다 (온라인 구매 제약사항입니다).
    - 구매한 내역을 이메일로 전송할 수 있습니다. 고급 설정 섹션을 참고해주세요.
- [예치금 현황 조회](https://dhlottery.co.kr/userSsl.do?method=myPage) (`show-balance`)
    - 현재 보유한 예치금 정보를 조회합니다.
- [고정 가상계좌 입금을 위한 세팅](https://dhlottery.co.kr/userSsl.do?method=myPage) (`assign-virtual-account`)
    - 개인에게 할당된 가상계좌에 입금하는 형태로 예치금을 충전할 수 있습니다. 이 때 얼마를 입금할건지 사이트에서 미리 선택해두어야 하는데, 이 작업을 대신 수행합니다.
    - 입금은 직접 진행해야 합니다.
    - 간편 충전 기능은 구현되지 않았습니다.

### 유틸성 기능들

- 복수 프로필 지정
    - 두 개 이상의 프로필을 사용할 수 있습니다. 고급 설정 섹션을 참고해주세요.

## 고급 설정

### 프로필 (계정) 설정

> [!NOTE] 최초 프로그램을 실행할 때 프로필 정보를 세팅하는 과정이 진행됩니다. 이 섹션에선 직접 프로필 정보 파일을 수정하는 법을 안내합니다.

`~/.dhapi/credentials` 파일을 사용해 프로필 정보를 수정하거나 여러 계정을 설정할 수 있습니다. toml 포맷을 사용하고 있으며, 아래와 같은 형식으로 작성할 수 있습니다.

```toml
[default]
username = "dhlotter_id"
password = "dhlotter_pw"
[another_profile]
username = "dhlotter_second_id"
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만원을 기부해주시길 바랍니다.

<img alt="Toss Donation QR Code" src="https://github.com/roeniss/dhlottery-api/blob/b4d616033099f4c0fe38a5360017465fc88ff618/docs/toss_donation_qr.png?raw=true" width="300" />

그리고 딱히 당첨된 적은 없지만 그래도 커피를 사주고 싶다면, 절대 망설이지 마십시오.

[!["Buy Me A Coffee"](https://www.buymeacoffee.com/assets/img/custom_images/yellow_img.png)](https://www.buymeacoffee.com/roeniss)

## 기여하기

기여는 대환영입니다! [CONTRIBUTING.md](/docs/CONTRIBUTING.md) 파일을 참고해주세요.

            

Raw data

            {
    "_id": null,
    "home_page": "https://github.com/roeniss/dhlottery-api",
    "name": "dhapi",
    "maintainer": "",
    "docs_url": null,
    "requires_python": ">=3.8, <4",
    "maintainer_email": "",
    "keywords": "donghaeng,lottery,lotto645,api,korean",
    "author": "Roeniss Moon",
    "author_email": "roeniss2@gmail.com",
    "download_url": "https://files.pythonhosted.org/packages/34/e7/cff259faab69a225b854dcbb708f20ca977aa33b33284bfc7caf2e11437a/dhapi-4.0.3.tar.gz",
    "platform": null,
    "description": "# \ube44\uacf5\uc2dd \ub3d9\ud589\ubcf5\uad8c API\n\n[![PyPI version](https://badge.fury.io/py/dhapi.svg)](https://badge.fury.io/py/dhapi)\n\n[\ub3d9\ud589\ubcf5\uad8c](https://dhlottery.co.kr/) \uc0ac\uc774\ud2b8\ub97c \ud130\ubbf8\ub110\uc5d0\uc11c \uc774\uc6a9\ud560 \uc218 \uc788\uac8c \ub7a9\ud551\ud55c API\uc785\ub2c8\ub2e4.\n\n### \uc124\uce58 \ubc0e \uc0ac\uc6a9\ubc95\n\n```sh\npip install dhapi --upgrade # pip \ucd5c\uc2e0 \ubc84\uc804\uc744 \uad8c\uc7a5\ud569\ub2c8\ub2e4: pip install --upgrade pip\ndhapi --help # \uae30\ubcf8 \ub3c4\uc6c0\ub9d0 \ubcf4\uae30 \ndhapi buy-lotto645 --help # '\ub85c\ub6106/45' \uad6c\ub9e4 \uba85\ub839\uc5b4\uc758 \ub3c4\uc6c0\ub9d0 \ubcf4\uae30\ndhapi buy-lotto645 -y # '\ub85c\ub6106/45' \uc790\ub3d9\ubaa8\ub4dc\ub85c 5\uc7a5 \uad6c\ub9e4 & \ud655\uc778\uc808\ucc28 \uc2a4\ud0b5\n```\n\n## \uad6c\ud604\ub41c \uae30\ub2a5\ub4e4\n\n- [\ub85c\ub6106/45 \uad6c\ub9e4](https://dhlottery.co.kr/gameInfo.do?method=gameMethod&wiselog=H_B_1_1) (`buy-lotto645`)\n    - \uc790\ub3d9, \uc218\ub3d9, \ubc18\uc790\ub3d9 \ubaa8\ub4dc\ub85c \uad6c\ub9e4 \uac00\ub2a5\ud569\ub2c8\ub2e4.\n    - \ud55c \ubc88\uc5d0 \ucd5c\ub300 5\uc7a5\uae4c\uc9c0 \uad6c\ub9e4 \uac00\ub2a5\ud569\ub2c8\ub2e4.\n    - \ub9e4\uc8fc \ucd5c\ub300 5\uc7a5\uae4c\uc9c0 \uad6c\ub9e4 \uac00\ub2a5\ud569\ub2c8\ub2e4 (\uc628\ub77c\uc778 \uad6c\ub9e4 \uc81c\uc57d\uc0ac\ud56d\uc785\ub2c8\ub2e4).\n    - \uad6c\ub9e4\ud55c \ub0b4\uc5ed\uc744 \uc774\uba54\uc77c\ub85c \uc804\uc1a1\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uace0\uae09 \uc124\uc815 \uc139\uc158\uc744 \ucc38\uace0\ud574\uc8fc\uc138\uc694.\n- [\uc608\uce58\uae08 \ud604\ud669 \uc870\ud68c](https://dhlottery.co.kr/userSsl.do?method=myPage) (`show-balance`)\n    - \ud604\uc7ac \ubcf4\uc720\ud55c \uc608\uce58\uae08 \uc815\ubcf4\ub97c \uc870\ud68c\ud569\ub2c8\ub2e4.\n- [\uace0\uc815 \uac00\uc0c1\uacc4\uc88c \uc785\uae08\uc744 \uc704\ud55c \uc138\ud305](https://dhlottery.co.kr/userSsl.do?method=myPage) (`assign-virtual-account`)\n    - \uac1c\uc778\uc5d0\uac8c \ud560\ub2f9\ub41c \uac00\uc0c1\uacc4\uc88c\uc5d0 \uc785\uae08\ud558\ub294 \ud615\ud0dc\ub85c \uc608\uce58\uae08\uc744 \ucda9\uc804\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uc774 \ub54c \uc5bc\ub9c8\ub97c \uc785\uae08\ud560\uac74\uc9c0 \uc0ac\uc774\ud2b8\uc5d0\uc11c \ubbf8\ub9ac \uc120\ud0dd\ud574\ub450\uc5b4\uc57c \ud558\ub294\ub370, \uc774 \uc791\uc5c5\uc744 \ub300\uc2e0 \uc218\ud589\ud569\ub2c8\ub2e4.\n    - \uc785\uae08\uc740 \uc9c1\uc811 \uc9c4\ud589\ud574\uc57c \ud569\ub2c8\ub2e4.\n    - \uac04\ud3b8 \ucda9\uc804 \uae30\ub2a5\uc740 \uad6c\ud604\ub418\uc9c0 \uc54a\uc558\uc2b5\ub2c8\ub2e4.\n\n### \uc720\ud2f8\uc131 \uae30\ub2a5\ub4e4\n\n- \ubcf5\uc218 \ud504\ub85c\ud544 \uc9c0\uc815\n    - \ub450 \uac1c \uc774\uc0c1\uc758 \ud504\ub85c\ud544\uc744 \uc0ac\uc6a9\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uace0\uae09 \uc124\uc815 \uc139\uc158\uc744 \ucc38\uace0\ud574\uc8fc\uc138\uc694.\n\n## \uace0\uae09 \uc124\uc815\n\n### \ud504\ub85c\ud544 (\uacc4\uc815) \uc124\uc815\n\n> [!NOTE] \ucd5c\ucd08 \ud504\ub85c\uadf8\ub7a8\uc744 \uc2e4\ud589\ud560 \ub54c \ud504\ub85c\ud544 \uc815\ubcf4\ub97c \uc138\ud305\ud558\ub294 \uacfc\uc815\uc774 \uc9c4\ud589\ub429\ub2c8\ub2e4. \uc774 \uc139\uc158\uc5d0\uc120 \uc9c1\uc811 \ud504\ub85c\ud544 \uc815\ubcf4 \ud30c\uc77c\uc744 \uc218\uc815\ud558\ub294 \ubc95\uc744 \uc548\ub0b4\ud569\ub2c8\ub2e4.\n\n`~/.dhapi/credentials` \ud30c\uc77c\uc744 \uc0ac\uc6a9\ud574 \ud504\ub85c\ud544 \uc815\ubcf4\ub97c \uc218\uc815\ud558\uac70\ub098 \uc5ec\ub7ec \uacc4\uc815\uc744 \uc124\uc815\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. toml \ud3ec\ub9f7\uc744 \uc0ac\uc6a9\ud558\uace0 \uc788\uc73c\uba70, \uc544\ub798\uc640 \uac19\uc740 \ud615\uc2dd\uc73c\ub85c \uc791\uc131\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.\n\n```toml\n[default]\nusername = \"dhlotter_id\"\npassword = \"dhlotter_pw\"\n[another_profile]\nusername = \"dhlotter_second_id\"\npassword = \"dhlotter_second_pw\"\n```\n\n\uc774\ud6c4 `-p` \ud50c\ub798\uadf8\ub85c \ud504\ub85c\ud544\uc744 \uace8\ub77c \uc0ac\uc6a9\ud569\ub2c8\ub2e4.\n\n### \uc774\uba54\uc77c\ub85c \uacb0\uacfc \uc804\uc1a1 \ud558\uae30\n\n> [!IMPORTANT]  \n> \uc544\ub798 \uc138\ud305\ub300\ub85c \uc9c4\ud589\ud55c\ub2e4\uba74 \uad6c\ub9e4 \uacb0\uacfc\ub97c \ub2f4\uc740 \uc774\uba54\uc77c\uc774 \uc544\uc8fc \ub192\uc740 \ud655\ub960\ub85c \uc2a4\ud338 \uba54\uc77c\ud568\uc5d0 \ub4e4\uc5b4\uac11\ub2c8\ub2e4. \uc774\ub7f4 \uacbd\uc6b0 \ud574\ub2f9 \uba54\uc77c\uc744 \ucc3e\uc544\uc11c '\uc2a4\ud338\uc774 \uc544\ub2d8' \uccb4\ud06c\ub97c \ud574\uc57c \uc774\ud6c4 \uba54\uc77c\ub4e4\uc774 \uc77c\ubc18 \uba54\uc77c\ud568\uc5d0 \ub4e4\uc5b4\uac11\ub2c8\ub2e4.\n\n\n`-e` \ud50c\ub798\uadf8\ub85c \uc218\uc2e0\ud560 \uc774\uba54\uc77c\uc744 \uc9c0\uc815\ud569\ub2c8\ub2e4. \uc774\ub807\uac8c \ud558\uba74 **\ucf58\uc194\uc5d0 \uacb0\uacfc\uac00 \ucd9c\ub825\ub418\uc9c0 \uc54a\uace0 \uc9c0\uc815\ud55c \uc774\uba54\uc77c\ub85c \uc804\uc1a1\ub429\ub2c8\ub2e4.** \uc544\ub798 \uc138\ud305\uc774 \ucd94\uac00\uc801\uc73c\ub85c \ud544\uc694\ud569\ub2c8\ub2e4.\n\n\ubb34\ub8cc\ub85c \uc774\uba54\uc77c\uc744 \ubcf4\ub0b4\uae30 \uc704\ud574 [Mailjet](https://www.mailjet.com/)\uc744 \uc0ac\uc6a9\ud569\ub2c8\ub2e4. \uac00\uc785\ud55c \ud6c4, API KEY, SECRET KEY \ub97c \ubc1c\uae09\ud569\ub2c8\ub2e4 (https://app.mailjet.com/account/apikeys).\n\n\ud0a4 \uc815\ubcf4\ub97c ~/.dhapi/credentials \ud30c\uc77c\uc5d0 \ub2e4\uc74c\uacfc \uac19\uc774 \uae30\uc785\ud569\ub2c8\ub2e4.\n\n```text\n[default]\nusername = \"dhlotter_id\"\npassword = \"dhlotter_pw\"\nmailjet_api_key = \"YOUR_API_KEY\"\nmailjet_api_secret = \"YOUR_SECRET_KEY\"\nmailjet_sender_email = \"YOUR_MAILJET_EMAIL\"\n[another_profile]\n...\n```\n\n\uc774\uba54\uc77c \uc804\uc1a1\uc774 \ud544\uc694\ud55c \ud504\ub85c\ud544\uc5d0\ub9cc \uc138\ud305\ud558\uba74 \ub429\ub2c8\ub2e4.\n\n> [!WARNING]  \n> `mailjet_sender_email` \uac12\uc740 '\ubc1c\uc2e0 \uc774\uba54\uc77c \uc8fc\uc18c'\ub85c \ud65c\uc6a9\ub418\uba70, Mailjet \ud68c\uc6d0\uac00\uc785\uc5d0 \uc0ac\uc6a9\ud55c \uc774\uba54\uc77c\uc774 \uc544\ub2d0 \uacbd\uc6b0 Mailjet \uc0ac\uc774\ud2b8\uc5d0\uc11c \ucd94\uac00\ub85c \ub3c4\uba54\uc778 \uc778\uc99d \uc808\ucc28\ub97c \uac70\uccd0\uc57c \ud569\ub2c8\ub2e4.\n>\n> \ub530\ub85c \uc138\ud305\uc744 \ud558\uc9c0 \uc54a\uc740 \uc0c1\ud0dc\ub85c \ubcc4\ub3c4\uc758 \uc774\uba54\uc77c\uc744 \uae30\uc785\ud558\uac8c \ub418\uba74, \uc2e4\uc81c \uba54\uc77c\uc774 \ubc1c\uc1a1\ub418\uc9c0 \uc54a\uace0 'Senders and domains page'\ub97c \ud655\uc778\ud558\ub77c\ub294 \uc548\ub0b4 \uba54\uc77c\uc744 \ubc1b\uac8c \ub429\ub2c8\ub2e4.\n\n## \uae30\ubd80\ud558\uae30\n\n\uc774 \ud504\ub85c\uadf8\ub7a8\uc744 \uc0ac\uc6a9\ud574\uc11c 1\ub4f1\uc5d0 \ub2f9\ucca8\ub41c\ub2e4\uba74, \uc800\uc5d0\uac8c \uaf2d 1000\ub9cc\uc6d0\uc744 \uae30\ubd80\ud574\uc8fc\uc2dc\uae38 \ubc14\ub78d\ub2c8\ub2e4.\n\n<img alt=\"Toss Donation QR Code\" src=\"https://github.com/roeniss/dhlottery-api/blob/b4d616033099f4c0fe38a5360017465fc88ff618/docs/toss_donation_qr.png?raw=true\" width=\"300\" />\n\n\uadf8\ub9ac\uace0 \ub531\ud788 \ub2f9\ucca8\ub41c \uc801\uc740 \uc5c6\uc9c0\ub9cc \uadf8\ub798\ub3c4 \ucee4\ud53c\ub97c \uc0ac\uc8fc\uace0 \uc2f6\ub2e4\uba74, \uc808\ub300 \ub9dd\uc124\uc774\uc9c0 \ub9c8\uc2ed\uc2dc\uc624.\n\n[![\"Buy Me A Coffee\"](https://www.buymeacoffee.com/assets/img/custom_images/yellow_img.png)](https://www.buymeacoffee.com/roeniss)\n\n## \uae30\uc5ec\ud558\uae30\n\n\uae30\uc5ec\ub294 \ub300\ud658\uc601\uc785\ub2c8\ub2e4! [CONTRIBUTING.md](/docs/CONTRIBUTING.md) \ud30c\uc77c\uc744 \ucc38\uace0\ud574\uc8fc\uc138\uc694.\n",
    "bugtrack_url": null,
    "license": "",
    "summary": "\ub3d9\ud589\ubcf5\uad8c \ube44\uacf5\uc2dd API",
    "version": "4.0.3",
    "project_urls": {
        "Bug Reports": "https://github.com/roeniss/dhlottery-api/issues",
        "Homepage": "https://github.com/roeniss/dhlottery-api",
        "Source": "https://github.com/roeniss/dhlottery-api/"
    },
    "split_keywords": [
        "donghaeng",
        "lottery",
        "lotto645",
        "api",
        "korean"
    ],
    "urls": [
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "fdce9c08cfde979907feccbc15e242e9b2b67b9ae61987b64dd8a700b627d918",
                "md5": "71cc59e4ecc92bb8a61fe58368856849",
                "sha256": "f5242ef3de67fd2a7719b0c1c964ea305ac2c047839d1ea85be2d5e8bcc3183b"
            },
            "downloads": -1,
            "filename": "dhapi-4.0.3-py3-none-any.whl",
            "has_sig": false,
            "md5_digest": "71cc59e4ecc92bb8a61fe58368856849",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": ">=3.8, <4",
            "size": 23065,
            "upload_time": "2024-03-10T12:39:10",
            "upload_time_iso_8601": "2024-03-10T12:39:10.449045Z",
            "url": "https://files.pythonhosted.org/packages/fd/ce/9c08cfde979907feccbc15e242e9b2b67b9ae61987b64dd8a700b627d918/dhapi-4.0.3-py3-none-any.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "34e7cff259faab69a225b854dcbb708f20ca977aa33b33284bfc7caf2e11437a",
                "md5": "41e01d50f6ba6ec85e6e0d756aa59560",
                "sha256": "b66e056ca662abca1d1b4dad02b90efabf1250d4fad31bd21c1d5a3930be29ed"
            },
            "downloads": -1,
            "filename": "dhapi-4.0.3.tar.gz",
            "has_sig": false,
            "md5_digest": "41e01d50f6ba6ec85e6e0d756aa59560",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": ">=3.8, <4",
            "size": 20642,
            "upload_time": "2024-03-10T12:39:12",
            "upload_time_iso_8601": "2024-03-10T12:39:12.234308Z",
            "url": "https://files.pythonhosted.org/packages/34/e7/cff259faab69a225b854dcbb708f20ca977aa33b33284bfc7caf2e11437a/dhapi-4.0.3.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2024-03-10 12:39:12",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "github_user": "roeniss",
    "github_project": "dhlottery-api",
    "travis_ci": false,
    "coveralls": false,
    "github_actions": true,
    "requirements": [
        {
            "name": "beautifulsoup4",
            "specs": [
                [
                    "==",
                    "4.12.2"
                ]
            ]
        },
        {
            "name": "certifi",
            "specs": [
                [
                    "==",
                    "2023.11.17"
                ]
            ]
        },
        {
            "name": "charset-normalizer",
            "specs": [
                [
                    "==",
                    "3.3.2"
                ]
            ]
        },
        {
            "name": "exceptiongroup",
            "specs": [
                [
                    "==",
                    "1.2.0"
                ]
            ]
        },
        {
            "name": "html5lib",
            "specs": [
                [
                    "==",
                    "1.1"
                ]
            ]
        },
        {
            "name": "idna",
            "specs": [
                [
                    "==",
                    "3.6"
                ]
            ]
        },
        {
            "name": "iniconfig",
            "specs": [
                [
                    "==",
                    "2.0.0"
                ]
            ]
        },
        {
            "name": "packaging",
            "specs": [
                [
                    "==",
                    "23.2"
                ]
            ]
        },
        {
            "name": "pluggy",
            "specs": [
                [
                    "==",
                    "1.3.0"
                ]
            ]
        },
        {
            "name": "pytest",
            "specs": [
                [
                    "==",
                    "7.4.4"
                ]
            ]
        },
        {
            "name": "requests",
            "specs": [
                [
                    "==",
                    "2.28.2"
                ]
            ]
        },
        {
            "name": "six",
            "specs": [
                [
                    "==",
                    "1.16.0"
                ]
            ]
        },
        {
            "name": "soupsieve",
            "specs": [
                [
                    "==",
                    "2.5"
                ]
            ]
        },
        {
            "name": "tomli",
            "specs": [
                [
                    "==",
                    "2.0.1"
                ]
            ]
        },
        {
            "name": "urllib3",
            "specs": [
                [
                    "==",
                    "1.26.18"
                ]
            ]
        },
        {
            "name": "webencodings",
            "specs": [
                [
                    "==",
                    "0.5.1"
                ]
            ]
        },
        {
            "name": "tomli-w",
            "specs": [
                [
                    "==",
                    "1.0.0"
                ]
            ]
        },
        {
            "name": "mailjet-rest",
            "specs": [
                [
                    "==",
                    "1.3.4"
                ]
            ]
        },
        {
            "name": "pytz",
            "specs": [
                [
                    "==",
                    "2024.1"
                ]
            ]
        },
        {
            "name": "typer",
            "specs": [
                [
                    "==",
                    "0.9.0"
                ]
            ]
        },
        {
            "name": "rich",
            "specs": [
                [
                    "==",
                    "13.7.0"
                ]
            ]
        },
        {
            "name": "pytest-mock",
            "specs": [
                [
                    "==",
                    "3.12.0"
                ]
            ]
        }
    ],
    "lcname": "dhapi"
}
        
Elapsed time: 0.20182s