Metadata-Version: 2.5
Name: nonebot-adapter-afdian
Version: 0.2.0
Summary: 爱发电适配器
Author-email: 17TheWord <17theword@gmail.com>
License-Expression: MIT
License-File: LICENSE
Requires-Python: <4,>=3.10
Requires-Dist: cryptography>=43
Requires-Dist: nonebot2[fastapi,httpx]<3,>=2.4.2
Requires-Dist: pydantic!=2.5.0,!=2.5.1,<3.0.0,>=1.10.0
Description-Content-Type: text/markdown

# nonebot-adapter-afdian

基于 NoneBot2 的爱发电适配器

## 使用

1. 安装

    ```shell
    pip install nonebot-adapter-afdian
    ```

2. 启用

    ```toml
    adapters = [
        { name = "Afdian", module_name = "nonebot.adapter.afdian" }
    ]
    ```

3. 配置

    - NoneBot2

        ```dotenv
        DRIVER=~fastapi+~httpx
        HOST=0.0.0.0
        AFDIAN_HOOK_SECRET='<Your Secret>'
        AFDIAN_BOTS='[
            {
                "user_id": "<Your User Id>",
                "token": "<Your Token>"
            }
        ]'
        # 可选：Webhook 签名验证公钥（PEM），留空使用内置平台公钥
        AFDIAN_WEBHOOK_PUBLIC_KEY=''
        ```

    - 爱发电开发者控制台

        ```shell
        http://<IP>:<PORT>/afdian/webhooks/<user_id>
        ```

        or

        ```shell
        https://<IP>:<PORT>/afdian/<Your Secret>/webhooks/<user_id>
        ```

## Webhook 签名验证

2025-07-01 起爱发电 Webhook 推送携带 `sign` 签名字段，适配器会使用内置平台公钥自动进行本地验签（RSA-SHA256），无需额外配置。

如平台更换公钥，可通过 `AFDIAN_WEBHOOK_PUBLIC_KEY` 配置自定义 PEM 公钥覆盖。未携带签名的旧版推送仍走订单回查验证。

## API

```python
from nonebot import on_notice
from nonebot.adapters.afdian import OrderNotifyEvent, Bot

test_afd = on_notice()


@test_afd.handle()
async def handle_afd(bot: Bot, event: OrderNotifyEvent):
    print("订单：" + event.data.order)

    result1 = await bot.query_order_by_page(page=1)
    print(result1)

    result2 = await bot.query_order_by_out_trade_no(
        out_trade_no="202308200000000000000000001"
        )
    print(result2)

    result3 = await bot.query_order_by_order_list(
        order_list=["202308200000000000000000000", "202308200000000000000000001"]
        )
    print(result3)

    result4 = await bot.query_sponsor(page=1)
    print(result4)

    result5 = await bot.query_sponsor(page=1, per_page=20) # 查询第一页，每页20个
    print(result5)

    # 根据订单号查询随机自动回复
    result6 = await bot.query_random_reply(
        out_trade_no="202308200000000000000000001"
        )
    print(result6)

    # 通过 API 填入自动回复（可用于补货、发码等场景）
    result7 = await bot.update_plan_reply(
        plan_id="<Your Plan Id>",  # 与 sku_id 二选一
        auto_random_reply="<New Code>",
        update_random_reply_type="overwrite",  # append 追加 / overwrite 覆盖
        )
    print(result7)

    # 发送私信（平台限频 10 次/秒 和 1000 次/小时）
    result8 = await bot.send_msg(recipient="<User Id>", content="<Content>")
    print(result8)

    # 查看方案详情
    result9 = await bot.query_plan(plan_id="<Your Plan Id>")
    print(result9)
```

## 特别感谢

- [NoneBot2](https://github.com/nonebot/nonebot2)：开发框架。

## 贡献与支持

觉得好用可以给这个项目点个 `Star` 或者去 [爱发电](https://afdian.com/a/17TheWord) 投喂我。

有意见或者建议也欢迎提交 [Issues](https://github.com/MineGraphCN/nonebot-adapter-afdian/issues)
和 [Pull requests](https://github.com/MineGraphCN/nonebot-adapter-afdian/pulls) 。

## 开源许可

本项目使用 [MIT](./LICENSE) 作为开源许可证。
