nonebot-plugin-repeat-checker


Namenonebot-plugin-repeat-checker JSON
Version 1.1.0 PyPI version JSON
download
home_pageNone
SummaryA NoneBot2 plugin to detect and ban repeat messages in groups
upload_time2025-08-23 16:53:38
maintainerNone
docs_urlNone
authorNone
requires_python>=3.8
licenseAGPL-3.0
keywords nonebot nonebot2 plugin repeat ban group
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            <div align="center">
  <a href="https://v2.nonebot.dev/store"><img src="https://github.com/A-kirami/nonebot-plugin-template/blob/resources/nbp_logo.png" width="180" height="180" alt="NoneBotPluginLogo"></a>
  <br>
  <p><img src="https://github.com/A-kirami/nonebot-plugin-template/blob/resources/NoneBotPlugin.svg" width="240" alt="NoneBotPluginText"></p>
</div>

<div align="center">

# nonebot-plugin-repeat-checker

_✨ 适用于 NoneBot2 的群复读检测与禁言插件 ✨_


<a href="./LICENSE">
    <img src="https://img.shields.io/github/license/SuperWaterGod/nonebot-plugin-repeat-checker.svg" alt="license">
</a>
<a href="https://pypi.python.org/pypi/nonebot-plugin-repeat-checker">
    <img src="https://img.shields.io/pypi/v/nonebot-plugin-repeat-checker.svg" alt="pypi">
</a>
<img src="https://img.shields.io/badge/python-3.9+-blue.svg" alt="python">

</div>

智能检测群聊中的复读行为,并对最后一位复读的成员进行禁言。支持文本、图片及混合消息的相似度检测。

## 📖 介绍

功能介绍

- 📦 开箱即用,轻松集成到 NoneBot2 项目中

- 🚫 自动检测复读行为并禁言最后复读者

- 🖼️ 支持文本和图片消息的复读检测

- 🧹 智能消息清理,处理特殊字符和控制字符

- 💾 Sqlite轻量化数据存储


## 💿 安装
> [!IMPORTANT]
> 必须安装依赖包
> ```bash
>   pip install aiosqlite unidecode
> ```

<details open>
<summary>手动安装</summary>

1. 将整个 `nonebot-plugin-repeat-checker` 文件夹放置到你的 NoneBot2 项目的 `plugins` 目录下

2. 重启你的 NoneBot2 机器人

</details>

<details>
<summary>使用 nb-cli 安装</summary>
在 nonebot2 项目的根目录下打开命令行, 输入以下指令即可安装

    nb plugin install nonebot-plugin-repeat-checker

</details>

<details>
<summary>使用包管理器安装</summary>
在 nonebot2 项目的插件目录下, 打开命令行, 根据你使用的包管理器, 输入相应的安装命令

<details>
<summary>pip</summary>

    pip install nonebot-plugin-repeat-checker
</details>
<details>
<summary>pdm</summary>

    pdm add nonebot-plugin-repeat-checker
</details>
<details>
<summary>poetry</summary>

    poetry add nonebot-plugin-repeat-checker
</details>
<details>
<summary>conda</summary>

    conda install nonebot-plugin-repeat-checker
</details>

打开 nonebot2 项目根目录下的 `pyproject.toml` 文件, 在 `[tool.nonebot]` 部分追加写入

    plugins = ["nonebot_plugin_repeat_checker"]

</details>

## ⚙️ 配置

在 nonebot2 项目的`.env`文件中添加下表中的配置项

或者在 `config.py` 中可以调整以下配置:


| 配置项 | 必填 | 默认值 | 说明 |
|--------|----|--------|------|
| `repeat_checker_silence_duration` | 否  | 3600 | 基础禁言时长(秒) |
| `repeat_checker_similarity_threshold` |  否 | 0.8 | 消息相似度阈值(0-1) |
| `repeat_checker_repeat_threshold` |  否 | 2 | 触发禁言的最小复读次数 |
| `repeat_checker_db_path` |  否 | `data/plugins/nonebot-plugin-repeat-checker/data.db` | SQLite数据库文件路径 |
| `repeat_checker_enable_image_check` |  否 | True | 是否启用图片复读检测 |
| `repeat_checker_debug` |  否 | False | 是否启用调试模式 |
| `repeat_checker_group_mode` |  否 | "blacklist" | 群组控制模式(whitelist/blacklist) |
| `repeat_checker_group_list` |  否  | [] | 白名单/黑名单群号列表 |消息相似度阈值(0-1) |


## 目录结构

```
./nonebot-plugin-repeat-checker/
├── __init__.py            # 主入口文件
├── config.py              # 配置管理
├── database.py            # 数据存储管理
├── checker.py             # 消息处理
├── utils.py               # 工具函数
└── README.md              # 说明文档
```


## 使用说明

### 群组控制

插件支持白名单/黑名单模式来控制在哪些群组启用功能:

- **blacklist模式(默认)**:除了在黑名单中的群组外,其他所有群组都启用复读检测
- **whitelist模式**:只有在白名单中的群组才启用复读检测

配置示例:
```python
# 黑名单模式:禁用群组123456和789012的复读检测
repeat_checker_group_mode = "blacklist"
repeat_checker_group_list = [123456, 789012]

# 白名单模式:只在群组111111和222222启用复读检测
repeat_checker_group_mode = "whitelist" 
repeat_checker_group_list = [111111, 222222]
```

### 自动功能

插件会自动监控群聊消息,当检测到复读行为时:

1. **检测条件**:当连续消息相似度达到阈值时认为是复读
2. **触发禁言**:复读次数达到设定值且有新的不同消息时,禁言最后一个复读者
3. **禁言时长**:`基础时长 × 复读次数 × 该用户历史被禁言次数`


## 工作原理

1. **消息处理**:
   - 清理控制字符和特殊符号
   - 使用 `unidecode` 转换特殊字符
   - 对图片消息提取标识符

2. **相似度检测**:
   - 使用 `difflib.SequenceMatcher` 计算消息相似度
   - 可配置相似度阈值

3. **禁言逻辑**:
   - 记录每个群组的复读状态
   - 累计用户的被禁言次数
   - 动态计算禁言时长

4. **数据存储**:
   - 使用 SQLite 数据库持久化数据
   - 线程安全的数据库操作
   - 自动创建数据目录和表结构

5. **群组控制**:
   - 支持白名单/黑名单模式
   - 灵活控制插件在不同群组的启用状态

## 数据库结构

### group_repeat_info 表
- `group_id`: 群组ID(主键)
- `last_message_content`: 最后一条消息内容
- `last_repeater_id`: 最后复读者ID
- `repeat_count`: 当前复读次数
- `created_at`: 创建时间
- `updated_at`: 更新时间

### user_ban_count 表
- `group_id`: 群组ID(主键)
- `user_id`: 用户ID(主键)
- `ban_count`: 禁言次数
- `created_at`: 创建时间
- `updated_at`: 更新时间


## 注意事项

1. **权限要求**:机器人需要有群管理员权限才能执行禁言操作
2. **数据安全**:插件会自动处理数据库读写错误,使用事务确保数据一致性
3. **性能考虑**:使用SQLite数据库和线程锁保证并发安全
4. **群组控制**:合理配置群组白名单/黑名单,避免在不需要的群组启用功能

## 更新日志

### v1.0.0
- 重构为标准 NoneBot2 插件结构
- 使用Sqlite数据库存储数据
- 支持图片复读检测
- 添加群组白名单/黑名单功能
- 优化消息处理逻辑

## 贡献

欢迎提交 Issue 和 Pull Request 来改进这个插件!

## 许可证

本项目使用 AGPL-3.0 许可证。

            

Raw data

            {
    "_id": null,
    "home_page": null,
    "name": "nonebot-plugin-repeat-checker",
    "maintainer": null,
    "docs_url": null,
    "requires_python": ">=3.8",
    "maintainer_email": null,
    "keywords": "nonebot, nonebot2, plugin, repeat, ban, group",
    "author": null,
    "author_email": "SuperWaterGod <yancaiwudi@foxmail.com>",
    "download_url": "https://files.pythonhosted.org/packages/44/6e/d1f6a46e47046e7295f3f40cec68872588722f373ffd9be667e820fcfb2d/nonebot_plugin_repeat_checker-1.1.0.tar.gz",
    "platform": null,
    "description": "<div align=\"center\">\n  <a href=\"https://v2.nonebot.dev/store\"><img src=\"https://github.com/A-kirami/nonebot-plugin-template/blob/resources/nbp_logo.png\" width=\"180\" height=\"180\" alt=\"NoneBotPluginLogo\"></a>\n  <br>\n  <p><img src=\"https://github.com/A-kirami/nonebot-plugin-template/blob/resources/NoneBotPlugin.svg\" width=\"240\" alt=\"NoneBotPluginText\"></p>\n</div>\n\n<div align=\"center\">\n\n# nonebot-plugin-repeat-checker\n\n_\u2728 \u9002\u7528\u4e8e NoneBot2 \u7684\u7fa4\u590d\u8bfb\u68c0\u6d4b\u4e0e\u7981\u8a00\u63d2\u4ef6 \u2728_\n\n\n<a href=\"./LICENSE\">\n    <img src=\"https://img.shields.io/github/license/SuperWaterGod/nonebot-plugin-repeat-checker.svg\" alt=\"license\">\n</a>\n<a href=\"https://pypi.python.org/pypi/nonebot-plugin-repeat-checker\">\n    <img src=\"https://img.shields.io/pypi/v/nonebot-plugin-repeat-checker.svg\" alt=\"pypi\">\n</a>\n<img src=\"https://img.shields.io/badge/python-3.9+-blue.svg\" alt=\"python\">\n\n</div>\n\n\u667a\u80fd\u68c0\u6d4b\u7fa4\u804a\u4e2d\u7684\u590d\u8bfb\u884c\u4e3a\uff0c\u5e76\u5bf9\u6700\u540e\u4e00\u4f4d\u590d\u8bfb\u7684\u6210\u5458\u8fdb\u884c\u7981\u8a00\u3002\u652f\u6301\u6587\u672c\u3001\u56fe\u7247\u53ca\u6df7\u5408\u6d88\u606f\u7684\u76f8\u4f3c\u5ea6\u68c0\u6d4b\u3002\n\n## \ud83d\udcd6 \u4ecb\u7ecd\n\n\u529f\u80fd\u4ecb\u7ecd\n\n- \ud83d\udce6 \u5f00\u7bb1\u5373\u7528\uff0c\u8f7b\u677e\u96c6\u6210\u5230 NoneBot2 \u9879\u76ee\u4e2d\n\n- \ud83d\udeab \u81ea\u52a8\u68c0\u6d4b\u590d\u8bfb\u884c\u4e3a\u5e76\u7981\u8a00\u6700\u540e\u590d\u8bfb\u8005\n\n- \ud83d\uddbc\ufe0f \u652f\u6301\u6587\u672c\u548c\u56fe\u7247\u6d88\u606f\u7684\u590d\u8bfb\u68c0\u6d4b\n\n- \ud83e\uddf9 \u667a\u80fd\u6d88\u606f\u6e05\u7406\uff0c\u5904\u7406\u7279\u6b8a\u5b57\u7b26\u548c\u63a7\u5236\u5b57\u7b26\n\n- \ud83d\udcbe Sqlite\u8f7b\u91cf\u5316\u6570\u636e\u5b58\u50a8\n\n\n## \ud83d\udcbf \u5b89\u88c5\n> [!IMPORTANT]\n> \u5fc5\u987b\u5b89\u88c5\u4f9d\u8d56\u5305\n> ```bash\n>   pip install aiosqlite unidecode\n> ```\n\n<details open>\n<summary>\u624b\u52a8\u5b89\u88c5</summary>\n\n1. \u5c06\u6574\u4e2a `nonebot-plugin-repeat-checker` \u6587\u4ef6\u5939\u653e\u7f6e\u5230\u4f60\u7684 NoneBot2 \u9879\u76ee\u7684 `plugins` \u76ee\u5f55\u4e0b\n\n2. \u91cd\u542f\u4f60\u7684 NoneBot2 \u673a\u5668\u4eba\n\n</details>\n\n<details>\n<summary>\u4f7f\u7528 nb-cli \u5b89\u88c5</summary>\n\u5728 nonebot2 \u9879\u76ee\u7684\u6839\u76ee\u5f55\u4e0b\u6253\u5f00\u547d\u4ee4\u884c, \u8f93\u5165\u4ee5\u4e0b\u6307\u4ee4\u5373\u53ef\u5b89\u88c5\n\n    nb plugin install nonebot-plugin-repeat-checker\n\n</details>\n\n<details>\n<summary>\u4f7f\u7528\u5305\u7ba1\u7406\u5668\u5b89\u88c5</summary>\n\u5728 nonebot2 \u9879\u76ee\u7684\u63d2\u4ef6\u76ee\u5f55\u4e0b, \u6253\u5f00\u547d\u4ee4\u884c, \u6839\u636e\u4f60\u4f7f\u7528\u7684\u5305\u7ba1\u7406\u5668, \u8f93\u5165\u76f8\u5e94\u7684\u5b89\u88c5\u547d\u4ee4\n\n<details>\n<summary>pip</summary>\n\n    pip install nonebot-plugin-repeat-checker\n</details>\n<details>\n<summary>pdm</summary>\n\n    pdm add nonebot-plugin-repeat-checker\n</details>\n<details>\n<summary>poetry</summary>\n\n    poetry add nonebot-plugin-repeat-checker\n</details>\n<details>\n<summary>conda</summary>\n\n    conda install nonebot-plugin-repeat-checker\n</details>\n\n\u6253\u5f00 nonebot2 \u9879\u76ee\u6839\u76ee\u5f55\u4e0b\u7684 `pyproject.toml` \u6587\u4ef6, \u5728 `[tool.nonebot]` \u90e8\u5206\u8ffd\u52a0\u5199\u5165\n\n    plugins = [\"nonebot_plugin_repeat_checker\"]\n\n</details>\n\n## \u2699\ufe0f \u914d\u7f6e\n\n\u5728 nonebot2 \u9879\u76ee\u7684`.env`\u6587\u4ef6\u4e2d\u6dfb\u52a0\u4e0b\u8868\u4e2d\u7684\u914d\u7f6e\u9879\n\n\u6216\u8005\u5728 `config.py` \u4e2d\u53ef\u4ee5\u8c03\u6574\u4ee5\u4e0b\u914d\u7f6e\uff1a\n\n\n| \u914d\u7f6e\u9879 | \u5fc5\u586b | \u9ed8\u8ba4\u503c | \u8bf4\u660e |\n|--------|----|--------|------|\n| `repeat_checker_silence_duration` | \u5426  | 3600 | \u57fa\u7840\u7981\u8a00\u65f6\u957f\uff08\u79d2\uff09 |\n| `repeat_checker_similarity_threshold` |  \u5426 | 0.8 | \u6d88\u606f\u76f8\u4f3c\u5ea6\u9608\u503c\uff080-1\uff09 |\n| `repeat_checker_repeat_threshold` |  \u5426 | 2 | \u89e6\u53d1\u7981\u8a00\u7684\u6700\u5c0f\u590d\u8bfb\u6b21\u6570 |\n| `repeat_checker_db_path` |  \u5426 | `data/plugins/nonebot-plugin-repeat-checker/data.db` | SQLite\u6570\u636e\u5e93\u6587\u4ef6\u8def\u5f84 |\n| `repeat_checker_enable_image_check` |  \u5426 | True | \u662f\u5426\u542f\u7528\u56fe\u7247\u590d\u8bfb\u68c0\u6d4b |\n| `repeat_checker_debug` |  \u5426 | False | \u662f\u5426\u542f\u7528\u8c03\u8bd5\u6a21\u5f0f |\n| `repeat_checker_group_mode` |  \u5426 | \"blacklist\" | \u7fa4\u7ec4\u63a7\u5236\u6a21\u5f0f\uff08whitelist/blacklist\uff09 |\n| `repeat_checker_group_list` |  \u5426  | [] | \u767d\u540d\u5355/\u9ed1\u540d\u5355\u7fa4\u53f7\u5217\u8868 |\u6d88\u606f\u76f8\u4f3c\u5ea6\u9608\u503c\uff080-1\uff09 |\n\n\n## \u76ee\u5f55\u7ed3\u6784\n\n```\n./nonebot-plugin-repeat-checker/\n\u251c\u2500\u2500 __init__.py            # \u4e3b\u5165\u53e3\u6587\u4ef6\n\u251c\u2500\u2500 config.py              # \u914d\u7f6e\u7ba1\u7406\n\u251c\u2500\u2500 database.py            # \u6570\u636e\u5b58\u50a8\u7ba1\u7406\n\u251c\u2500\u2500 checker.py             # \u6d88\u606f\u5904\u7406\n\u251c\u2500\u2500 utils.py               # \u5de5\u5177\u51fd\u6570\n\u2514\u2500\u2500 README.md              # \u8bf4\u660e\u6587\u6863\n```\n\n\n## \u4f7f\u7528\u8bf4\u660e\n\n### \u7fa4\u7ec4\u63a7\u5236\n\n\u63d2\u4ef6\u652f\u6301\u767d\u540d\u5355/\u9ed1\u540d\u5355\u6a21\u5f0f\u6765\u63a7\u5236\u5728\u54ea\u4e9b\u7fa4\u7ec4\u542f\u7528\u529f\u80fd\uff1a\n\n- **blacklist\u6a21\u5f0f\uff08\u9ed8\u8ba4\uff09**\uff1a\u9664\u4e86\u5728\u9ed1\u540d\u5355\u4e2d\u7684\u7fa4\u7ec4\u5916\uff0c\u5176\u4ed6\u6240\u6709\u7fa4\u7ec4\u90fd\u542f\u7528\u590d\u8bfb\u68c0\u6d4b\n- **whitelist\u6a21\u5f0f**\uff1a\u53ea\u6709\u5728\u767d\u540d\u5355\u4e2d\u7684\u7fa4\u7ec4\u624d\u542f\u7528\u590d\u8bfb\u68c0\u6d4b\n\n\u914d\u7f6e\u793a\u4f8b\uff1a\n```python\n# \u9ed1\u540d\u5355\u6a21\u5f0f\uff1a\u7981\u7528\u7fa4\u7ec4123456\u548c789012\u7684\u590d\u8bfb\u68c0\u6d4b\nrepeat_checker_group_mode = \"blacklist\"\nrepeat_checker_group_list = [123456, 789012]\n\n# \u767d\u540d\u5355\u6a21\u5f0f\uff1a\u53ea\u5728\u7fa4\u7ec4111111\u548c222222\u542f\u7528\u590d\u8bfb\u68c0\u6d4b\nrepeat_checker_group_mode = \"whitelist\" \nrepeat_checker_group_list = [111111, 222222]\n```\n\n### \u81ea\u52a8\u529f\u80fd\n\n\u63d2\u4ef6\u4f1a\u81ea\u52a8\u76d1\u63a7\u7fa4\u804a\u6d88\u606f\uff0c\u5f53\u68c0\u6d4b\u5230\u590d\u8bfb\u884c\u4e3a\u65f6\uff1a\n\n1. **\u68c0\u6d4b\u6761\u4ef6**\uff1a\u5f53\u8fde\u7eed\u6d88\u606f\u76f8\u4f3c\u5ea6\u8fbe\u5230\u9608\u503c\u65f6\u8ba4\u4e3a\u662f\u590d\u8bfb\n2. **\u89e6\u53d1\u7981\u8a00**\uff1a\u590d\u8bfb\u6b21\u6570\u8fbe\u5230\u8bbe\u5b9a\u503c\u4e14\u6709\u65b0\u7684\u4e0d\u540c\u6d88\u606f\u65f6\uff0c\u7981\u8a00\u6700\u540e\u4e00\u4e2a\u590d\u8bfb\u8005\n3. **\u7981\u8a00\u65f6\u957f**\uff1a`\u57fa\u7840\u65f6\u957f \u00d7 \u590d\u8bfb\u6b21\u6570 \u00d7 \u8be5\u7528\u6237\u5386\u53f2\u88ab\u7981\u8a00\u6b21\u6570`\n\n\n## \u5de5\u4f5c\u539f\u7406\n\n1. **\u6d88\u606f\u5904\u7406**\uff1a\n   - \u6e05\u7406\u63a7\u5236\u5b57\u7b26\u548c\u7279\u6b8a\u7b26\u53f7\n   - \u4f7f\u7528 `unidecode` \u8f6c\u6362\u7279\u6b8a\u5b57\u7b26\n   - \u5bf9\u56fe\u7247\u6d88\u606f\u63d0\u53d6\u6807\u8bc6\u7b26\n\n2. **\u76f8\u4f3c\u5ea6\u68c0\u6d4b**\uff1a\n   - \u4f7f\u7528 `difflib.SequenceMatcher` \u8ba1\u7b97\u6d88\u606f\u76f8\u4f3c\u5ea6\n   - \u53ef\u914d\u7f6e\u76f8\u4f3c\u5ea6\u9608\u503c\n\n3. **\u7981\u8a00\u903b\u8f91**\uff1a\n   - \u8bb0\u5f55\u6bcf\u4e2a\u7fa4\u7ec4\u7684\u590d\u8bfb\u72b6\u6001\n   - \u7d2f\u8ba1\u7528\u6237\u7684\u88ab\u7981\u8a00\u6b21\u6570\n   - \u52a8\u6001\u8ba1\u7b97\u7981\u8a00\u65f6\u957f\n\n4. **\u6570\u636e\u5b58\u50a8**\uff1a\n   - \u4f7f\u7528 SQLite \u6570\u636e\u5e93\u6301\u4e45\u5316\u6570\u636e\n   - \u7ebf\u7a0b\u5b89\u5168\u7684\u6570\u636e\u5e93\u64cd\u4f5c\n   - \u81ea\u52a8\u521b\u5efa\u6570\u636e\u76ee\u5f55\u548c\u8868\u7ed3\u6784\n\n5. **\u7fa4\u7ec4\u63a7\u5236**\uff1a\n   - \u652f\u6301\u767d\u540d\u5355/\u9ed1\u540d\u5355\u6a21\u5f0f\n   - \u7075\u6d3b\u63a7\u5236\u63d2\u4ef6\u5728\u4e0d\u540c\u7fa4\u7ec4\u7684\u542f\u7528\u72b6\u6001\n\n## \u6570\u636e\u5e93\u7ed3\u6784\n\n### group_repeat_info \u8868\n- `group_id`: \u7fa4\u7ec4ID\uff08\u4e3b\u952e\uff09\n- `last_message_content`: \u6700\u540e\u4e00\u6761\u6d88\u606f\u5185\u5bb9\n- `last_repeater_id`: \u6700\u540e\u590d\u8bfb\u8005ID\n- `repeat_count`: \u5f53\u524d\u590d\u8bfb\u6b21\u6570\n- `created_at`: \u521b\u5efa\u65f6\u95f4\n- `updated_at`: \u66f4\u65b0\u65f6\u95f4\n\n### user_ban_count \u8868\n- `group_id`: \u7fa4\u7ec4ID\uff08\u4e3b\u952e\uff09\n- `user_id`: \u7528\u6237ID\uff08\u4e3b\u952e\uff09\n- `ban_count`: \u7981\u8a00\u6b21\u6570\n- `created_at`: \u521b\u5efa\u65f6\u95f4\n- `updated_at`: \u66f4\u65b0\u65f6\u95f4\n\n\n## \u6ce8\u610f\u4e8b\u9879\n\n1. **\u6743\u9650\u8981\u6c42**\uff1a\u673a\u5668\u4eba\u9700\u8981\u6709\u7fa4\u7ba1\u7406\u5458\u6743\u9650\u624d\u80fd\u6267\u884c\u7981\u8a00\u64cd\u4f5c\n2. **\u6570\u636e\u5b89\u5168**\uff1a\u63d2\u4ef6\u4f1a\u81ea\u52a8\u5904\u7406\u6570\u636e\u5e93\u8bfb\u5199\u9519\u8bef\uff0c\u4f7f\u7528\u4e8b\u52a1\u786e\u4fdd\u6570\u636e\u4e00\u81f4\u6027\n3. **\u6027\u80fd\u8003\u8651**\uff1a\u4f7f\u7528SQLite\u6570\u636e\u5e93\u548c\u7ebf\u7a0b\u9501\u4fdd\u8bc1\u5e76\u53d1\u5b89\u5168\n4. **\u7fa4\u7ec4\u63a7\u5236**\uff1a\u5408\u7406\u914d\u7f6e\u7fa4\u7ec4\u767d\u540d\u5355/\u9ed1\u540d\u5355\uff0c\u907f\u514d\u5728\u4e0d\u9700\u8981\u7684\u7fa4\u7ec4\u542f\u7528\u529f\u80fd\n\n## \u66f4\u65b0\u65e5\u5fd7\n\n### v1.0.0\n- \u91cd\u6784\u4e3a\u6807\u51c6 NoneBot2 \u63d2\u4ef6\u7ed3\u6784\n- \u4f7f\u7528Sqlite\u6570\u636e\u5e93\u5b58\u50a8\u6570\u636e\n- \u652f\u6301\u56fe\u7247\u590d\u8bfb\u68c0\u6d4b\n- \u6dfb\u52a0\u7fa4\u7ec4\u767d\u540d\u5355/\u9ed1\u540d\u5355\u529f\u80fd\n- \u4f18\u5316\u6d88\u606f\u5904\u7406\u903b\u8f91\n\n## \u8d21\u732e\n\n\u6b22\u8fce\u63d0\u4ea4 Issue \u548c Pull Request \u6765\u6539\u8fdb\u8fd9\u4e2a\u63d2\u4ef6\uff01\n\n## \u8bb8\u53ef\u8bc1\n\n\u672c\u9879\u76ee\u4f7f\u7528 AGPL-3.0 \u8bb8\u53ef\u8bc1\u3002\n",
    "bugtrack_url": null,
    "license": "AGPL-3.0",
    "summary": "A NoneBot2 plugin to detect and ban repeat messages in groups",
    "version": "1.1.0",
    "project_urls": {
        "Documentation": "https://github.com/SuperWaterGod/nonebot-plugin-repeat-checker#readme",
        "Homepage": "https://github.com/SuperWaterGod/nonebot-plugin-repeat-checker",
        "Repository": "https://github.com/SuperWaterGod/nonebot-plugin-repeat-checker.git"
    },
    "split_keywords": [
        "nonebot",
        " nonebot2",
        " plugin",
        " repeat",
        " ban",
        " group"
    ],
    "urls": [
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "8c071d348d80982bdb1c943e66f009682148562995c461b5a1283cd21a23faed",
                "md5": "d33e8fab30727aac89d1522a20012a0f",
                "sha256": "e6a6c6624314f987f9c9c7c9d342d0dba224d8e596296b4a4144d3ac52604236"
            },
            "downloads": -1,
            "filename": "nonebot_plugin_repeat_checker-1.1.0-py3-none-any.whl",
            "has_sig": false,
            "md5_digest": "d33e8fab30727aac89d1522a20012a0f",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": ">=3.8",
            "size": 24164,
            "upload_time": "2025-08-23T16:53:37",
            "upload_time_iso_8601": "2025-08-23T16:53:37.738850Z",
            "url": "https://files.pythonhosted.org/packages/8c/07/1d348d80982bdb1c943e66f009682148562995c461b5a1283cd21a23faed/nonebot_plugin_repeat_checker-1.1.0-py3-none-any.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "446ed1f6a46e47046e7295f3f40cec68872588722f373ffd9be667e820fcfb2d",
                "md5": "caef5ccbc1a80d761847a0958f4bf23c",
                "sha256": "a9b6da3d9c4895addc5a767a3bbcd23bd9ed774ff36e25b821016d7289b395f6"
            },
            "downloads": -1,
            "filename": "nonebot_plugin_repeat_checker-1.1.0.tar.gz",
            "has_sig": false,
            "md5_digest": "caef5ccbc1a80d761847a0958f4bf23c",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": ">=3.8",
            "size": 24803,
            "upload_time": "2025-08-23T16:53:38",
            "upload_time_iso_8601": "2025-08-23T16:53:38.827913Z",
            "url": "https://files.pythonhosted.org/packages/44/6e/d1f6a46e47046e7295f3f40cec68872588722f373ffd9be667e820fcfb2d/nonebot_plugin_repeat_checker-1.1.0.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2025-08-23 16:53:38",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "github_user": "SuperWaterGod",
    "github_project": "nonebot-plugin-repeat-checker#readme",
    "travis_ci": false,
    "coveralls": false,
    "github_actions": true,
    "lcname": "nonebot-plugin-repeat-checker"
}
        
Elapsed time: 1.13212s