miaucl/cookidoo-api
GitHub: miaucl/cookidoo-api
非官方 Python 异步库,用于程序化访问 Cookidoo 食谱平台,实现食谱管理、购物清单与日历等功能的自动化操作。
Stars: 97 | Forks: 22
# Cookidoo API
[](https://pypi.org/p/cookidoo-api)
一个用于访问 Cookidoo 的非官方 Python 包。
[](https://github.com/miaucl/cookidoo-api/actions/workflows/unit-tests.yaml)
[](https://github.com/miaucl/cookidoo-api/actions/workflows/smoke-test.yaml)
[](https://codecov.io/gh/miaucl/cookidoo-api)
[](https://github.com/miaucl/cookidoo-api/actions/workflows/ruff.yml)
[](https://github.com/miaucl/cookidoo-api/actions/workflows/mypy.yaml)
[](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, 开源, 异步编程, 接口封装, 无后门, 智能家居, 烹饪, 登录认证, 第三方库, 网络请求, 网络调试, 美善品, 美食, 自动化, 计算机取证, 逆向工具, 非官方, 食谱