miaucl/cookidoo-api

GitHub: miaucl/cookidoo-api

非官方 Python 异步库,用于程序化访问 Cookidoo 食谱平台,实现食谱管理、购物清单与日历等功能的自动化操作。

Stars: 97 | Forks: 22

# Cookidoo API [![PyPI 版本](https://badge.fury.io/py/cookidoo-api.svg)](https://pypi.org/p/cookidoo-api) 一个用于访问 Cookidoo 的非官方 Python 包。 [![单元测试](https://static.pigsec.cn/wp-content/uploads/repos/2026/04/3f8b0334a2182254.svg)](https://github.com/miaucl/cookidoo-api/actions/workflows/unit-tests.yaml) [![冒烟测试](https://static.pigsec.cn/wp-content/uploads/repos/2026/04/efca74ef86182255.svg)](https://github.com/miaucl/cookidoo-api/actions/workflows/smoke-test.yaml) [![codecov](https://codecov.io/gh/miaucl/cookidoo-api/graph/badge.svg?token=743ZRO8FRT)](https://codecov.io/gh/miaucl/cookidoo-api) [![Ruff](https://static.pigsec.cn/wp-content/uploads/repos/2026/04/039ededf44182257.svg)](https://github.com/miaucl/cookidoo-api/actions/workflows/ruff.yml) [![Mypy](https://static.pigsec.cn/wp-content/uploads/repos/2026/04/4e663db875182258.svg)](https://github.com/miaucl/cookidoo-api/actions/workflows/mypy.yaml) [![Markdownlint](https://static.pigsec.cn/wp-content/uploads/repos/2026/04/4eac4da89f182259.svg)](https://github.com/miaucl/cookidoo-api/actions/workflows/markdownlint.yml) ## 免责声明 此模块的开发人员未以任何方式受到 Cookidoo 或 Vorwerk 的认可或附属,也不涉及任何相关的子公司、徽标或商标。 ## 安装 `pip install cookidoo-api` ## 文档 有关使用示例,请参见下文。 ## 使用示例 该 API 基于 `aiohttp` 库。 确保将你的凭据存储在顶层文件 `.env` 中,以便通过 `dotenv` 加载。或者,通过任何其他与 `dotenv` 兼容的方式提供环境变量。 ``` EMAIL=your@mail.com PASSWORD=password ``` 运行[示例脚本](https://github.com/miaucl/cookidoo-api/blob/master/example.py)并查看内联注释以获取更多说明。 ## 异常 如果在请求过程中出现问题,可能会抛出多个[异常](https://github.com/miaucl/cookidoo/blob/master/cookidoo_api/exceptions.py),它们均继承自 `CookidooException`。 ### 另一个 asyncio 事件循环已存在 在异步调用中,你可能会遇到一个错误,提示同一个线程中已经有一个 asyncio 事件循环正在运行。根据 `asyncio.run()` 的[文档](https://docs.python.org/3/library/asyncio-runner.html#asyncio.run),这是预期行为。你不能在一个线程中使用多个 `aiohttp` session,请复用现有的 session! ### Exception ignored: RuntimeError: Event loop is closed 由于 Windows 上某些版本的 `aiohttp` 存在一个已知问题,你可能会遇到与此类似的错误: ``` Exception ignored in: Traceback (most recent call last): File "C:\...\py38\lib\asyncio\proactor_events.py", line 116, in __del__ self.close() File "C:\...\py38\lib\asyncio\proactor_events.py", line 108, in close self._loop.call_soon(self._call_connection_lost, None) File "C:\...\py38\lib\asyncio\base_events.py", line 719, in call_soon self._check_closed() File "C:\...\py38\lib\asyncio\base_events.py", line 508, in _check_closed raise RuntimeError('Event loop is closed') RuntimeError: Event loop is closed ``` 你可以根据 StackOverflow 上的[这个回答](https://stackoverflow.com/questions/68123296/asyncio-throws-runtime-error-with-exception-ignored),在执行该库之前添加以下代码行来修复此问题: ``` asyncio.set_event_loop_policy(asyncio.WindowsSelectorEventLoopPolicy()) ``` ## 开发 强烈建议使用 VSCode 来设置开发环境。 ``` python -m venv .venv source .venv/bin/activate pip install -r requirements_dev.txt ``` 安装 [pre-commit](https://pre-commit.com) ``` pre-commit install # 手动运行 commit hooks pre-commit run --all-files ``` 以下 VSCode 扩展可能会有所帮助: - [ruff](https://marketplace.visualstudio.com/items?itemName=charliermarsh.ruff) - [mypy](https://marketplace.visualstudio.com/items?itemName=matangover.mypy) - [markdownlint](https://marketplace.visualstudio.com/items?itemName=DavidAnson.vscode-markdownlint) ### 原始 API 请求 在 Cookidoo Android 应用和后端之间拦截的原始请求可以在 `./docs/raw-api-requests` 中找到。它们已被用于重构本库中实现的 API。 ## 测试 有一套基于 API 当前行为的测试。 ### 单元测试 单元测试基于在服务器和 Android 应用之间捕获并记录的 payload。它们是当时的快照,并且可能会发生变化。 ### 冒烟测试 冒烟测试实现了一系列查询服务器的请求。它试图在不给服务器造成太大负担的情况下覆盖尽可能多的功能(我们希望保持友好且不被发现 ^^)。因此,仍有可能出现某些功能损坏但未被发现的情况。此外,由于它作为 GitHub Action 运行,仅测试了**非高级**功能,因为目前不值得仅为测试而维持高级订阅(如果有几个赞助的话可能会改变主意 ^^)。如果高级功能出现问题,可以很容易地创建一个具有试用期的临时账户。 ### 发布 _正式版_ 只能从 `master` 分支发布。要通过 `publish` 工作流的关卡,`tag` 和 `cookidoo_api/__init__.py` 中的版本号必须匹配。 要发布预发布版本,必须从功能分支(**而非** `master`)进行。预发布版本会在 GitHub 发布页面被明确标记。 ## 路线图 - [x] 将自定义食谱添加到日历和购物清单 - [ ] 编辑自定义食谱 - [ ] 创建空白自定义食谱(而非复制现有食谱)
标签:aiohttp, API, Cookidoo, dotenv, PyPI, Python, Vorwerk, 开源, 异步编程, 接口封装, 无后门, 智能家居, 烹饪, 登录认证, 第三方库, 网络请求, 网络调试, 美善品, 美食, 自动化, 计算机取证, 逆向工具, 非官方, 食谱