├── src ├── __init__.py ├── utils.py ├── models.py ├── __main__.py └── client.py ├── .github ├── workflows │ ├── ruff.yml │ ├── daily.yml │ ├── pyright.yml │ └── docker.yml ├── dependabot.yml ├── actions │ └── setup-python │ │ └── action.yml └── release-drafter.yml ├── .pre-commit-config.yaml ├── Dockerfile ├── .editorconfig ├── action.yml ├── LICENSE ├── pyproject.toml ├── README.md ├── .gitignore └── uv.lock /src/__init__.py: -------------------------------------------------------------------------------- 1 | import logging 2 | 3 | from .models import Settings 4 | 5 | logging.basicConfig(level=logging.INFO) 6 | settings = Settings() 7 | logging.debug(f"Settings: {settings.model_dump_json()}") 8 | -------------------------------------------------------------------------------- /src/utils.py: -------------------------------------------------------------------------------- 1 | from datetime import UTC, datetime, timedelta, timezone 2 | 3 | 4 | def get_current_month(): 5 | utc_dt = datetime.now(UTC) 6 | asia_shanghai_zone = timezone(timedelta(hours=8)) 7 | asia_shanghai_now = utc_dt.astimezone(asia_shanghai_zone) 8 | month = asia_shanghai_now.strftime("%Y-%m") 9 | 10 | return month 11 | -------------------------------------------------------------------------------- /.github/workflows/ruff.yml: -------------------------------------------------------------------------------- 1 | name: Ruff Lint 2 | 3 | on: 4 | push: 5 | branches: 6 | - master 7 | pull_request: 8 | paths: 9 | - "src/**" 10 | 11 | jobs: 12 | ruff: 13 | name: Ruff Lint 14 | runs-on: ubuntu-latest 15 | steps: 16 | - uses: actions/checkout@v6 17 | 18 | - name: Run Ruff Lint 19 | uses: chartboost/ruff-action@v1 20 | -------------------------------------------------------------------------------- /.github/dependabot.yml: -------------------------------------------------------------------------------- 1 | version: 2 2 | updates: 3 | - package-ecosystem: github-actions 4 | directory: "/" 5 | schedule: 6 | interval: daily 7 | groups: 8 | actions: 9 | patterns: 10 | - "*" 11 | 12 | - package-ecosystem: github-actions 13 | directory: "/.github/actions/setup-python" 14 | schedule: 15 | interval: daily 16 | groups: 17 | actions: 18 | patterns: 19 | - "*" 20 | -------------------------------------------------------------------------------- /.github/workflows/daily.yml: -------------------------------------------------------------------------------- 1 | name: Daily Tasks 2 | 3 | on: 4 | schedule: 5 | # Runs at 10:30 am UTC+8 every day 6 | - cron: "30 2 * * *" 7 | workflow_dispatch: 8 | 9 | jobs: 10 | run-tasks: 11 | name: Run FF14 Risingstone Tasks 12 | runs-on: ubuntu-latest 13 | steps: 14 | - uses: actions/checkout@v6 15 | 16 | - uses: docker://ghcr.io/starhearthunt/ff14risingstone_sign_task:master 17 | with: 18 | cookie: ${{ secrets.COOKIE }} 19 | user_agent: ${{ secrets.USER_AGENT }} 20 | -------------------------------------------------------------------------------- /.github/workflows/pyright.yml: -------------------------------------------------------------------------------- 1 | name: Pyright Lint 2 | 3 | on: 4 | push: 5 | branches: 6 | - master 7 | pull_request: 8 | paths: 9 | - "src/**" 10 | 11 | jobs: 12 | pyright: 13 | name: Pyright Lint 14 | runs-on: ubuntu-latest 15 | steps: 16 | - uses: actions/checkout@v6 17 | 18 | - name: Setup Python environment 19 | uses: ./.github/actions/setup-python 20 | 21 | - run: echo "$PWD/.venv/bin" >> $GITHUB_PATH 22 | 23 | - name: Run Pyright 24 | uses: jakebailey/pyright-action@v2 25 | -------------------------------------------------------------------------------- /.github/actions/setup-python/action.yml: -------------------------------------------------------------------------------- 1 | name: Setup Python 2 | description: Setup Python 3 | 4 | inputs: 5 | python-version: 6 | description: Python version 7 | required: false 8 | default: "3.12" 9 | 10 | runs: 11 | using: "composite" 12 | steps: 13 | - name: Install uv 14 | uses: astral-sh/setup-uv@v7 15 | 16 | - uses: actions/setup-python@v6 17 | with: 18 | python-version: ${{ inputs.python-version }} 19 | 20 | - name: Install the project 21 | run: uv sync --all-extras --dev 22 | shell: bash 23 | -------------------------------------------------------------------------------- /.pre-commit-config.yaml: -------------------------------------------------------------------------------- 1 | default_install_hook_types: [pre-commit, prepare-commit-msg] 2 | ci: 3 | autofix_commit_msg: "ci: auto fix by pre-commit hooks" 4 | autofix_prs: true 5 | autoupdate_branch: master 6 | autoupdate_schedule: monthly 7 | autoupdate_commit_msg: "ci: auto update by pre-commit hooks" 8 | repos: 9 | - repo: https://github.com/astral-sh/ruff-pre-commit 10 | rev: v0.14.7 11 | hooks: 12 | - id: ruff 13 | args: [--fix] 14 | stages: [pre-commit] 15 | - id: ruff-format 16 | stages: [pre-commit] 17 | -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | FROM python:3.12-bookworm as requirements-stage 2 | 3 | COPY --from=ghcr.io/astral-sh/uv:latest /uv /uvx /bin/ 4 | 5 | WORKDIR /tmp 6 | 7 | COPY ./pyproject.toml ./uv.lock* /tmp/ 8 | 9 | RUN uv export --format requirements-txt --output-file requirements.txt --no-hashes 10 | 11 | FROM python:3.12-slim-bookworm 12 | 13 | WORKDIR /app 14 | 15 | COPY --from=requirements-stage /tmp/requirements.txt /app/requirements.txt 16 | 17 | RUN pip install --no-cache-dir --upgrade -r requirements.txt 18 | 19 | COPY ./src /app/src 20 | 21 | ENV PYTHONPATH=/app 22 | 23 | CMD ["python", "-m", "src"] 24 | -------------------------------------------------------------------------------- /.editorconfig: -------------------------------------------------------------------------------- 1 | # http://editorconfig.org 2 | root = true 3 | 4 | [*] 5 | indent_style = space 6 | indent_size = 2 7 | end_of_line = lf 8 | charset = utf-8 9 | trim_trailing_whitespace = true 10 | insert_final_newline = true 11 | 12 | # The JSON files contain newlines inconsistently 13 | [*.json] 14 | insert_final_newline = ignore 15 | 16 | # Minified JavaScript files shouldn't be changed 17 | [**.min.js] 18 | indent_style = ignore 19 | insert_final_newline = ignore 20 | 21 | # Makefiles always use tabs for indentation 22 | [Makefile] 23 | indent_style = tab 24 | 25 | # Batch files use tabs for indentation 26 | [*.bat] 27 | indent_style = tab 28 | 29 | [*.md] 30 | trim_trailing_whitespace = false 31 | 32 | # Matches the exact files either package.json or .travis.yml 33 | [{package.json,.travis.yml}] 34 | indent_size = 2 35 | 36 | [{*.py,*.pyi}] 37 | indent_size = 4 -------------------------------------------------------------------------------- /.github/release-drafter.yml: -------------------------------------------------------------------------------- 1 | template: | 2 | ### 💫 Changes 3 | 4 | $CHANGES 5 | category-template: "### $TITLE" 6 | name-template: "Release v$RESOLVED_VERSION 🌈" 7 | tag-template: "v$RESOLVED_VERSION" 8 | change-template: "- $TITLE @$AUTHOR (#$NUMBER)" 9 | change-title-escapes: '\<*_&' # You can add # and @ to disable mentions, and add ` to disable code blocks. 10 | categories: 11 | - title: "💥 Breaking Changes" 12 | labels: 13 | - "Breaking" 14 | - title: "🚀 Features" 15 | labels: 16 | - "feature" 17 | - "enhancement" 18 | - title: "🐛 Bug Fixes" 19 | labels: 20 | - "fix" 21 | - "bugfix" 22 | - "bug" 23 | - title: "📝 Documentation" 24 | labels: 25 | - "documentation" 26 | version-resolver: 27 | major: 28 | labels: 29 | - "major" 30 | minor: 31 | labels: 32 | - "minor" 33 | patch: 34 | labels: 35 | - "patch" 36 | default: patch 37 | -------------------------------------------------------------------------------- /action.yml: -------------------------------------------------------------------------------- 1 | name: FF14 Risingstone Sign Tasks 2 | author: StarHeartHunt 3 | description: auto finish sign tasks of ff14 risingstone 4 | inputs: 5 | cookie: 6 | description: The Cookie header set by risingstone server 7 | required: true 8 | user_agent: 9 | description: The User-Agent header when login into risingstone 10 | required: true 11 | base_url: 12 | description: The API domain of risingstone 13 | required: false 14 | comment_content: 15 | description: The html content of the comment 16 | required: false 17 | like_post_id: 18 | description: The post id to send like 19 | required: false 20 | comment_post_id: 21 | description: The post id to send comment 22 | required: false 23 | check_house_remain: 24 | description: Whether to check the countdown to the role's house destruction 25 | required: false 26 | get_sign_reward: 27 | description: Whether to auto get the sign reward 28 | required: false 29 | 30 | runs: 31 | using: docker 32 | image: Dockerfile 33 | branding: 34 | icon: box 35 | color: orange 36 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2023 StarHeartHunt 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /.github/workflows/docker.yml: -------------------------------------------------------------------------------- 1 | name: Docker Image 2 | 3 | on: 4 | push: 5 | branches: 6 | - master 7 | tags: 8 | - v* 9 | 10 | jobs: 11 | docker: 12 | runs-on: ubuntu-latest 13 | permissions: 14 | contents: read 15 | packages: write 16 | 17 | steps: 18 | - name: Checkout 19 | uses: actions/checkout@v6 20 | 21 | - name: Setup Docker 22 | uses: docker/setup-buildx-action@v3 23 | 24 | - name: Login to Github Container Registry 25 | uses: docker/login-action@v3 26 | with: 27 | registry: ghcr.io 28 | username: ${{ github.repository_owner }} 29 | password: ${{ secrets.GITHUB_TOKEN }} 30 | 31 | - name: Generate Tags 32 | uses: docker/metadata-action@v5 33 | id: metadata 34 | with: 35 | images: ghcr.io/StarHeartHunt/ff14risingstone_sign_task 36 | tags: | 37 | type=semver,pattern={{version}} 38 | type=ref,event=branch 39 | 40 | - name: Build and Publish 41 | uses: docker/build-push-action@v6 42 | with: 43 | context: . 44 | file: Dockerfile 45 | push: true 46 | tags: ${{ steps.metadata.outputs.tags }} 47 | labels: ${{ steps.metadata.outputs.labels }} 48 | -------------------------------------------------------------------------------- /src/models.py: -------------------------------------------------------------------------------- 1 | from enum import IntEnum 2 | from typing import Annotated 3 | 4 | from pydantic import BaseModel, BeforeValidator, Field 5 | from pydantic_settings import BaseSettings, SettingsConfigDict 6 | 7 | StrippedStr = Annotated[ 8 | str, 9 | BeforeValidator(lambda x: str.strip(str(x))), 10 | ] 11 | 12 | 13 | class Settings(BaseSettings): 14 | model_config = SettingsConfigDict(env_file=".env", env_file_encoding="utf-8") 15 | 16 | input_base_url: str = "https://apiff14risingstones.web.sdo.com" 17 | input_cookie: StrippedStr = Field(default=...) 18 | input_user_agent: StrippedStr = Field(default=...) 19 | input_comment_content: str = '

[emo6] 

' 20 | input_like_post_id: int = 8 21 | input_comment_post_id: int = 8 22 | input_check_house_remain: bool = False 23 | input_get_sign_reward: bool = True 24 | 25 | 26 | class SealType(IntEnum): 27 | SIGN = 1 28 | LIKE = 2 29 | COMMENT = 3 30 | 31 | 32 | class SignRewardItem(BaseModel): 33 | id: int 34 | begin_date: str 35 | end_date: str 36 | rule: int 37 | item_name: str 38 | item_pic: str 39 | num: int 40 | item_desc: str 41 | is_get: int 42 | 43 | 44 | class SignRewardItemGetType(IntEnum): 45 | UNMET = -1 46 | AVAILABLE = 0 47 | GOTTEN = 1 48 | 49 | 50 | class SignRewardListResponse(BaseModel): 51 | code: int 52 | msg: str 53 | data: list[SignRewardItem] 54 | -------------------------------------------------------------------------------- /pyproject.toml: -------------------------------------------------------------------------------- 1 | [project] 2 | name = "ff14risingstone-sign-task" 3 | version = "0.1.0" 4 | authors = [{ name = "StarHeartHunt", email = "starheart233@gmail.com" }] 5 | description = "script for FFXIV CN Forum reward activities" 6 | license = { text = "MIT" } 7 | readme = "README.md" 8 | requires-python = ">=3.12" 9 | dependencies = ["curl-cffi>=0.7.4", "pydantic-settings ~= 2.1"] 10 | 11 | [dependency-groups] 12 | dev = ["ruff ~= 0.9", "pre-commit ~= 4.1"] 13 | 14 | [tool.ruff] 15 | line-length = 88 16 | target-version = "py312" 17 | 18 | [tool.ruff.format] 19 | line-ending = "lf" 20 | 21 | [tool.ruff.lint] 22 | select = [ 23 | "F", # pyflakes 24 | "W", # pycodestyle warnings 25 | "E", # pycodestyle errors 26 | "I", # isort 27 | "UP", # pyupgrade 28 | "ASYNC", # flake8-async 29 | "C4", # flake8-comprehensions 30 | "DTZ", # flake8-datetimez 31 | "T10", # flake8-debugger 32 | "T20", # flake8-print 33 | "PYI", # flake8-pyi 34 | "PT", # flake8-pytest-style 35 | "Q", # flake8-quotes 36 | "TC", # flake8-type-checking 37 | "TID", # flake8-tidy-imports 38 | "RUF", # Ruff-specific rules 39 | ] 40 | ignore = [ 41 | "E402", # module-import-not-at-top-of-file 42 | "UP037", # quoted-annotation 43 | "RUF001", # ambiguous-unicode-character-string 44 | "RUF002", # ambiguous-unicode-character-docstring 45 | "RUF003", # ambiguous-unicode-character-comment 46 | ] 47 | 48 | [tool.ruff.lint.isort] 49 | force-sort-within-sections = true 50 | 51 | [tool.ruff.lint.pyupgrade] 52 | keep-runtime-typing = true 53 | 54 | [tool.pyright] 55 | pythonPlatform = "All" 56 | 57 | typeCheckingMode = "standard" 58 | reportShadowedImports = false 59 | disableBytesTypePromotions = true 60 | -------------------------------------------------------------------------------- /src/__main__.py: -------------------------------------------------------------------------------- 1 | import logging 2 | from typing import Any 3 | 4 | from . import settings 5 | from .client import get_sign_reward, get_sign_reward_list, get_user_info, sign_in 6 | from .models import SignRewardItemGetType 7 | from .utils import get_current_month 8 | 9 | 10 | def main(): 11 | logging.info("开始签到") 12 | sign_in() 13 | # do_seal(SealType.SIGN) 14 | 15 | # logging.info("开始点赞") 16 | # counter = 0 17 | # for _ in range(10): 18 | # time.sleep(3) 19 | # r = like() 20 | # if r.json()["data"] == 1: 21 | # counter += 1 22 | # logging.info(f"第{counter}次点赞结束") 23 | 24 | # time.sleep(3) 25 | # do_seal(SealType.LIKE) 26 | 27 | # logging.info("开始评论") 28 | # time.sleep(3) 29 | # comment() 30 | # do_seal(SealType.COMMENT) 31 | 32 | # logging.info("任务完成") 33 | 34 | if settings.input_check_house_remain: 35 | logging.info("开始检查房屋拆除倒计时") 36 | user_info: dict[str, Any] = get_user_info() 37 | house_remain_day = ( 38 | user_info.get("data", {}) 39 | .get("characterDetail", [{}])[0] 40 | .get("house_remain_day") 41 | ) 42 | if house_remain_day: 43 | raise Exception(f"房屋拆除倒计时:{house_remain_day}") 44 | 45 | if settings.input_get_sign_reward: 46 | reward_list = get_sign_reward_list(get_current_month()) 47 | logging.info(f"本月奖励列表:{reward_list}") 48 | for reward in filter( 49 | lambda reward: reward.is_get == SignRewardItemGetType.AVAILABLE, reward_list 50 | ): 51 | logging.info(f"开始领取签到奖励:{reward.item_name}") 52 | r = get_sign_reward(reward.id, get_current_month()) 53 | logging.info(r.json()) 54 | 55 | 56 | if __name__ == "__main__": 57 | main() 58 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # FF14 石之家签到脚本 2 | 3 | ## 使用方法 4 | 5 | - Fork 本仓库或者通过手动在仓库中新建 `.github/workflows/daily.yml` 文件,内容如下: 6 | 7 | ```yaml 8 | name: Daily Tasks 9 | 10 | on: 11 | schedule: 12 | # Runs at 10:30 am UTC+8 every day 13 | - cron: "30 2 * * *" 14 | workflow_dispatch: 15 | 16 | jobs: 17 | run-tasks: 18 | name: Run FF14 Risingstone Tasks 19 | runs-on: ubuntu-latest 20 | steps: 21 | - uses: actions/checkout@v4 22 | 23 | - uses: docker://ghcr.io/starhearthunt/ff14risingstone_sign_task:master 24 | with: 25 | cookie: ${{ secrets.COOKIE }} 26 | user_agent: ${{ secrets.USER_AGENT }} 27 | ``` 28 | 29 | - 在 Settings > Secrets and variables > Actions,添加如下 Secret 30 | 31 | 1. `COOKIE` 32 | 33 | 值为 `Cookie` 头中以等号 `=` 分割的 `ff14risingstones` 键值对,其中右值为 urlencode 后的结果。 34 | 35 | 例: 36 | 37 | ```bash 38 | ff14risingstones=s%3A1111.2222222%2F33333 39 | ``` 40 | 41 | 2. `USER_AGENT` 42 | 43 | > [!NOTE] 44 | > 由于石之家 API 新增的检测机制,需要设置与登录(获取 Cookie)时相同的 User-Agent 头,详情参考 [#17](https://github.com/StarHeartHunt/ff14risingstone_sign_task/issues/17) 45 | 46 | 值为登录时向石之家 API 所发送的 `User-Agent` 头。 47 | 48 | 例: 49 | 50 | ```bash 51 | Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36 52 | ``` 53 | 54 | ## 配置项 55 | 56 | ### 必填配置项 57 | 58 | - `cookie`:石之家 API cookie 中的 `ff14risingstones` 键值对 59 | - `user_agent`:请求 API 时使用的用户代理 60 | 61 | ### 可选配置项 62 | 63 | 可选配置项可以从 action 文件的 with 段传入,和必填项一样。 64 | 65 | - `base_url`:API 的入口域名。默认值:`https://apiff14risingstones.web.sdo.com` 66 | - `comment_content`:完成评论任务时的评论内容。默认值:`

[emo6] 

` 67 | - `like_post_id`:完成点赞任务时要点赞的根帖子 id。默认值:`8` 68 | - `comment_post_id`:完成评论任务时要评论的根帖子 id。默认值:`8` 69 | - `check_house_remain`:是否检查角色房屋拆除倒计时。默认值:`false` 70 | - `get_sign_reward`:是否使用脚本领取当月签到奖励。默认值:`true` 71 | 72 | ## 许可证 73 | 74 | 本仓库使用 MIT 许可证 75 | -------------------------------------------------------------------------------- /src/client.py: -------------------------------------------------------------------------------- 1 | from json import JSONDecodeError 2 | import logging 3 | import uuid 4 | 5 | from curl_cffi import requests 6 | 7 | from . import settings 8 | from .models import SealType, SignRewardListResponse 9 | 10 | HEADERS = { 11 | "accept": "application/json, text/plain, */*", 12 | "cache-control": "no-cache", 13 | "pragma": "no-cache", 14 | "priority": "u=1, i", 15 | "sec-ch-ua": '"Not A(Brand";v="8", "Chromium";v="124", "Google Chrome";v="124"', 16 | "sec-ch-ua-mobile": "?0", 17 | "sec-ch-ua-platform": '"macOS"', 18 | "sec-fetch-dest": "empty", 19 | "sec-fetch-mode": "cors", 20 | "sec-fetch-site": "same-site", 21 | "Referer": "https://ff14risingstones.web.sdo.com/", 22 | "Referrer-Policy": "strict-origin-when-cross-origin", 23 | "User-Agent": settings.input_user_agent, 24 | "Cookie": settings.input_cookie, 25 | } 26 | 27 | 28 | def do_seal(type_: SealType): 29 | r = requests.post( 30 | f"{settings.input_base_url}/api/home/active/online2312/doSeal", 31 | data={"type": type_}, # type: ignore 32 | headers=HEADERS, 33 | impersonate="chrome124", 34 | ) 35 | 36 | logging.info(r.text) 37 | 38 | 39 | def is_login_in(): 40 | r = requests.get( 41 | f"{settings.input_base_url}/api/home/sysMsg/getSysMsg", 42 | params={ 43 | "page": 1, 44 | "limit": 10, 45 | "tempsuid": str(uuid.uuid4()), 46 | }, 47 | headers=HEADERS, 48 | impersonate="chrome124", 49 | ) 50 | 51 | logging.info(r.text) 52 | 53 | 54 | def sign_in(): 55 | r = requests.post( 56 | f"{settings.input_base_url}/api/home/sign/signIn", 57 | params={ 58 | "tempsuid": str(uuid.uuid4()), 59 | }, 60 | data={"tempsuid": str(uuid.uuid4())}, 61 | headers=HEADERS, 62 | impersonate="chrome124", 63 | ) 64 | try: 65 | data = r.json() 66 | code = data.get("code", None) 67 | if code is None or (code > 10000 and code != 10001): 68 | raise RuntimeError(f"登录时出现错误: {data!r}") 69 | except JSONDecodeError as e: 70 | raise RuntimeError(f"解析响应时出现错误: {e!r}, {r.text}") 71 | 72 | logging.info(r.text) 73 | 74 | 75 | def like(): 76 | r = requests.post( 77 | f"{settings.input_base_url}/api/home/posts/like", 78 | params={ 79 | "tempsuid": str(uuid.uuid4()), 80 | }, 81 | data={"id": settings.input_like_post_id, "type": 1}, # type: ignore 82 | headers=HEADERS, 83 | impersonate="chrome124", 84 | ) 85 | logging.info(r.text) 86 | 87 | return r 88 | 89 | 90 | def comment(): 91 | r = requests.post( 92 | f"{settings.input_base_url}/api/home/posts/comment", 93 | params={ 94 | "tempsuid": str(uuid.uuid4()), 95 | }, 96 | data={ 97 | "content": settings.input_comment_content, 98 | "posts_id": settings.input_comment_post_id, 99 | "parent_id": "0", 100 | "root_parent": "0", 101 | "comment_pic": "", 102 | }, # type: ignore 103 | headers=HEADERS, 104 | impersonate="chrome124", 105 | ) 106 | 107 | logging.info(r.text) 108 | 109 | 110 | def get_user_info(): 111 | r = requests.get( 112 | f"{settings.input_base_url}/api/home/userInfo/getUserInfo", 113 | params={"page": 1}, 114 | headers={**HEADERS, "Content-Type": "application/x-www-form-urlencoded"}, 115 | impersonate="chrome124", 116 | ).json() 117 | 118 | return r 119 | 120 | 121 | def get_sign_reward(id_, month): 122 | r = requests.post( 123 | f"{settings.input_base_url}/api/home/sign/getSignReward", 124 | params={ 125 | "tempsuid": str(uuid.uuid4()), 126 | }, 127 | data={ 128 | "id": id_, 129 | "month": month, 130 | "tempsuid": str(uuid.uuid4()), 131 | }, 132 | headers=HEADERS, 133 | impersonate="chrome124", 134 | ) 135 | 136 | return r 137 | 138 | 139 | def get_sign_reward_list(month): 140 | r = requests.get( 141 | f"{settings.input_base_url}/api/home/sign/signRewardList", 142 | params={ 143 | "month": month, 144 | "tempsuid": str(uuid.uuid4()), 145 | }, 146 | headers=HEADERS, 147 | impersonate="chrome124", 148 | ) 149 | 150 | return SignRewardListResponse.model_validate_json(r.text).data 151 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # ----- Project ----- 2 | 3 | .env.* 4 | .idea 5 | .vscode 6 | 7 | # Created by https://www.toptal.com/developers/gitignore/api/python,node,visualstudiocode,jetbrains,macos,windows,linux 8 | # Edit at https://www.toptal.com/developers/gitignore?templates=python,node,visualstudiocode,jetbrains,macos,windows,linux 9 | 10 | ### JetBrains ### 11 | # Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio, WebStorm and Rider 12 | # Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839 13 | 14 | # User-specific stuff 15 | .idea/**/workspace.xml 16 | .idea/**/tasks.xml 17 | .idea/**/usage.statistics.xml 18 | .idea/**/dictionaries 19 | .idea/**/shelf 20 | 21 | # AWS User-specific 22 | .idea/**/aws.xml 23 | 24 | # Generated files 25 | .idea/**/contentModel.xml 26 | 27 | # Sensitive or high-churn files 28 | .idea/**/dataSources/ 29 | .idea/**/dataSources.ids 30 | .idea/**/dataSources.local.xml 31 | .idea/**/sqlDataSources.xml 32 | .idea/**/dynamic.xml 33 | .idea/**/uiDesigner.xml 34 | .idea/**/dbnavigator.xml 35 | 36 | # Gradle 37 | .idea/**/gradle.xml 38 | .idea/**/libraries 39 | 40 | # Gradle and Maven with auto-import 41 | # When using Gradle or Maven with auto-import, you should exclude module files, 42 | # since they will be recreated, and may cause churn. Uncomment if using 43 | # auto-import. 44 | # .idea/artifacts 45 | # .idea/compiler.xml 46 | # .idea/jarRepositories.xml 47 | # .idea/modules.xml 48 | # .idea/*.iml 49 | # .idea/modules 50 | # *.iml 51 | # *.ipr 52 | 53 | # CMake 54 | cmake-build-*/ 55 | 56 | # Mongo Explorer plugin 57 | .idea/**/mongoSettings.xml 58 | 59 | # File-based project format 60 | *.iws 61 | 62 | # IntelliJ 63 | out/ 64 | 65 | # mpeltonen/sbt-idea plugin 66 | .idea_modules/ 67 | 68 | # JIRA plugin 69 | atlassian-ide-plugin.xml 70 | 71 | # Cursive Clojure plugin 72 | .idea/replstate.xml 73 | 74 | # SonarLint plugin 75 | .idea/sonarlint/ 76 | 77 | # Crashlytics plugin (for Android Studio and IntelliJ) 78 | com_crashlytics_export_strings.xml 79 | crashlytics.properties 80 | crashlytics-build.properties 81 | fabric.properties 82 | 83 | # Editor-based Rest Client 84 | .idea/httpRequests 85 | 86 | # Android studio 3.1+ serialized cache file 87 | .idea/caches/build_file_checksums.ser 88 | 89 | ### JetBrains Patch ### 90 | # Comment Reason: https://github.com/joeblau/gitignore.io/issues/186#issuecomment-215987721 91 | 92 | # *.iml 93 | # modules.xml 94 | # .idea/misc.xml 95 | # *.ipr 96 | 97 | # Sonarlint plugin 98 | # https://plugins.jetbrains.com/plugin/7973-sonarlint 99 | .idea/**/sonarlint/ 100 | 101 | # SonarQube Plugin 102 | # https://plugins.jetbrains.com/plugin/7238-sonarqube-community-plugin 103 | .idea/**/sonarIssues.xml 104 | 105 | # Markdown Navigator plugin 106 | # https://plugins.jetbrains.com/plugin/7896-markdown-navigator-enhanced 107 | .idea/**/markdown-navigator.xml 108 | .idea/**/markdown-navigator-enh.xml 109 | .idea/**/markdown-navigator/ 110 | 111 | # Cache file creation bug 112 | # See https://youtrack.jetbrains.com/issue/JBR-2257 113 | .idea/$CACHE_FILE$ 114 | 115 | # CodeStream plugin 116 | # https://plugins.jetbrains.com/plugin/12206-codestream 117 | .idea/codestream.xml 118 | 119 | # Azure Toolkit for IntelliJ plugin 120 | # https://plugins.jetbrains.com/plugin/8053-azure-toolkit-for-intellij 121 | .idea/**/azureSettings.xml 122 | 123 | ### Linux ### 124 | *~ 125 | 126 | # temporary files which can be created if a process still has a handle open of a deleted file 127 | .fuse_hidden* 128 | 129 | # KDE directory preferences 130 | .directory 131 | 132 | # Linux trash folder which might appear on any partition or disk 133 | .Trash-* 134 | 135 | # .nfs files are created when an open file is removed but is still being accessed 136 | .nfs* 137 | 138 | ### macOS ### 139 | # General 140 | .DS_Store 141 | .AppleDouble 142 | .LSOverride 143 | 144 | # Icon must end with two \r 145 | Icon 146 | 147 | 148 | # Thumbnails 149 | ._* 150 | 151 | # Files that might appear in the root of a volume 152 | .DocumentRevisions-V100 153 | .fseventsd 154 | .Spotlight-V100 155 | .TemporaryItems 156 | .Trashes 157 | .VolumeIcon.icns 158 | .com.apple.timemachine.donotpresent 159 | 160 | # Directories potentially created on remote AFP share 161 | .AppleDB 162 | .AppleDesktop 163 | Network Trash Folder 164 | Temporary Items 165 | .apdisk 166 | 167 | ### macOS Patch ### 168 | # iCloud generated files 169 | *.icloud 170 | 171 | ### Node ### 172 | # Logs 173 | logs 174 | *.log 175 | npm-debug.log* 176 | yarn-debug.log* 177 | yarn-error.log* 178 | lerna-debug.log* 179 | .pnpm-debug.log* 180 | 181 | # Diagnostic reports (https://nodejs.org/api/report.html) 182 | report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json 183 | 184 | # Runtime data 185 | pids 186 | *.pid 187 | *.seed 188 | *.pid.lock 189 | 190 | # Directory for instrumented libs generated by jscoverage/JSCover 191 | lib-cov 192 | 193 | # Coverage directory used by tools like istanbul 194 | coverage 195 | *.lcov 196 | 197 | # nyc test coverage 198 | .nyc_output 199 | 200 | # Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) 201 | .grunt 202 | 203 | # Bower dependency directory (https://bower.io/) 204 | bower_components 205 | 206 | # node-waf configuration 207 | .lock-wscript 208 | 209 | # Compiled binary addons (https://nodejs.org/api/addons.html) 210 | build/Release 211 | 212 | # Dependency directories 213 | node_modules/ 214 | jspm_packages/ 215 | 216 | # Snowpack dependency directory (https://snowpack.dev/) 217 | web_modules/ 218 | 219 | # TypeScript cache 220 | *.tsbuildinfo 221 | 222 | # Optional npm cache directory 223 | .npm 224 | 225 | # Optional eslint cache 226 | .eslintcache 227 | 228 | # Optional stylelint cache 229 | .stylelintcache 230 | 231 | # Microbundle cache 232 | .rpt2_cache/ 233 | .rts2_cache_cjs/ 234 | .rts2_cache_es/ 235 | .rts2_cache_umd/ 236 | 237 | # Optional REPL history 238 | .node_repl_history 239 | 240 | # Output of 'npm pack' 241 | *.tgz 242 | 243 | # Yarn Integrity file 244 | .yarn-integrity 245 | 246 | # dotenv environment variable files 247 | .env 248 | .env.development.local 249 | .env.test.local 250 | .env.production.local 251 | .env.local 252 | 253 | # parcel-bundler cache (https://parceljs.org/) 254 | .cache 255 | .parcel-cache 256 | 257 | # Next.js build output 258 | .next 259 | out 260 | 261 | # Nuxt.js build / generate output 262 | .nuxt 263 | dist 264 | 265 | # Gatsby files 266 | .cache/ 267 | # Comment in the public line in if your project uses Gatsby and not Next.js 268 | # https://nextjs.org/blog/next-9-1#public-directory-support 269 | # public 270 | 271 | # vuepress build output 272 | .vuepress/dist 273 | 274 | # vuepress v2.x temp and cache directory 275 | .temp 276 | 277 | # Docusaurus cache and generated files 278 | .docusaurus 279 | 280 | # Serverless directories 281 | .serverless/ 282 | 283 | # FuseBox cache 284 | .fusebox/ 285 | 286 | # DynamoDB Local files 287 | .dynamodb/ 288 | 289 | # TernJS port file 290 | .tern-port 291 | 292 | # Stores VSCode versions used for testing VSCode extensions 293 | .vscode-test 294 | 295 | # yarn v2 296 | .yarn/cache 297 | .yarn/unplugged 298 | .yarn/build-state.yml 299 | .yarn/install-state.gz 300 | .pnp.* 301 | 302 | ### Node Patch ### 303 | # Serverless Webpack directories 304 | .webpack/ 305 | 306 | # Optional stylelint cache 307 | 308 | # SvelteKit build / generate output 309 | .svelte-kit 310 | 311 | ### Python ### 312 | # Byte-compiled / optimized / DLL files 313 | __pycache__/ 314 | *.py[cod] 315 | *$py.class 316 | 317 | # C extensions 318 | *.so 319 | 320 | # Distribution / packaging 321 | .Python 322 | build/ 323 | develop-eggs/ 324 | dist/ 325 | downloads/ 326 | eggs/ 327 | .eggs/ 328 | lib/ 329 | lib64/ 330 | parts/ 331 | sdist/ 332 | var/ 333 | wheels/ 334 | share/python-wheels/ 335 | *.egg-info/ 336 | .installed.cfg 337 | *.egg 338 | MANIFEST 339 | 340 | # PyInstaller 341 | # Usually these files are written by a python script from a template 342 | # before PyInstaller builds the exe, so as to inject date/other infos into it. 343 | *.manifest 344 | *.spec 345 | 346 | # Installer logs 347 | pip-log.txt 348 | pip-delete-this-directory.txt 349 | 350 | # Unit test / coverage reports 351 | htmlcov/ 352 | .tox/ 353 | .nox/ 354 | .coverage 355 | .coverage.* 356 | nosetests.xml 357 | coverage.xml 358 | *.cover 359 | *.py,cover 360 | .hypothesis/ 361 | .pytest_cache/ 362 | cover/ 363 | 364 | # Translations 365 | *.mo 366 | *.pot 367 | 368 | # Django stuff: 369 | local_settings.py 370 | db.sqlite3 371 | db.sqlite3-journal 372 | 373 | # Flask stuff: 374 | instance/ 375 | .webassets-cache 376 | 377 | # Scrapy stuff: 378 | .scrapy 379 | 380 | # Sphinx documentation 381 | docs/_build/ 382 | 383 | # PyBuilder 384 | .pybuilder/ 385 | target/ 386 | 387 | # Jupyter Notebook 388 | .ipynb_checkpoints 389 | 390 | # IPython 391 | profile_default/ 392 | ipython_config.py 393 | 394 | # pyenv 395 | # For a library or package, you might want to ignore these files since the code is 396 | # intended to run in multiple environments; otherwise, check them in: 397 | # .python-version 398 | 399 | # pipenv 400 | # According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. 401 | # However, in case of collaboration, if having platform-specific dependencies or dependencies 402 | # having no cross-platform support, pipenv may install dependencies that don't work, or not 403 | # install all needed dependencies. 404 | #Pipfile.lock 405 | 406 | # poetry 407 | # Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control. 408 | # This is especially recommended for binary packages to ensure reproducibility, and is more 409 | # commonly ignored for libraries. 410 | # https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control 411 | #poetry.lock 412 | 413 | # pdm 414 | # Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control. 415 | #pdm.lock 416 | # pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it 417 | # in version control. 418 | # https://pdm.fming.dev/#use-with-ide 419 | .pdm.toml 420 | 421 | # PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm 422 | __pypackages__/ 423 | 424 | # Celery stuff 425 | celerybeat-schedule 426 | celerybeat.pid 427 | 428 | # SageMath parsed files 429 | *.sage.py 430 | 431 | # Environments 432 | .venv 433 | env/ 434 | venv/ 435 | ENV/ 436 | env.bak/ 437 | venv.bak/ 438 | 439 | # Spyder project settings 440 | .spyderproject 441 | .spyproject 442 | 443 | # Rope project settings 444 | .ropeproject 445 | 446 | # mkdocs documentation 447 | /site 448 | 449 | # mypy 450 | .mypy_cache/ 451 | .dmypy.json 452 | dmypy.json 453 | 454 | # Pyre type checker 455 | .pyre/ 456 | 457 | # pytype static type analyzer 458 | .pytype/ 459 | 460 | # Cython debug symbols 461 | cython_debug/ 462 | 463 | # PyCharm 464 | # JetBrains specific template is maintained in a separate JetBrains.gitignore that can 465 | # be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore 466 | # and can be added to the global gitignore or merged into this file. For a more nuclear 467 | # option (not recommended) you can uncomment the following to ignore the entire idea folder. 468 | #.idea/ 469 | 470 | ### Python Patch ### 471 | # Poetry local configuration file - https://python-poetry.org/docs/configuration/#local-configuration 472 | poetry.toml 473 | 474 | # ruff 475 | .ruff_cache/ 476 | 477 | # LSP config files 478 | pyrightconfig.json 479 | 480 | ### VisualStudioCode ### 481 | .vscode/* 482 | !.vscode/settings.json 483 | !.vscode/tasks.json 484 | !.vscode/launch.json 485 | !.vscode/extensions.json 486 | !.vscode/*.code-snippets 487 | 488 | # Local History for Visual Studio Code 489 | .history/ 490 | 491 | # Built Visual Studio Code Extensions 492 | *.vsix 493 | 494 | ### VisualStudioCode Patch ### 495 | # Ignore all local history of files 496 | .history 497 | .ionide 498 | 499 | ### Windows ### 500 | # Windows thumbnail cache files 501 | Thumbs.db 502 | Thumbs.db:encryptable 503 | ehthumbs.db 504 | ehthumbs_vista.db 505 | 506 | # Dump file 507 | *.stackdump 508 | 509 | # Folder config file 510 | [Dd]esktop.ini 511 | 512 | # Recycle Bin used on file shares 513 | $RECYCLE.BIN/ 514 | 515 | # Windows Installer files 516 | *.cab 517 | *.msi 518 | *.msix 519 | *.msm 520 | *.msp 521 | 522 | # Windows shortcuts 523 | *.lnk 524 | 525 | # End of https://www.toptal.com/developers/gitignore/api/python,node,visualstudiocode,jetbrains,macos,windows,linux 526 | -------------------------------------------------------------------------------- /uv.lock: -------------------------------------------------------------------------------- 1 | version = 1 2 | requires-python = ">=3.12" 3 | 4 | [[package]] 5 | name = "annotated-types" 6 | version = "0.7.0" 7 | source = { registry = "https://pypi.org/simple" } 8 | sdist = { url = "https://files.pythonhosted.org/packages/ee/67/531ea369ba64dcff5ec9c3402f9f51bf748cec26dde048a2f973a4eea7f5/annotated_types-0.7.0.tar.gz", hash = "sha256:aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89", size = 16081 } 9 | wheels = [ 10 | { url = "https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl", hash = "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53", size = 13643 }, 11 | ] 12 | 13 | [[package]] 14 | name = "certifi" 15 | version = "2025.1.31" 16 | source = { registry = "https://pypi.org/simple" } 17 | sdist = { url = "https://files.pythonhosted.org/packages/1c/ab/c9f1e32b7b1bf505bf26f0ef697775960db7932abeb7b516de930ba2705f/certifi-2025.1.31.tar.gz", hash = "sha256:3d5da6925056f6f18f119200434a4780a94263f10d1c21d032a6f6b2baa20651", size = 167577 } 18 | wheels = [ 19 | { url = "https://files.pythonhosted.org/packages/38/fc/bce832fd4fd99766c04d1ee0eead6b0ec6486fb100ae5e74c1d91292b982/certifi-2025.1.31-py3-none-any.whl", hash = "sha256:ca78db4565a652026a4db2bcdf68f2fb589ea80d0be70e03929ed730746b84fe", size = 166393 }, 20 | ] 21 | 22 | [[package]] 23 | name = "cffi" 24 | version = "1.17.1" 25 | source = { registry = "https://pypi.org/simple" } 26 | dependencies = [ 27 | { name = "pycparser" }, 28 | ] 29 | sdist = { url = "https://files.pythonhosted.org/packages/fc/97/c783634659c2920c3fc70419e3af40972dbaf758daa229a7d6ea6135c90d/cffi-1.17.1.tar.gz", hash = "sha256:1c39c6016c32bc48dd54561950ebd6836e1670f2ae46128f67cf49e789c52824", size = 516621 } 30 | wheels = [ 31 | { url = "https://files.pythonhosted.org/packages/5a/84/e94227139ee5fb4d600a7a4927f322e1d4aea6fdc50bd3fca8493caba23f/cffi-1.17.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:805b4371bf7197c329fcb3ead37e710d1bca9da5d583f5073b799d5c5bd1eee4", size = 183178 }, 32 | { url = "https://files.pythonhosted.org/packages/da/ee/fb72c2b48656111c4ef27f0f91da355e130a923473bf5ee75c5643d00cca/cffi-1.17.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:733e99bc2df47476e3848417c5a4540522f234dfd4ef3ab7fafdf555b082ec0c", size = 178840 }, 33 | { url = "https://files.pythonhosted.org/packages/cc/b6/db007700f67d151abadf508cbfd6a1884f57eab90b1bb985c4c8c02b0f28/cffi-1.17.1-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1257bdabf294dceb59f5e70c64a3e2f462c30c7ad68092d01bbbfb1c16b1ba36", size = 454803 }, 34 | { url = "https://files.pythonhosted.org/packages/1a/df/f8d151540d8c200eb1c6fba8cd0dfd40904f1b0682ea705c36e6c2e97ab3/cffi-1.17.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da95af8214998d77a98cc14e3a3bd00aa191526343078b530ceb0bd710fb48a5", size = 478850 }, 35 | { url = "https://files.pythonhosted.org/packages/28/c0/b31116332a547fd2677ae5b78a2ef662dfc8023d67f41b2a83f7c2aa78b1/cffi-1.17.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d63afe322132c194cf832bfec0dc69a99fb9bb6bbd550f161a49e9e855cc78ff", size = 485729 }, 36 | { url = "https://files.pythonhosted.org/packages/91/2b/9a1ddfa5c7f13cab007a2c9cc295b70fbbda7cb10a286aa6810338e60ea1/cffi-1.17.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f79fc4fc25f1c8698ff97788206bb3c2598949bfe0fef03d299eb1b5356ada99", size = 471256 }, 37 | { url = "https://files.pythonhosted.org/packages/b2/d5/da47df7004cb17e4955df6a43d14b3b4ae77737dff8bf7f8f333196717bf/cffi-1.17.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b62ce867176a75d03a665bad002af8e6d54644fad99a3c70905c543130e39d93", size = 479424 }, 38 | { url = "https://files.pythonhosted.org/packages/0b/ac/2a28bcf513e93a219c8a4e8e125534f4f6db03e3179ba1c45e949b76212c/cffi-1.17.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:386c8bf53c502fff58903061338ce4f4950cbdcb23e2902d86c0f722b786bbe3", size = 484568 }, 39 | { url = "https://files.pythonhosted.org/packages/d4/38/ca8a4f639065f14ae0f1d9751e70447a261f1a30fa7547a828ae08142465/cffi-1.17.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:4ceb10419a9adf4460ea14cfd6bc43d08701f0835e979bf821052f1805850fe8", size = 488736 }, 40 | { url = "https://files.pythonhosted.org/packages/86/c5/28b2d6f799ec0bdecf44dced2ec5ed43e0eb63097b0f58c293583b406582/cffi-1.17.1-cp312-cp312-win32.whl", hash = "sha256:a08d7e755f8ed21095a310a693525137cfe756ce62d066e53f502a83dc550f65", size = 172448 }, 41 | { url = "https://files.pythonhosted.org/packages/50/b9/db34c4755a7bd1cb2d1603ac3863f22bcecbd1ba29e5ee841a4bc510b294/cffi-1.17.1-cp312-cp312-win_amd64.whl", hash = "sha256:51392eae71afec0d0c8fb1a53b204dbb3bcabcb3c9b807eedf3e1e6ccf2de903", size = 181976 }, 42 | { url = "https://files.pythonhosted.org/packages/8d/f8/dd6c246b148639254dad4d6803eb6a54e8c85c6e11ec9df2cffa87571dbe/cffi-1.17.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f3a2b4222ce6b60e2e8b337bb9596923045681d71e5a082783484d845390938e", size = 182989 }, 43 | { url = "https://files.pythonhosted.org/packages/8b/f1/672d303ddf17c24fc83afd712316fda78dc6fce1cd53011b839483e1ecc8/cffi-1.17.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:0984a4925a435b1da406122d4d7968dd861c1385afe3b45ba82b750f229811e2", size = 178802 }, 44 | { url = "https://files.pythonhosted.org/packages/0e/2d/eab2e858a91fdff70533cab61dcff4a1f55ec60425832ddfdc9cd36bc8af/cffi-1.17.1-cp313-cp313-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d01b12eeeb4427d3110de311e1774046ad344f5b1a7403101878976ecd7a10f3", size = 454792 }, 45 | { url = "https://files.pythonhosted.org/packages/75/b2/fbaec7c4455c604e29388d55599b99ebcc250a60050610fadde58932b7ee/cffi-1.17.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:706510fe141c86a69c8ddc029c7910003a17353970cff3b904ff0686a5927683", size = 478893 }, 46 | { url = "https://files.pythonhosted.org/packages/4f/b7/6e4a2162178bf1935c336d4da8a9352cccab4d3a5d7914065490f08c0690/cffi-1.17.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:de55b766c7aa2e2a3092c51e0483d700341182f08e67c63630d5b6f200bb28e5", size = 485810 }, 47 | { url = "https://files.pythonhosted.org/packages/c7/8a/1d0e4a9c26e54746dc08c2c6c037889124d4f59dffd853a659fa545f1b40/cffi-1.17.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c59d6e989d07460165cc5ad3c61f9fd8f1b4796eacbd81cee78957842b834af4", size = 471200 }, 48 | { url = "https://files.pythonhosted.org/packages/26/9f/1aab65a6c0db35f43c4d1b4f580e8df53914310afc10ae0397d29d697af4/cffi-1.17.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd398dbc6773384a17fe0d3e7eeb8d1a21c2200473ee6806bb5e6a8e62bb73dd", size = 479447 }, 49 | { url = "https://files.pythonhosted.org/packages/5f/e4/fb8b3dd8dc0e98edf1135ff067ae070bb32ef9d509d6cb0f538cd6f7483f/cffi-1.17.1-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:3edc8d958eb099c634dace3c7e16560ae474aa3803a5df240542b305d14e14ed", size = 484358 }, 50 | { url = "https://files.pythonhosted.org/packages/f1/47/d7145bf2dc04684935d57d67dff9d6d795b2ba2796806bb109864be3a151/cffi-1.17.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:72e72408cad3d5419375fc87d289076ee319835bdfa2caad331e377589aebba9", size = 488469 }, 51 | { url = "https://files.pythonhosted.org/packages/bf/ee/f94057fa6426481d663b88637a9a10e859e492c73d0384514a17d78ee205/cffi-1.17.1-cp313-cp313-win32.whl", hash = "sha256:e03eab0a8677fa80d646b5ddece1cbeaf556c313dcfac435ba11f107ba117b5d", size = 172475 }, 52 | { url = "https://files.pythonhosted.org/packages/7c/fc/6a8cb64e5f0324877d503c854da15d76c1e50eb722e320b15345c4d0c6de/cffi-1.17.1-cp313-cp313-win_amd64.whl", hash = "sha256:f6a16c31041f09ead72d69f583767292f750d24913dadacf5756b966aacb3f1a", size = 182009 }, 53 | ] 54 | 55 | [[package]] 56 | name = "cfgv" 57 | version = "3.4.0" 58 | source = { registry = "https://pypi.org/simple" } 59 | sdist = { url = "https://files.pythonhosted.org/packages/11/74/539e56497d9bd1d484fd863dd69cbbfa653cd2aa27abfe35653494d85e94/cfgv-3.4.0.tar.gz", hash = "sha256:e52591d4c5f5dead8e0f673fb16db7949d2cfb3f7da4582893288f0ded8fe560", size = 7114 } 60 | wheels = [ 61 | { url = "https://files.pythonhosted.org/packages/c5/55/51844dd50c4fc7a33b653bfaba4c2456f06955289ca770a5dbd5fd267374/cfgv-3.4.0-py2.py3-none-any.whl", hash = "sha256:b7265b1f29fd3316bfcd2b330d63d024f2bfd8bcb8b0272f8e19a504856c48f9", size = 7249 }, 62 | ] 63 | 64 | [[package]] 65 | name = "curl-cffi" 66 | version = "0.7.4" 67 | source = { registry = "https://pypi.org/simple" } 68 | dependencies = [ 69 | { name = "certifi" }, 70 | { name = "cffi" }, 71 | { name = "typing-extensions" }, 72 | ] 73 | sdist = { url = "https://files.pythonhosted.org/packages/d8/b6/81ea20376e1440a2bcb0f0574c158bccb0948621e437f5634b6fc210d2ba/curl_cffi-0.7.4.tar.gz", hash = "sha256:37a2c8ec77b9914b0c14c74f604991751948d9d5def58fcddcbe73e3b62111c1", size = 137276 } 74 | wheels = [ 75 | { url = "https://files.pythonhosted.org/packages/d1/c7/f2133c98a9956baa720dc775ba43b2cf7bf22b0feb0f921aab9bbeb2b58c/curl_cffi-0.7.4-cp38-abi3-macosx_10_9_x86_64.whl", hash = "sha256:417f5264fa746d2680ebb20fbfbcfe5d77fa11a735548d9db6734e839a238e22", size = 5106509 }, 76 | { url = "https://files.pythonhosted.org/packages/29/e9/141ff25c5e35f4afc998cf60134df94e0a9157427da69d6ee1d2a045c554/curl_cffi-0.7.4-cp38-abi3-macosx_11_0_arm64.whl", hash = "sha256:fb76b654fcf9f3e0400cf13be949e4fc525aeb0f9e2e90e61ae48d5bd8557d25", size = 2564082 }, 77 | { url = "https://files.pythonhosted.org/packages/66/c4/442094831e7017347e866809bfba29f116864a046478e013848f272ba7b7/curl_cffi-0.7.4-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bb9db59b164f2b6be65be62add5896a6fe125c52572aca3046caffbd7eb38f46", size = 5716431 }, 78 | { url = "https://files.pythonhosted.org/packages/99/95/6ac63d489167f712bdc14a2cfbe5df252a2e2e95c5b376ea37bda5646fa8/curl_cffi-0.7.4-cp38-abi3-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4593b120c8101b327e4e2d2c278652c5ef58c42dd39dc4586c2789e42a8bc8b1", size = 5521870 }, 79 | { url = "https://files.pythonhosted.org/packages/06/83/2de6b27ba8b3ac394252cadb8783f5c57219068489456d8bb58a180d4aa6/curl_cffi-0.7.4-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c4b5685fab3984aae559e6590a6434a7e34f5d615c562c29c1554a90fffbf0bd", size = 6076887 }, 80 | { url = "https://files.pythonhosted.org/packages/86/1d/29b2cf2b7c82c61aeff0076b02531b49420beb5fa89c5a0529f5c06480fe/curl_cffi-0.7.4-cp38-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:3f8c19b5ca979e806fcf4de24f606eff745c85b43e9e88956d1db3c07516cc4b", size = 6221911 }, 81 | { url = "https://files.pythonhosted.org/packages/1b/7e/a9ba49576373e26169e163878cbb8d4e02cfabf3694c686e22243c12f0dd/curl_cffi-0.7.4-cp38-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:9957464013b1f76b0e9259ab846fa60faef7ff08e96e7a1764dd63c83005b836", size = 6004845 }, 82 | { url = "https://files.pythonhosted.org/packages/c8/d3/79175cf310f0b1c7149e5a2f25cba997aec83a2bcedc85c744a6456e33af/curl_cffi-0.7.4-cp38-abi3-win32.whl", hash = "sha256:8e9019cf6996bf508e4a51751d7217f22d5902405878679a3ac4757159251741", size = 4188474 }, 83 | { url = "https://files.pythonhosted.org/packages/1c/86/6054fcc3fd28ec024ad36a667fa49a05b0c9caf26724186918b7c0ef8217/curl_cffi-0.7.4-cp38-abi3-win_amd64.whl", hash = "sha256:31a80d5ab1bc0f9d4bc0f98d91dc1a3ed4aa08566f21b76ecfde23ece08e0fa9", size = 3993713 }, 84 | ] 85 | 86 | [[package]] 87 | name = "distlib" 88 | version = "0.3.9" 89 | source = { registry = "https://pypi.org/simple" } 90 | sdist = { url = "https://files.pythonhosted.org/packages/0d/dd/1bec4c5ddb504ca60fc29472f3d27e8d4da1257a854e1d96742f15c1d02d/distlib-0.3.9.tar.gz", hash = "sha256:a60f20dea646b8a33f3e7772f74dc0b2d0772d2837ee1342a00645c81edf9403", size = 613923 } 91 | wheels = [ 92 | { url = "https://files.pythonhosted.org/packages/91/a1/cf2472db20f7ce4a6be1253a81cfdf85ad9c7885ffbed7047fb72c24cf87/distlib-0.3.9-py2.py3-none-any.whl", hash = "sha256:47f8c22fd27c27e25a65601af709b38e4f0a45ea4fc2e710f65755fa8caaaf87", size = 468973 }, 93 | ] 94 | 95 | [[package]] 96 | name = "ff14risingstone-sign-task" 97 | version = "0.1.0" 98 | source = { virtual = "." } 99 | dependencies = [ 100 | { name = "curl-cffi" }, 101 | { name = "pydantic-settings" }, 102 | ] 103 | 104 | [package.dev-dependencies] 105 | dev = [ 106 | { name = "pre-commit" }, 107 | { name = "ruff" }, 108 | ] 109 | 110 | [package.metadata] 111 | requires-dist = [ 112 | { name = "curl-cffi", specifier = ">=0.7.4" }, 113 | { name = "pydantic-settings", specifier = "~=2.1" }, 114 | ] 115 | 116 | [package.metadata.requires-dev] 117 | dev = [ 118 | { name = "pre-commit", specifier = "~=4.1" }, 119 | { name = "ruff", specifier = "~=0.9" }, 120 | ] 121 | 122 | [[package]] 123 | name = "filelock" 124 | version = "3.17.0" 125 | source = { registry = "https://pypi.org/simple" } 126 | sdist = { url = "https://files.pythonhosted.org/packages/dc/9c/0b15fb47b464e1b663b1acd1253a062aa5feecb07d4e597daea542ebd2b5/filelock-3.17.0.tar.gz", hash = "sha256:ee4e77401ef576ebb38cd7f13b9b28893194acc20a8e68e18730ba9c0e54660e", size = 18027 } 127 | wheels = [ 128 | { url = "https://files.pythonhosted.org/packages/89/ec/00d68c4ddfedfe64159999e5f8a98fb8442729a63e2077eb9dcd89623d27/filelock-3.17.0-py3-none-any.whl", hash = "sha256:533dc2f7ba78dc2f0f531fc6c4940addf7b70a481e269a5a3b93be94ffbe8338", size = 16164 }, 129 | ] 130 | 131 | [[package]] 132 | name = "identify" 133 | version = "2.6.6" 134 | source = { registry = "https://pypi.org/simple" } 135 | sdist = { url = "https://files.pythonhosted.org/packages/82/bf/c68c46601bacd4c6fb4dd751a42b6e7087240eaabc6487f2ef7a48e0e8fc/identify-2.6.6.tar.gz", hash = "sha256:7bec12768ed44ea4761efb47806f0a41f86e7c0a5fdf5950d4648c90eca7e251", size = 99217 } 136 | wheels = [ 137 | { url = "https://files.pythonhosted.org/packages/74/a1/68a395c17eeefb04917034bd0a1bfa765e7654fa150cca473d669aa3afb5/identify-2.6.6-py2.py3-none-any.whl", hash = "sha256:cbd1810bce79f8b671ecb20f53ee0ae8e86ae84b557de31d89709dc2a48ba881", size = 99083 }, 138 | ] 139 | 140 | [[package]] 141 | name = "nodeenv" 142 | version = "1.9.1" 143 | source = { registry = "https://pypi.org/simple" } 144 | sdist = { url = "https://files.pythonhosted.org/packages/43/16/fc88b08840de0e0a72a2f9d8c6bae36be573e475a6326ae854bcc549fc45/nodeenv-1.9.1.tar.gz", hash = "sha256:6ec12890a2dab7946721edbfbcd91f3319c6ccc9aec47be7c7e6b7011ee6645f", size = 47437 } 145 | wheels = [ 146 | { url = "https://files.pythonhosted.org/packages/d2/1d/1b658dbd2b9fa9c4c9f32accbfc0205d532c8c6194dc0f2a4c0428e7128a/nodeenv-1.9.1-py2.py3-none-any.whl", hash = "sha256:ba11c9782d29c27c70ffbdda2d7415098754709be8a7056d79a737cd901155c9", size = 22314 }, 147 | ] 148 | 149 | [[package]] 150 | name = "platformdirs" 151 | version = "4.3.6" 152 | source = { registry = "https://pypi.org/simple" } 153 | sdist = { url = "https://files.pythonhosted.org/packages/13/fc/128cc9cb8f03208bdbf93d3aa862e16d376844a14f9a0ce5cf4507372de4/platformdirs-4.3.6.tar.gz", hash = "sha256:357fb2acbc885b0419afd3ce3ed34564c13c9b95c89360cd9563f73aa5e2b907", size = 21302 } 154 | wheels = [ 155 | { url = "https://files.pythonhosted.org/packages/3c/a6/bc1012356d8ece4d66dd75c4b9fc6c1f6650ddd5991e421177d9f8f671be/platformdirs-4.3.6-py3-none-any.whl", hash = "sha256:73e575e1408ab8103900836b97580d5307456908a03e92031bab39e4554cc3fb", size = 18439 }, 156 | ] 157 | 158 | [[package]] 159 | name = "pre-commit" 160 | version = "4.1.0" 161 | source = { registry = "https://pypi.org/simple" } 162 | dependencies = [ 163 | { name = "cfgv" }, 164 | { name = "identify" }, 165 | { name = "nodeenv" }, 166 | { name = "pyyaml" }, 167 | { name = "virtualenv" }, 168 | ] 169 | sdist = { url = "https://files.pythonhosted.org/packages/2a/13/b62d075317d8686071eb843f0bb1f195eb332f48869d3c31a4c6f1e063ac/pre_commit-4.1.0.tar.gz", hash = "sha256:ae3f018575a588e30dfddfab9a05448bfbd6b73d78709617b5a2b853549716d4", size = 193330 } 170 | wheels = [ 171 | { url = "https://files.pythonhosted.org/packages/43/b3/df14c580d82b9627d173ceea305ba898dca135feb360b6d84019d0803d3b/pre_commit-4.1.0-py2.py3-none-any.whl", hash = "sha256:d29e7cb346295bcc1cc75fc3e92e343495e3ea0196c9ec6ba53f49f10ab6ae7b", size = 220560 }, 172 | ] 173 | 174 | [[package]] 175 | name = "pycparser" 176 | version = "2.22" 177 | source = { registry = "https://pypi.org/simple" } 178 | sdist = { url = "https://files.pythonhosted.org/packages/1d/b2/31537cf4b1ca988837256c910a668b553fceb8f069bedc4b1c826024b52c/pycparser-2.22.tar.gz", hash = "sha256:491c8be9c040f5390f5bf44a5b07752bd07f56edf992381b05c701439eec10f6", size = 172736 } 179 | wheels = [ 180 | { url = "https://files.pythonhosted.org/packages/13/a3/a812df4e2dd5696d1f351d58b8fe16a405b234ad2886a0dab9183fb78109/pycparser-2.22-py3-none-any.whl", hash = "sha256:c3702b6d3dd8c7abc1afa565d7e63d53a1d0bd86cdc24edd75470f4de499cfcc", size = 117552 }, 181 | ] 182 | 183 | [[package]] 184 | name = "pydantic" 185 | version = "2.10.6" 186 | source = { registry = "https://pypi.org/simple" } 187 | dependencies = [ 188 | { name = "annotated-types" }, 189 | { name = "pydantic-core" }, 190 | { name = "typing-extensions" }, 191 | ] 192 | sdist = { url = "https://files.pythonhosted.org/packages/b7/ae/d5220c5c52b158b1de7ca89fc5edb72f304a70a4c540c84c8844bf4008de/pydantic-2.10.6.tar.gz", hash = "sha256:ca5daa827cce33de7a42be142548b0096bf05a7e7b365aebfa5f8eeec7128236", size = 761681 } 193 | wheels = [ 194 | { url = "https://files.pythonhosted.org/packages/f4/3c/8cc1cc84deffa6e25d2d0c688ebb80635dfdbf1dbea3e30c541c8cf4d860/pydantic-2.10.6-py3-none-any.whl", hash = "sha256:427d664bf0b8a2b34ff5dd0f5a18df00591adcee7198fbd71981054cef37b584", size = 431696 }, 195 | ] 196 | 197 | [[package]] 198 | name = "pydantic-core" 199 | version = "2.27.2" 200 | source = { registry = "https://pypi.org/simple" } 201 | dependencies = [ 202 | { name = "typing-extensions" }, 203 | ] 204 | sdist = { url = "https://files.pythonhosted.org/packages/fc/01/f3e5ac5e7c25833db5eb555f7b7ab24cd6f8c322d3a3ad2d67a952dc0abc/pydantic_core-2.27.2.tar.gz", hash = "sha256:eb026e5a4c1fee05726072337ff51d1efb6f59090b7da90d30ea58625b1ffb39", size = 413443 } 205 | wheels = [ 206 | { url = "https://files.pythonhosted.org/packages/d6/74/51c8a5482ca447871c93e142d9d4a92ead74de6c8dc5e66733e22c9bba89/pydantic_core-2.27.2-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:9e0c8cfefa0ef83b4da9588448b6d8d2a2bf1a53c3f1ae5fca39eb3061e2f0b0", size = 1893127 }, 207 | { url = "https://files.pythonhosted.org/packages/d3/f3/c97e80721735868313c58b89d2de85fa80fe8dfeeed84dc51598b92a135e/pydantic_core-2.27.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:83097677b8e3bd7eaa6775720ec8e0405f1575015a463285a92bfdfe254529ef", size = 1811340 }, 208 | { url = "https://files.pythonhosted.org/packages/9e/91/840ec1375e686dbae1bd80a9e46c26a1e0083e1186abc610efa3d9a36180/pydantic_core-2.27.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:172fce187655fece0c90d90a678424b013f8fbb0ca8b036ac266749c09438cb7", size = 1822900 }, 209 | { url = "https://files.pythonhosted.org/packages/f6/31/4240bc96025035500c18adc149aa6ffdf1a0062a4b525c932065ceb4d868/pydantic_core-2.27.2-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:519f29f5213271eeeeb3093f662ba2fd512b91c5f188f3bb7b27bc5973816934", size = 1869177 }, 210 | { url = "https://files.pythonhosted.org/packages/fa/20/02fbaadb7808be578317015c462655c317a77a7c8f0ef274bc016a784c54/pydantic_core-2.27.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:05e3a55d124407fffba0dd6b0c0cd056d10e983ceb4e5dbd10dda135c31071d6", size = 2038046 }, 211 | { url = "https://files.pythonhosted.org/packages/06/86/7f306b904e6c9eccf0668248b3f272090e49c275bc488a7b88b0823444a4/pydantic_core-2.27.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9c3ed807c7b91de05e63930188f19e921d1fe90de6b4f5cd43ee7fcc3525cb8c", size = 2685386 }, 212 | { url = "https://files.pythonhosted.org/packages/8d/f0/49129b27c43396581a635d8710dae54a791b17dfc50c70164866bbf865e3/pydantic_core-2.27.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6fb4aadc0b9a0c063206846d603b92030eb6f03069151a625667f982887153e2", size = 1997060 }, 213 | { url = "https://files.pythonhosted.org/packages/0d/0f/943b4af7cd416c477fd40b187036c4f89b416a33d3cc0ab7b82708a667aa/pydantic_core-2.27.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:28ccb213807e037460326424ceb8b5245acb88f32f3d2777427476e1b32c48c4", size = 2004870 }, 214 | { url = "https://files.pythonhosted.org/packages/35/40/aea70b5b1a63911c53a4c8117c0a828d6790483f858041f47bab0b779f44/pydantic_core-2.27.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:de3cd1899e2c279b140adde9357c4495ed9d47131b4a4eaff9052f23398076b3", size = 1999822 }, 215 | { url = "https://files.pythonhosted.org/packages/f2/b3/807b94fd337d58effc5498fd1a7a4d9d59af4133e83e32ae39a96fddec9d/pydantic_core-2.27.2-cp312-cp312-musllinux_1_1_armv7l.whl", hash = "sha256:220f892729375e2d736b97d0e51466252ad84c51857d4d15f5e9692f9ef12be4", size = 2130364 }, 216 | { url = "https://files.pythonhosted.org/packages/fc/df/791c827cd4ee6efd59248dca9369fb35e80a9484462c33c6649a8d02b565/pydantic_core-2.27.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:a0fcd29cd6b4e74fe8ddd2c90330fd8edf2e30cb52acda47f06dd615ae72da57", size = 2158303 }, 217 | { url = "https://files.pythonhosted.org/packages/9b/67/4e197c300976af185b7cef4c02203e175fb127e414125916bf1128b639a9/pydantic_core-2.27.2-cp312-cp312-win32.whl", hash = "sha256:1e2cb691ed9834cd6a8be61228471d0a503731abfb42f82458ff27be7b2186fc", size = 1834064 }, 218 | { url = "https://files.pythonhosted.org/packages/1f/ea/cd7209a889163b8dcca139fe32b9687dd05249161a3edda62860430457a5/pydantic_core-2.27.2-cp312-cp312-win_amd64.whl", hash = "sha256:cc3f1a99a4f4f9dd1de4fe0312c114e740b5ddead65bb4102884b384c15d8bc9", size = 1989046 }, 219 | { url = "https://files.pythonhosted.org/packages/bc/49/c54baab2f4658c26ac633d798dab66b4c3a9bbf47cff5284e9c182f4137a/pydantic_core-2.27.2-cp312-cp312-win_arm64.whl", hash = "sha256:3911ac9284cd8a1792d3cb26a2da18f3ca26c6908cc434a18f730dc0db7bfa3b", size = 1885092 }, 220 | { url = "https://files.pythonhosted.org/packages/41/b1/9bc383f48f8002f99104e3acff6cba1231b29ef76cfa45d1506a5cad1f84/pydantic_core-2.27.2-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:7d14bd329640e63852364c306f4d23eb744e0f8193148d4044dd3dacdaacbd8b", size = 1892709 }, 221 | { url = "https://files.pythonhosted.org/packages/10/6c/e62b8657b834f3eb2961b49ec8e301eb99946245e70bf42c8817350cbefc/pydantic_core-2.27.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:82f91663004eb8ed30ff478d77c4d1179b3563df6cdb15c0817cd1cdaf34d154", size = 1811273 }, 222 | { url = "https://files.pythonhosted.org/packages/ba/15/52cfe49c8c986e081b863b102d6b859d9defc63446b642ccbbb3742bf371/pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:71b24c7d61131bb83df10cc7e687433609963a944ccf45190cfc21e0887b08c9", size = 1823027 }, 223 | { url = "https://files.pythonhosted.org/packages/b1/1c/b6f402cfc18ec0024120602bdbcebc7bdd5b856528c013bd4d13865ca473/pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:fa8e459d4954f608fa26116118bb67f56b93b209c39b008277ace29937453dc9", size = 1868888 }, 224 | { url = "https://files.pythonhosted.org/packages/bd/7b/8cb75b66ac37bc2975a3b7de99f3c6f355fcc4d89820b61dffa8f1e81677/pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ce8918cbebc8da707ba805b7fd0b382816858728ae7fe19a942080c24e5b7cd1", size = 2037738 }, 225 | { url = "https://files.pythonhosted.org/packages/c8/f1/786d8fe78970a06f61df22cba58e365ce304bf9b9f46cc71c8c424e0c334/pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:eda3f5c2a021bbc5d976107bb302e0131351c2ba54343f8a496dc8783d3d3a6a", size = 2685138 }, 226 | { url = "https://files.pythonhosted.org/packages/a6/74/d12b2cd841d8724dc8ffb13fc5cef86566a53ed358103150209ecd5d1999/pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bd8086fa684c4775c27f03f062cbb9eaa6e17f064307e86b21b9e0abc9c0f02e", size = 1997025 }, 227 | { url = "https://files.pythonhosted.org/packages/a0/6e/940bcd631bc4d9a06c9539b51f070b66e8f370ed0933f392db6ff350d873/pydantic_core-2.27.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:8d9b3388db186ba0c099a6d20f0604a44eabdeef1777ddd94786cdae158729e4", size = 2004633 }, 228 | { url = "https://files.pythonhosted.org/packages/50/cc/a46b34f1708d82498c227d5d80ce615b2dd502ddcfd8376fc14a36655af1/pydantic_core-2.27.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:7a66efda2387de898c8f38c0cf7f14fca0b51a8ef0b24bfea5849f1b3c95af27", size = 1999404 }, 229 | { url = "https://files.pythonhosted.org/packages/ca/2d/c365cfa930ed23bc58c41463bae347d1005537dc8db79e998af8ba28d35e/pydantic_core-2.27.2-cp313-cp313-musllinux_1_1_armv7l.whl", hash = "sha256:18a101c168e4e092ab40dbc2503bdc0f62010e95d292b27827871dc85450d7ee", size = 2130130 }, 230 | { url = "https://files.pythonhosted.org/packages/f4/d7/eb64d015c350b7cdb371145b54d96c919d4db516817f31cd1c650cae3b21/pydantic_core-2.27.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:ba5dd002f88b78a4215ed2f8ddbdf85e8513382820ba15ad5ad8955ce0ca19a1", size = 2157946 }, 231 | { url = "https://files.pythonhosted.org/packages/a4/99/bddde3ddde76c03b65dfd5a66ab436c4e58ffc42927d4ff1198ffbf96f5f/pydantic_core-2.27.2-cp313-cp313-win32.whl", hash = "sha256:1ebaf1d0481914d004a573394f4be3a7616334be70261007e47c2a6fe7e50130", size = 1834387 }, 232 | { url = "https://files.pythonhosted.org/packages/71/47/82b5e846e01b26ac6f1893d3c5f9f3a2eb6ba79be26eef0b759b4fe72946/pydantic_core-2.27.2-cp313-cp313-win_amd64.whl", hash = "sha256:953101387ecf2f5652883208769a79e48db18c6df442568a0b5ccd8c2723abee", size = 1990453 }, 233 | { url = "https://files.pythonhosted.org/packages/51/b2/b2b50d5ecf21acf870190ae5d093602d95f66c9c31f9d5de6062eb329ad1/pydantic_core-2.27.2-cp313-cp313-win_arm64.whl", hash = "sha256:ac4dbfd1691affb8f48c2c13241a2e3b60ff23247cbcf981759c768b6633cf8b", size = 1885186 }, 234 | ] 235 | 236 | [[package]] 237 | name = "pydantic-settings" 238 | version = "2.7.1" 239 | source = { registry = "https://pypi.org/simple" } 240 | dependencies = [ 241 | { name = "pydantic" }, 242 | { name = "python-dotenv" }, 243 | ] 244 | sdist = { url = "https://files.pythonhosted.org/packages/73/7b/c58a586cd7d9ac66d2ee4ba60ca2d241fa837c02bca9bea80a9a8c3d22a9/pydantic_settings-2.7.1.tar.gz", hash = "sha256:10c9caad35e64bfb3c2fbf70a078c0e25cc92499782e5200747f942a065dec93", size = 79920 } 245 | wheels = [ 246 | { url = "https://files.pythonhosted.org/packages/b4/46/93416fdae86d40879714f72956ac14df9c7b76f7d41a4d68aa9f71a0028b/pydantic_settings-2.7.1-py3-none-any.whl", hash = "sha256:590be9e6e24d06db33a4262829edef682500ef008565a969c73d39d5f8bfb3fd", size = 29718 }, 247 | ] 248 | 249 | [[package]] 250 | name = "python-dotenv" 251 | version = "1.0.1" 252 | source = { registry = "https://pypi.org/simple" } 253 | sdist = { url = "https://files.pythonhosted.org/packages/bc/57/e84d88dfe0aec03b7a2d4327012c1627ab5f03652216c63d49846d7a6c58/python-dotenv-1.0.1.tar.gz", hash = "sha256:e324ee90a023d808f1959c46bcbc04446a10ced277783dc6ee09987c37ec10ca", size = 39115 } 254 | wheels = [ 255 | { url = "https://files.pythonhosted.org/packages/6a/3e/b68c118422ec867fa7ab88444e1274aa40681c606d59ac27de5a5588f082/python_dotenv-1.0.1-py3-none-any.whl", hash = "sha256:f7b63ef50f1b690dddf550d03497b66d609393b40b564ed0d674909a68ebf16a", size = 19863 }, 256 | ] 257 | 258 | [[package]] 259 | name = "pyyaml" 260 | version = "6.0.2" 261 | source = { registry = "https://pypi.org/simple" } 262 | sdist = { url = "https://files.pythonhosted.org/packages/54/ed/79a089b6be93607fa5cdaedf301d7dfb23af5f25c398d5ead2525b063e17/pyyaml-6.0.2.tar.gz", hash = "sha256:d584d9ec91ad65861cc08d42e834324ef890a082e591037abe114850ff7bbc3e", size = 130631 } 263 | wheels = [ 264 | { url = "https://files.pythonhosted.org/packages/86/0c/c581167fc46d6d6d7ddcfb8c843a4de25bdd27e4466938109ca68492292c/PyYAML-6.0.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:c70c95198c015b85feafc136515252a261a84561b7b1d51e3384e0655ddf25ab", size = 183873 }, 265 | { url = "https://files.pythonhosted.org/packages/a8/0c/38374f5bb272c051e2a69281d71cba6fdb983413e6758b84482905e29a5d/PyYAML-6.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ce826d6ef20b1bc864f0a68340c8b3287705cae2f8b4b1d932177dcc76721725", size = 173302 }, 266 | { url = "https://files.pythonhosted.org/packages/c3/93/9916574aa8c00aa06bbac729972eb1071d002b8e158bd0e83a3b9a20a1f7/PyYAML-6.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f71ea527786de97d1a0cc0eacd1defc0985dcf6b3f17bb77dcfc8c34bec4dc5", size = 739154 }, 267 | { url = "https://files.pythonhosted.org/packages/95/0f/b8938f1cbd09739c6da569d172531567dbcc9789e0029aa070856f123984/PyYAML-6.0.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9b22676e8097e9e22e36d6b7bda33190d0d400f345f23d4065d48f4ca7ae0425", size = 766223 }, 268 | { url = "https://files.pythonhosted.org/packages/b9/2b/614b4752f2e127db5cc206abc23a8c19678e92b23c3db30fc86ab731d3bd/PyYAML-6.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:80bab7bfc629882493af4aa31a4cfa43a4c57c83813253626916b8c7ada83476", size = 767542 }, 269 | { url = "https://files.pythonhosted.org/packages/d4/00/dd137d5bcc7efea1836d6264f049359861cf548469d18da90cd8216cf05f/PyYAML-6.0.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:0833f8694549e586547b576dcfaba4a6b55b9e96098b36cdc7ebefe667dfed48", size = 731164 }, 270 | { url = "https://files.pythonhosted.org/packages/c9/1f/4f998c900485e5c0ef43838363ba4a9723ac0ad73a9dc42068b12aaba4e4/PyYAML-6.0.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8b9c7197f7cb2738065c481a0461e50ad02f18c78cd75775628afb4d7137fb3b", size = 756611 }, 271 | { url = "https://files.pythonhosted.org/packages/df/d1/f5a275fdb252768b7a11ec63585bc38d0e87c9e05668a139fea92b80634c/PyYAML-6.0.2-cp312-cp312-win32.whl", hash = "sha256:ef6107725bd54b262d6dedcc2af448a266975032bc85ef0172c5f059da6325b4", size = 140591 }, 272 | { url = "https://files.pythonhosted.org/packages/0c/e8/4f648c598b17c3d06e8753d7d13d57542b30d56e6c2dedf9c331ae56312e/PyYAML-6.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:7e7401d0de89a9a855c839bc697c079a4af81cf878373abd7dc625847d25cbd8", size = 156338 }, 273 | { url = "https://files.pythonhosted.org/packages/ef/e3/3af305b830494fa85d95f6d95ef7fa73f2ee1cc8ef5b495c7c3269fb835f/PyYAML-6.0.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:efdca5630322a10774e8e98e1af481aad470dd62c3170801852d752aa7a783ba", size = 181309 }, 274 | { url = "https://files.pythonhosted.org/packages/45/9f/3b1c20a0b7a3200524eb0076cc027a970d320bd3a6592873c85c92a08731/PyYAML-6.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:50187695423ffe49e2deacb8cd10510bc361faac997de9efef88badc3bb9e2d1", size = 171679 }, 275 | { url = "https://files.pythonhosted.org/packages/7c/9a/337322f27005c33bcb656c655fa78325b730324c78620e8328ae28b64d0c/PyYAML-6.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0ffe8360bab4910ef1b9e87fb812d8bc0a308b0d0eef8c8f44e0254ab3b07133", size = 733428 }, 276 | { url = "https://files.pythonhosted.org/packages/a3/69/864fbe19e6c18ea3cc196cbe5d392175b4cf3d5d0ac1403ec3f2d237ebb5/PyYAML-6.0.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:17e311b6c678207928d649faa7cb0d7b4c26a0ba73d41e99c4fff6b6c3276484", size = 763361 }, 277 | { url = "https://files.pythonhosted.org/packages/04/24/b7721e4845c2f162d26f50521b825fb061bc0a5afcf9a386840f23ea19fa/PyYAML-6.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:70b189594dbe54f75ab3a1acec5f1e3faa7e8cf2f1e08d9b561cb41b845f69d5", size = 759523 }, 278 | { url = "https://files.pythonhosted.org/packages/2b/b2/e3234f59ba06559c6ff63c4e10baea10e5e7df868092bf9ab40e5b9c56b6/PyYAML-6.0.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:41e4e3953a79407c794916fa277a82531dd93aad34e29c2a514c2c0c5fe971cc", size = 726660 }, 279 | { url = "https://files.pythonhosted.org/packages/fe/0f/25911a9f080464c59fab9027482f822b86bf0608957a5fcc6eaac85aa515/PyYAML-6.0.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:68ccc6023a3400877818152ad9a1033e3db8625d899c72eacb5a668902e4d652", size = 751597 }, 280 | { url = "https://files.pythonhosted.org/packages/14/0d/e2c3b43bbce3cf6bd97c840b46088a3031085179e596d4929729d8d68270/PyYAML-6.0.2-cp313-cp313-win32.whl", hash = "sha256:bc2fa7c6b47d6bc618dd7fb02ef6fdedb1090ec036abab80d4681424b84c1183", size = 140527 }, 281 | { url = "https://files.pythonhosted.org/packages/fa/de/02b54f42487e3d3c6efb3f89428677074ca7bf43aae402517bc7cca949f3/PyYAML-6.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:8388ee1976c416731879ac16da0aff3f63b286ffdd57cdeb95f3f2e085687563", size = 156446 }, 282 | ] 283 | 284 | [[package]] 285 | name = "ruff" 286 | version = "0.9.5" 287 | source = { registry = "https://pypi.org/simple" } 288 | sdist = { url = "https://files.pythonhosted.org/packages/02/74/6c359f6b9ed85b88df6ef31febce18faeb852f6c9855651dfb1184a46845/ruff-0.9.5.tar.gz", hash = "sha256:11aecd7a633932875ab3cb05a484c99970b9d52606ce9ea912b690b02653d56c", size = 3634177 } 289 | wheels = [ 290 | { url = "https://files.pythonhosted.org/packages/17/4b/82b7c9ac874e72b82b19fd7eab57d122e2df44d2478d90825854f9232d02/ruff-0.9.5-py3-none-linux_armv6l.whl", hash = "sha256:d466d2abc05f39018d53f681fa1c0ffe9570e6d73cde1b65d23bb557c846f442", size = 11681264 }, 291 | { url = "https://files.pythonhosted.org/packages/27/5c/f5ae0a9564e04108c132e1139d60491c0abc621397fe79a50b3dc0bd704b/ruff-0.9.5-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:38840dbcef63948657fa7605ca363194d2fe8c26ce8f9ae12eee7f098c85ac8a", size = 11657554 }, 292 | { url = "https://files.pythonhosted.org/packages/2a/83/c6926fa3ccb97cdb3c438bb56a490b395770c750bf59f9bc1fe57ae88264/ruff-0.9.5-py3-none-macosx_11_0_arm64.whl", hash = "sha256:d56ba06da53536b575fbd2b56517f6f95774ff7be0f62c80b9e67430391eeb36", size = 11088959 }, 293 | { url = "https://files.pythonhosted.org/packages/af/a7/42d1832b752fe969ffdbfcb1b4cb477cb271bed5835110fb0a16ef31ab81/ruff-0.9.5-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4f7cb2a01da08244c50b20ccfaeb5972e4228c3c3a1989d3ece2bc4b1f996001", size = 11902041 }, 294 | { url = "https://files.pythonhosted.org/packages/53/cf/1fffa09fb518d646f560ccfba59f91b23c731e461d6a4dedd21a393a1ff1/ruff-0.9.5-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:96d5c76358419bc63a671caac70c18732d4fd0341646ecd01641ddda5c39ca0b", size = 11421069 }, 295 | { url = "https://files.pythonhosted.org/packages/09/27/bb8f1b7304e2a9431f631ae7eadc35550fe0cf620a2a6a0fc4aa3d736f94/ruff-0.9.5-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:deb8304636ed394211f3a6d46c0e7d9535b016f53adaa8340139859b2359a070", size = 12625095 }, 296 | { url = "https://files.pythonhosted.org/packages/d7/ce/ab00bc9d3df35a5f1b64f5117458160a009f93ae5caf65894ebb63a1842d/ruff-0.9.5-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:df455000bf59e62b3e8c7ba5ed88a4a2bc64896f900f311dc23ff2dc38156440", size = 13257797 }, 297 | { url = "https://files.pythonhosted.org/packages/88/81/c639a082ae6d8392bc52256058ec60f493c6a4d06d5505bccface3767e61/ruff-0.9.5-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:de92170dfa50c32a2b8206a647949590e752aca8100a0f6b8cefa02ae29dce80", size = 12763793 }, 298 | { url = "https://files.pythonhosted.org/packages/b3/d0/0a3d8f56d1e49af466dc770eeec5c125977ba9479af92e484b5b0251ce9c/ruff-0.9.5-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3d28532d73b1f3f627ba88e1456f50748b37f3a345d2be76e4c653bec6c3e393", size = 14386234 }, 299 | { url = "https://files.pythonhosted.org/packages/04/70/e59c192a3ad476355e7f45fb3a87326f5219cc7c472e6b040c6c6595c8f0/ruff-0.9.5-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2c746d7d1df64f31d90503ece5cc34d7007c06751a7a3bbeee10e5f2463d52d2", size = 12437505 }, 300 | { url = "https://files.pythonhosted.org/packages/55/4e/3abba60a259d79c391713e7a6ccabf7e2c96e5e0a19100bc4204f1a43a51/ruff-0.9.5-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:11417521d6f2d121fda376f0d2169fb529976c544d653d1d6044f4c5562516ee", size = 11884799 }, 301 | { url = "https://files.pythonhosted.org/packages/a3/db/b0183a01a9f25b4efcae919c18fb41d32f985676c917008620ad692b9d5f/ruff-0.9.5-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:5b9d71c3879eb32de700f2f6fac3d46566f644a91d3130119a6378f9312a38e1", size = 11527411 }, 302 | { url = "https://files.pythonhosted.org/packages/0a/e4/3ebfcebca3dff1559a74c6becff76e0b64689cea02b7aab15b8b32ea245d/ruff-0.9.5-py3-none-musllinux_1_2_i686.whl", hash = "sha256:2e36c61145e70febcb78483903c43444c6b9d40f6d2f800b5552fec6e4a7bb9a", size = 12078868 }, 303 | { url = "https://files.pythonhosted.org/packages/ec/b2/5ab808833e06c0a1b0d046a51c06ec5687b73c78b116e8d77687dc0cd515/ruff-0.9.5-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:2f71d09aeba026c922aa7aa19a08d7bd27c867aedb2f74285a2639644c1c12f5", size = 12524374 }, 304 | { url = "https://files.pythonhosted.org/packages/e0/51/1432afcc3b7aa6586c480142caae5323d59750925c3559688f2a9867343f/ruff-0.9.5-py3-none-win32.whl", hash = "sha256:134f958d52aa6fdec3b294b8ebe2320a950d10c041473c4316d2e7d7c2544723", size = 9853682 }, 305 | { url = "https://files.pythonhosted.org/packages/b7/ad/c7a900591bd152bb47fc4882a27654ea55c7973e6d5d6396298ad3fd6638/ruff-0.9.5-py3-none-win_amd64.whl", hash = "sha256:78cc6067f6d80b6745b67498fb84e87d32c6fc34992b52bffefbdae3442967d6", size = 10865744 }, 306 | { url = "https://files.pythonhosted.org/packages/75/d9/fde7610abd53c0c76b6af72fc679cb377b27c617ba704e25da834e0a0608/ruff-0.9.5-py3-none-win_arm64.whl", hash = "sha256:18a29f1a005bddb229e580795627d297dfa99f16b30c7039e73278cf6b5f9fa9", size = 10064595 }, 307 | ] 308 | 309 | [[package]] 310 | name = "typing-extensions" 311 | version = "4.12.2" 312 | source = { registry = "https://pypi.org/simple" } 313 | sdist = { url = "https://files.pythonhosted.org/packages/df/db/f35a00659bc03fec321ba8bce9420de607a1d37f8342eee1863174c69557/typing_extensions-4.12.2.tar.gz", hash = "sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8", size = 85321 } 314 | wheels = [ 315 | { url = "https://files.pythonhosted.org/packages/26/9f/ad63fc0248c5379346306f8668cda6e2e2e9c95e01216d2b8ffd9ff037d0/typing_extensions-4.12.2-py3-none-any.whl", hash = "sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d", size = 37438 }, 316 | ] 317 | 318 | [[package]] 319 | name = "virtualenv" 320 | version = "20.29.1" 321 | source = { registry = "https://pypi.org/simple" } 322 | dependencies = [ 323 | { name = "distlib" }, 324 | { name = "filelock" }, 325 | { name = "platformdirs" }, 326 | ] 327 | sdist = { url = "https://files.pythonhosted.org/packages/a7/ca/f23dcb02e161a9bba141b1c08aa50e8da6ea25e6d780528f1d385a3efe25/virtualenv-20.29.1.tar.gz", hash = "sha256:b8b8970138d32fb606192cb97f6cd4bb644fa486be9308fb9b63f81091b5dc35", size = 7658028 } 328 | wheels = [ 329 | { url = "https://files.pythonhosted.org/packages/89/9b/599bcfc7064fbe5740919e78c5df18e5dceb0887e676256a1061bb5ae232/virtualenv-20.29.1-py3-none-any.whl", hash = "sha256:4e4cb403c0b0da39e13b46b1b2476e505cb0046b25f242bee80f62bf990b2779", size = 4282379 }, 330 | ] 331 | --------------------------------------------------------------------------------