<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"
}