Compare commits

...

561 Commits

Author SHA1 Message Date
Ju4tCode
cfd992b6b1 🔀 Merge pull request #547
Release 2.0.0a16
2021-10-02 20:31:49 +08:00
yanyongyu
6ec1159f95 🔥 remove outdated versions 2021-10-02 18:01:26 +08:00
nonebot
38ac45f687 📝 update api docs 2021-10-02 09:51:48 +00:00
yanyongyu
1331cbf8a3 🔀 Merge master into dev 2021-10-02 17:48:56 +08:00
yanyongyu
a6fc0e408c 📝 update readme 2021-10-02 17:44:43 +08:00
yanyongyu
66b2153493 🔖 bump version 2.0.0a16 2021-10-02 17:35:10 +08:00
yanyongyu
94b98b74b9 ⚗️ add fastapi/quart uvicorn configs 2021-10-02 15:35:15 +08:00
Ju4tCode
f3abd2f1a3 🔀 Merge pull request #546
Feature: Add support for mirai adapter NudgeEvent
2021-10-02 15:10:32 +08:00
yanyongyu
1280cf9ba3 🎨 fix docstring format 2021-10-02 15:07:32 +08:00
nonebot
bac56635c0 📝 update api docs 2021-10-02 06:42:39 +00:00
Mix
6d9caadffc add support for mirai adapter NudgeEvent, fix #494 2021-10-02 14:30:02 +08:00
Mix
4a7c07a7ac 🔀 Merge pull request #545
Feature: support use `Message` object as message template
2021-10-02 14:14:03 +08:00
nonebot
910d18e79f 📝 update api docs 2021-10-02 06:07:16 +00:00
Mix
5cff80812e 🔥 remove Message.__init__ method of mirai adapter 2021-10-02 14:06:00 +08:00
Mix
c8a8ff28ec support use Message object as message template 2021-10-02 14:05:54 +08:00
yanyongyu
292b8e6366 ⬆️ update dependencies 2021-10-02 11:25:30 +08:00
yanyongyu
9e9608abd8 📝 update changelog 2021-10-01 23:45:47 +08:00
yanyongyu
3452880b16 ⚗️ add fastapi reload include/exclude 2021-09-30 01:22:12 +08:00
Ju4tCode
ef2c98c6af 🔀 Merge pull request #543
Plugin: pornhub风格图标生成
2021-09-29 00:52:57 +08:00
kexue-z
246b8ccbe7 🍻 publish plugin pornhub风格图标生成 2021-09-28 16:45:05 +00:00
Ju4tCode
2355c6385d 🔀 Merge pull request #541
Docs: 插件发布指引文档
2021-09-29 00:07:37 +08:00
XZhouQD
75811c0b64 📝 update api docs 2021-09-28 15:12:40 +00:00
XZhouQD
3a510e3888 📝 plugin publish docs 2021-09-28 23:09:34 +08:00
yanyongyu
161cfbe1b8 ⚗️ add more uvicorn config 2021-09-28 21:20:29 +08:00
yanyongyu
0b08d23e34 ⬆️ upgrade uvicorn 2021-09-28 20:56:05 +08:00
Mix
2ebf7fc096 🔀 Merge pull request #539
Fix: remove return value in event handle
2021-09-27 22:33:57 +08:00
yanyongyu
041b59011b 🔥 remove return value in event handle 2021-09-27 12:52:21 +08:00
yanyongyu
92a411e3b4 🎨 isort format code 2021-09-27 00:19:30 +08:00
Ju4tCode
81cbf84dca 🔀 Merge pull request #538
Bot: HarukaBot repository link update
2021-09-26 16:30:58 +08:00
SK
4364685b30 Fix HarukaBot repository link 2021-09-26 02:07:56 -04:00
yanyongyu
cfdebb30b7 🐛 fix log not escaped in forward driver 2021-09-25 19:14:16 +08:00
Mix
049d14295e 🔀 Merge pull request #536
完善飞书相关文档和部分事件Model
2021-09-25 10:04:35 +08:00
StarHeartHunt
3dc93f7997 🐛 fix __event__ value 2021-09-25 09:10:13 +08:00
StarHeartHunt
b19c2e4191 implement meeting, vc_meeting and attendance events 2021-09-25 09:05:48 +08:00
StarHeartHunt
d121a2080b implement drive, meeting and calendar events 2021-09-25 08:30:55 +08:00
StarHeartHunt
919e3ebf8c implement calendar acl event 2021-09-24 22:45:11 +08:00
StarHeartHunt
b0f4b8ffa1 implement contact events 2021-09-24 22:08:03 +08:00
StarHeart
b3bf9470cf 📝 improve doc
Co-authored-by: Mix <32300164+mnixry@users.noreply.github.com>
2021-09-24 21:33:24 +08:00
StarHeartHunt
16029a33e8 📝 format doc 2021-09-24 20:29:27 +08:00
StarHeartHunt
b31d04dc5d 🎨 improve code style 2021-09-24 20:26:50 +08:00
StarHeartHunt
e0f73ba193 📝 complete feishu doc 2021-09-24 20:26:12 +08:00
Mix
0b35d5e724 🔀 Merge pull request #534
Plugin: SimpleMusic
2021-09-21 23:26:56 +08:00
kanomahoro
c747342709 🍻 publish plugin SimpleMusic 2021-09-21 15:17:30 +00:00
Mix
244df12069 🔀 Merge pull request #532
Plugin: HTTP静态文件托管
2021-09-21 01:03:22 +08:00
mnixry
368afe6d63 🍻 publish plugin HTTP静态文件托管 2021-09-20 16:58:26 +00:00
StarHeartHunt
5cd61c09a8 🚨 re-export base adapter init
according to pep484
2021-09-18 20:22:38 +08:00
StarHeartHunt
1e55fbf6b1 🚨 re-export feishu init
according to pep484
2021-09-18 20:03:53 +08:00
yanyongyu
463ff260c4 🐛 fix doc build error 2021-09-18 18:04:19 +08:00
yanyongyu
89e32a3241 ⬆️ bump dependencies 2021-09-18 17:18:53 +08:00
yanyongyu
4f8771acbd 🚨 re-export according to pep484 2021-09-18 16:11:03 +08:00
Ju4tCode
a212baf90b 🔀 Merge pull request #528
Plugin: HanayoriBot
2021-09-18 13:10:34 +08:00
kanomahoro
5db8b124ab 🍻 publish plugin HanayoriBot 2021-09-18 02:59:21 +00:00
yanyongyu
a273d75b07 add send pause reject finish template 2021-09-17 23:28:08 +08:00
StarHeart
55a402203e Merge pull request #524 from nonebot/fix/feishu-private-msg
🐛 fix feishu private message event response
2021-09-17 20:46:27 +08:00
StarHeartHunt
64967e8807 🎨 resort dev dependencies 2021-09-17 20:36:08 +08:00
StarHeartHunt
43917b5aad ⬆️ bump nonebot-plugin-test to 0.3.0 2021-09-16 20:54:34 +08:00
nonebot
b97133fb59 📝 update api docs 2021-09-16 12:30:31 +00:00
StarHeartHunt
855f61d837 💚 fix missing module in API docs config 2021-09-16 20:29:06 +08:00
StarHeartHunt
e2003e27df parse data based on content-type of response 2021-09-16 20:29:05 +08:00
nonebot
d82749c48e 📝 update api docs 2021-09-16 20:29:05 +08:00
StarHeartHunt
0a802f9b13 add get_all_user_id for MessageEvent 2021-09-16 17:36:05 +08:00
yanyongyu
e0610fdcc0 🐛 fix publish field not required 2021-09-15 21:03:18 +08:00
Ju4tCode
20d0ecfc7f Merge pull request #526 from nonebot/ci/store-publish
👷 update store publish bot
2021-09-15 20:38:49 +08:00
hemengyang
fa15e5b0ee 👷 update store publish bot
仓库迁移至 NoneBot 组织
2021-09-15 17:16:15 +08:00
StarHeartHunt
d9cc912ccb 💥 use open_id to send private message instead 2021-09-14 21:52:31 +08:00
StarHeartHunt
09d9f414ce 🔊 add desc and name of NoticeEvent 2021-09-14 21:51:01 +08:00
yanyongyu
ca09fb8372 🔥 remove outdated doc version 2021-09-14 11:00:14 +08:00
Artin
b25a0387ba Merge pull request #521 from nonebot/fix-ding 2021-09-13 01:44:28 +08:00
artin
9931563d80 🐛 fix ding adapter issues
1. cannot send complicate message, such as actionCard
2. fix judge current connection mode
2021-09-13 01:19:14 +08:00
yanyongyu
53a576dae5 📝 update api doc 2021-09-11 19:49:32 +08:00
yanyongyu
44d13acc81 ♻️ rename message formatter into template 2021-09-11 19:48:46 +08:00
yanyongyu
59f567004f 🔥 remove outdated docs 2021-09-11 13:45:59 +08:00
yanyongyu
956e581d72 📝 update changelog 2021-09-11 13:45:07 +08:00
yanyongyu
b635d01519 💥 matcher prompt support message formatter 2021-09-11 13:45:03 +08:00
synodriver
12c1f6d764 🐛 fix USER bug 2021-09-09 23:17:54 +08:00
Ju4tCode
b66a4df4c5 🔀 Merge pull request #517
Plugin: ATRI语音包
2021-09-05 17:24:05 +08:00
FYWinds
46c61df081 🍻 publish plugin ATRI语音包 2021-09-05 09:05:30 +00:00
yanyongyu
b6ec81c21d 🐛 fix cqhttp get forward msg type error 2021-09-03 14:27:36 +08:00
StarHeart
f9f2f1b0bd 📝 update APScheduler doc link (x2) 2021-08-30 16:36:58 +08:00
StarHeart
45396e3163 📝 update APScheduler doc link 2021-08-30 16:34:34 +08:00
Mix
7ced508f9d 🔀 Merge pull request #514
🐛 Fix endswith match bug
2021-08-29 19:53:52 +08:00
ishkong
ed1f1c27e2 🐛 Fix endswith match bug 2021-08-29 19:18:36 +08:00
yanyongyu
3fa75b1c78 ♻️ separate adapter abstract classes 2021-08-29 00:24:28 +08:00
yanyongyu
258ef670e2 📝 update changelog 2021-08-29 00:11:52 +08:00
yanyongyu
5cf665fa21 🐛 fix format field error 2021-08-28 19:42:32 +08:00
yanyongyu
116f16b470 🐛 fix stringify when formatting 2021-08-28 19:39:54 +08:00
Ju4tCode
9518e3c568 🔀 Merge pull request #510
Feature: str.format like message formatting support
2021-08-28 13:06:02 +08:00
Mix
57827ea4bb 🔀 Merge pull request #513
Docs: Add FAQ link to `README.md`
2021-08-27 20:29:10 +08:00
Mix
8e41422055 📝 update faq link to official redirection domain
Co-authored-by: Ju4tCode <42488585+yanyongyu@users.noreply.github.com>
2021-08-27 19:58:08 +08:00
Mix
fcd168fd3e 📝 Add frequently asked questions link to README 2021-08-27 19:43:35 +08:00
Mix
fe1bd87ff8 📝 Add markdownlint ignore comment 2021-08-27 19:30:47 +08:00
Mix
efe1615d16 🔀 Merge pull request #512
Bot: Takker
2021-08-27 19:26:26 +08:00
nonebot
ca26609308 📝 update api docs 2021-08-27 11:25:23 +00:00
Mix
01e818f6a4 📝 allow document generate from nonebot.adapters._formatter 2021-08-27 19:24:12 +08:00
Mix
1c73a9adfa 💡 add comment to describe template formatter usage 2021-08-27 19:13:08 +08:00
FYWinds
a739b93561 🍻 publish bot Takker 2021-08-27 09:37:38 +00:00
yanyongyu
7cfdc2dd37 🔥 use Any for format type 2021-08-27 15:08:26 +08:00
yanyongyu
a6ff3711bb 🐛 fix link error in runtime hook doc 2021-08-27 14:52:17 +08:00
yanyongyu
58d10abd32 🎨 change typing for formatter 2021-08-27 14:46:15 +08:00
Mix
f0bc47ec5e Add message template formatter
ref: https://github.com/nonebot/discussions/discussions/27
2021-08-27 02:52:24 +08:00
yanyongyu
b5f2b1a76d 🐛 fix fastapi driver ws missing header 2021-08-25 23:04:48 +08:00
Mix
4f4a072dd7 🔀 Merge pull request #509
MessageSegment.image 的 BytesIO
2021-08-23 00:26:03 +08:00
jinser
fff7d3bff6 🐛 BytesIO cursor 可能不在开头 2021-08-23 00:12:47 +08:00
Ju4tCode
474fd10613 🔀 Merge pull request #508
Remove unsupported adapter
2021-08-21 22:50:57 +08:00
Jigsaw
9bea710e45 🔥 Remove unsupported adapter 2021-08-21 18:52:20 +08:00
Jigsaw
3c76c6ff8b 🔥 Remove unsupported adapter 2021-08-21 18:49:46 +08:00
Ju4tCode
a8a61623d2 🔀 Merge pull request #507
Bot: SetuBot
2021-08-19 19:55:04 +08:00
yuban10703
24ce531598 🍻 publish bot SetuBot 2021-08-19 11:12:18 +00:00
Ju4tCode
a6be0c370f 🔀 Merge pull request #503
Fix exception raised when constructing MessageChain from string
2021-08-19 10:12:57 +08:00
Mix
22c7371f2e 🐛 Fix exception raised when trying to construct message from plain 2021-08-19 01:36:51 +08:00
Ju4tCode
bfb77e9cdf 🔀 Merge pull request #501
Plugin: ELF_RSS
2021-08-17 10:36:30 +08:00
Quan666
9aa346fb1f 🍻 publish plugin ELF_RSS 2021-08-17 02:35:08 +00:00
Ju4tCode
1dfe5d49fc 🔀 Merge pull request #499
Plugin: Epic 限免游戏资讯
2021-08-17 10:34:50 +08:00
monsterxcn
e48788e41f 🍻 publish plugin Epic 限免游戏资讯 2021-08-17 01:56:10 +00:00
StarHeart
802c39da32 Merge pull request #495 from mri-moe/master
添加设置项,使得可以切换飞书和Lark API地址
2021-08-16 17:40:27 +08:00
mri-moe
0d23a9ab8d 📝 update api docs 2021-08-16 09:36:39 +00:00
StarHeartHunt
109cae6dac 🔧 add config for lark users 2021-08-16 17:35:22 +08:00
mri-moe
f63ef8d23b 📝 update desc
Co-authored-by: Ju4tCode <42488585+yanyongyu@users.noreply.github.com>
2021-08-16 17:35:13 +08:00
yanyongyu
3d4d3b0f24 🐛 fix got handler running more than once 2021-08-16 16:47:57 +08:00
mri-moe
a3fa1a36c9 📝 update api docs 2021-08-16 08:30:19 +00:00
mri-moe
45cec05bbc Update bot.py 2021-08-16 16:24:33 +08:00
mri-moe
e4d1462585 📝 update api docs 2021-08-16 08:10:42 +00:00
mri-moe
18c6bea451 ✏️ add switcher for lark 2021-08-14 13:04:15 +08:00
Ju4tCode
c4e3309026 🔀 Merge pull request #490
Release 2.0.0a15
2021-08-13 00:36:34 +08:00
yanyongyu
57a60ae45b 🏷️ add missing type hint 2021-08-13 00:20:41 +08:00
yanyongyu
e7f5097e17 📝 update archive doc 2021-08-12 23:50:46 +08:00
Ju4tCode
e437c13bb3 🔀 Merge pull request #492
feature: mirai multiple accounts support
2021-08-12 23:48:37 +08:00
Ju4tCode
edd7f3ccc8 🔀 Merge pull request #491
bugfix: catch setup factory exception
2021-08-12 23:27:24 +08:00
Mix
26f0d66017 add multiple account support for mirai adapter 2021-08-12 23:14:45 +08:00
Mix
5791018af1 🥅 catch exception raised in setup factory 2021-08-12 22:26:41 +08:00
yanyongyu
2c6b41f62c ⬆️ bump adapter version 2.0.0a15 2021-08-12 17:59:52 +08:00
yanyongyu
f2b23f1b44 🎨 escape message before colorful log 2021-08-12 16:45:22 +08:00
yanyongyu
a534f7b58c 🔖 bump version 2.0.0a15 2021-08-12 14:14:01 +08:00
yanyongyu
81398bb803 📝 update changelog 2021-08-12 14:01:09 +08:00
yanyongyu
3a0265b0f6 🐛 fix fastapi forward reconnect error 2021-08-12 13:59:01 +08:00
yanyongyu
59db66ef27 🐛 check data instead of object in to_me 2021-08-12 13:57:52 +08:00
Ju4tCode
a04957a354 🔀 Merge pull request #489
Bugfix: remove mirai session expiry
2021-08-11 22:50:54 +08:00
Mix
371cfd4a0e 🐛 Remove expiry check in nonebot.adapter.mirai.bot.SessionManager 2021-08-11 22:15:17 +08:00
Ju4tCode
037a5ccce0 🔀 Merge pull request #485
Plugin: nonebot-plugin-flexperm
2021-08-10 13:43:53 +08:00
rmuchan
879767df01 🍻 publish plugin nonebot-plugin-flexperm 2021-08-10 03:01:04 +00:00
Ju4tCode
31b18e36e7 🔀 Merge pull request #483
Plugin: 布谷机器人
2021-08-10 00:46:57 +08:00
Sclock
eb3e20abfb 🍻 publish plugin 布谷机器人 2021-08-09 16:45:05 +00:00
Ju4tCode
b96823b5bd 🔀 Merge pull request #481
Plugin: 孤寡机器人
2021-08-10 00:44:46 +08:00
Sclock
b098c8477b 🍻 publish plugin 孤寡机器人 2021-08-09 13:39:24 +00:00
Ju4tCode
02b2589eeb 🔀 Merge pull request #476
Plugin: nonebot-plugin-autohelp
2021-08-08 14:21:16 +08:00
ffreemt
05ea21becd 🍻 publish plugin nonebot-plugin-autohelp 2021-08-08 05:44:37 +00:00
Ju4tCode
2836f50e74 🔀 Merge pull request #474
飞书适配器重定向aiocache logging到统一logger
2021-08-08 11:18:40 +08:00
StarHeartHunt
7b3d66cd2a 🔊 force aiocache to use standard logger 2021-08-08 10:05:42 +08:00
yanyongyu
ceebe0e95d 🐛 fix absolute import 2021-08-06 15:13:36 +08:00
Ju4tCode
2fe01f33e0 Merge pull request #471 from nonebot/bugfix/mirai-tag-escape
Fix log tag escape error in `event.get_description` in mirai adapter
2021-08-06 02:32:53 +08:00
Mix
410266acb1 🐛 Fix log tag escape error in event.get_description 2021-08-05 23:11:57 +08:00
Ju4tCode
02924d56cd 🔀 Merge pull request #468
Plugin: 和风天气
2021-08-05 23:02:36 +08:00
kexue-z
0bd8d4fbbc 🍻 publish plugin 和风天气 2021-08-05 07:30:36 +00:00
Ju4tCode
547bebebd9 🔀 Merge pull request #466
Bot: DicePP
2021-08-05 00:31:53 +08:00
pear-studio
f8703557a0 🍻 publish bot DicePP 2021-08-04 16:23:52 +00:00
yanyongyu
8e97a84ad8 💥 correct message segment mapping funcs 2021-08-04 19:35:03 +08:00
yanyongyu
3564228183 🐛 fix message segment mapping error 2021-08-04 19:11:59 +08:00
Ju4tCode
bb93757f51 🔀 Merge pull request #464
Docs: update guide docs
2021-08-04 15:55:49 +08:00
yanyongyu
e18b3d04fb 📝 update mirai guide 2021-08-04 15:35:02 +08:00
yanyongyu
458085b317 📝 update guide doc 2021-08-04 15:02:24 +08:00
Ju4tCode
832875e7cf 🔀 Merge pull request #462
Release: 2.0.0a14
2021-08-04 14:08:55 +08:00
yanyongyu
73762e65bb Merge branch 'dev' of github.com:nonebot/nonebot2 into dev 2021-08-04 13:52:14 +08:00
Ju4tCode
26e627c36c Merge branch 'master' into dev 2021-08-04 13:50:18 +08:00
yanyongyu
8b93dc7769 🔖 Release 2.0.0a14 2021-08-04 13:42:21 +08:00
yanyongyu
6cfd44224d ⬆️ update dependencies 2021-08-04 12:55:30 +08:00
Ju4tCode
dc8b7887d7 🔀 Merge pull request #461
Add forward driver support for mirai-api-http adapter
2021-08-04 12:46:30 +08:00
nonebot
18f98e4cbc 📝 update api docs 2021-08-04 04:42:56 +00:00
yanyongyu
db73d2b621 📝 update doc 2021-08-04 12:41:53 +08:00
nonebot
7a3cd8c395 📝 update api docs 2021-08-03 16:44:13 +00:00
Mix
358528b495 👽 Add forward driver support for mirai-api-http adapter 2021-08-04 00:35:31 +08:00
yanyongyu
cda1ad093f 💥 change forward setup api 2021-07-31 12:24:11 +08:00
yanyongyu
f48c61c2e0 🐛 improve sub plugin detect 2021-07-29 17:31:28 +08:00
yanyongyu
571cdef826 📝 fix sphinx build errors 2021-07-28 16:32:50 +08:00
yanyongyu
0ce3ee6c20 💡 support sphinx 4.0 2021-07-26 12:14:29 +08:00
Ju4tCode
600fc4fffd 🔀 Merge pull request #452
修复由于 quart.exception在新版Quart被移除导致import出错
2021-07-26 11:16:00 +08:00
Mix
c1b10a0e48 👽 🐛 fix quart.exception removal caused import error 2021-07-26 10:41:38 +08:00
yanyongyu
904f285f62 ⬆️ update outdated dependencies 2021-07-25 12:09:25 +08:00
Ju4tCode
8680695586 Merge pull request #451 from nonebot/plugin/issue450
Adapter: feishu
2021-07-25 10:51:32 +08:00
StarHeartHunt
a1803553fb 🍻 publish adapter feishu 2021-07-25 01:40:55 +00:00
yanyongyu
9c647682e7 📌 update lock file 2021-07-23 15:34:02 +08:00
Ju4tCode
fb6e5a69f2 🔀 Merge pull request #448
飞书适配器import顺序格式化
2021-07-23 15:10:55 +08:00
Ju4tCode
cf85cbecb3 🔀 Merge pull request #449
修复依赖项git链接
2021-07-23 15:09:34 +08:00
nonebot
948ea93599 📝 update api docs 2021-07-23 07:00:01 +00:00
StarHeart
de48ed99a7 💚 fix git link 2021-07-23 14:58:03 +08:00
StarHeartHunt
8a6c26440c 🎨 sort imports in feishu adapter 2021-07-23 14:46:55 +08:00
yanyongyu
cf747f954c fastapi driver support forward connect 2021-07-23 00:51:19 +08:00
yanyongyu
54a7e4808c ⬆️ update lock file 2021-07-22 23:59:04 +08:00
yanyongyu
03f5683d52 ⬆️ update dependencies 2021-07-22 23:26:36 +08:00
Ju4tCode
58c922f042 🔀 Merge pull request #447
Publish plugin web-monitor
2021-07-22 13:01:56 +08:00
Abrahum
98e65ebdec 🍻 publish web monitor 2021-07-22 12:46:13 +08:00
Ju4tCode
e4a4a8127e 🔀 Merge pull request #444
Docs: 文档支持 algolia 全文搜索
2021-07-22 00:08:05 +08:00
yanyongyu
72b0ee0130 use pypi instead of aliyun 2021-07-22 00:07:20 +08:00
Ju4tCode
679ec94020 🔀 Merge pull request #446
Bot: dumbot傻瓜机器人
2021-07-21 23:49:31 +08:00
yanyongyu
1f0be1e1e3 improve aiohttp main loop performance 2021-07-21 23:47:18 +08:00
ffreemt
bcc55a9143 🍻 publish bot dumbot傻瓜机器人 2021-07-21 09:25:38 +00:00
StarHeartHunt
749d33478a 📝 add algolia search 2021-07-21 17:23:16 +08:00
yanyongyu
cb68e0ee1b 📝 update doc 2021-07-20 15:47:52 +08:00
yanyongyu
ecc613f6c5 add cqhttp forward support 2021-07-20 15:36:20 +08:00
yanyongyu
04b3fda40c cqhttp support forward websocket 2021-07-19 23:46:29 +08:00
yanyongyu
32787fdc1e ⚗️ experimenting aiohttp driver 2021-07-19 14:51:28 +08:00
yanyongyu
637c48aea7 🚧 update aiohttp driver 2021-07-19 01:20:17 +08:00
Ju4tCode
5768b5bdd6 🔀 Merge pull request #425
Feature: 添加飞书适配器支持
2021-07-18 22:42:37 +08:00
Ju4tCode
96d05cb521 🔀 Merge pull request #442
Plugin: nonebot_plugin_fr24
2021-07-18 19:43:23 +08:00
IronWolf-K
92e5b8ea88 🍻 publish plugin FlightRadar24查询模块 2021-07-18 10:28:27 +00:00
StarHeartHunt
59ed869ed0 📝 update api docs 2021-07-18 07:09:27 +00:00
yanyongyu
a14d475de2 🎨 format and update lock file 2021-07-18 15:07:30 +08:00
Ju4tCode
8ea4561f1c 🔀 Merge pull request #440
Optimize the description of multiple plugins
2021-07-18 13:50:48 +08:00
Lan
5ac43eb459 🚸 Improve user experience 2021-07-17 23:26:20 +08:00
Ju4tCode
c22d97fe47 🔀 Merge pull request #438
Plugin: nonebot_plugin_setu
2021-07-16 00:09:40 +08:00
ayanamiblhx
bb964213f1 🍻 publish plugin nonebot_plugin_setu 2021-07-15 13:04:43 +00:00
StarHeartHunt
ef1547cbfe Merge branch 'feishu-adapter' of https://github.com/StarHeartHunt/nonebot2-vercel-mirror into feishu-adapter 2021-07-14 10:43:03 +08:00
StarHeartHunt
f2295318a9 📝 update index 2021-07-14 10:42:47 +08:00
StarHeartHunt
66b54de869 📝 update copyright 2021-07-14 10:39:39 +08:00
StarHeartHunt
d802fad111 📝 update adapter store 2021-07-14 10:39:00 +08:00
StarHeartHunt
8acd561de6 📝 update api docs 2021-07-14 02:31:27 +00:00
StarHeartHunt
b4e20e00e4 Merge branch 'feishu-adapter' of https://github.com/StarHeartHunt/nonebot2-vercel-mirror into feishu-adapter 2021-07-14 10:29:12 +08:00
StarHeartHunt
3230dfc14a 📝 update main api doc 2021-07-14 10:28:48 +08:00
StarHeartHunt
607f338934 📝 update api docs 2021-07-14 02:24:35 +00:00
StarHeartHunt
758108229a 📝 add feishu api doc 2021-07-14 10:22:31 +08:00
StarHeartHunt
aac4571d43 📝 add feishu adapter doc 2021-07-14 10:19:37 +08:00
StarHeartHunt
0436c1b7b8 update test env 2021-07-14 09:26:53 +08:00
Ju4tCode
a740a9cfea 🔀 Merge pull request #435
Docs: scheduler docs typo
2021-07-11 15:21:51 +08:00
Ju4tCode
57ff73269b Update scheduler.md 2021-07-11 15:19:04 +08:00
StarHeartHunt
625c12fc12 implement all self-built app event 2021-07-11 12:26:11 +08:00
StarHeartHunt
4fc655323d 🎨 format code 2021-07-11 12:25:27 +08:00
Ju4tCode
f0482bb636 🔀 Merge pull request #434
Docs: 修复漏字
2021-07-11 12:20:40 +08:00
StarHeart
df6486f926 📝 fix docstring 2021-07-11 11:37:14 +08:00
Ju4tCode
141cd10651 🔀 Merge pull request #432
Bot: ATRI
2021-07-09 22:21:34 +08:00
Kyomotoi
711fffe3b0 🍻 publish bot ATRI 2021-07-09 09:09:14 +00:00
StarHeartHunt
2c056364c1 🚧 message read event should implement NoticeEvent 2021-07-09 16:18:19 +08:00
StarHeartHunt
c6921c731c update test file 2021-07-09 16:15:24 +08:00
StarHeartHunt
8c7498eeb5 🔥 self-built app hasn't MetaEvent 2021-07-09 16:14:25 +08:00
StarHeartHunt
30cb6be104 📝 tweak 2021-07-09 16:09:25 +08:00
StarHeartHunt
fbd60e30fc 🔥 remove check_reply 2021-07-09 16:09:01 +08:00
StarHeartHunt
2908cb3ce2 🐛 tweak 2021-07-09 16:02:54 +08:00
StarHeartHunt
b1c5013088 implement check_reply check_atme check_nickname 2021-07-09 16:01:32 +08:00
StarHeartHunt
70e424b58f ️ support cache tenant token 2021-07-09 09:22:56 +08:00
StarHeartHunt
730186cfd4 remove optional param 2021-07-08 23:06:48 +08:00
StarHeartHunt
d2ae2e2982 🚑 safely get dict value 2021-07-08 23:05:12 +08:00
StarHeartHunt
67770ffa6f implement at parser 2021-07-08 22:30:39 +08:00
StarHeartHunt
15ab958a70 🎨 format code 2021-07-08 22:30:21 +08:00
StarHeartHunt
af6f63dc44 🚧 add todo 2021-07-08 16:13:07 +08:00
StarHeartHunt
7c7994e2e2 implement rich text serializer 2021-07-08 16:12:43 +08:00
StarHeartHunt
f597303698 ♻️ improve segment-string parser 2021-07-08 14:52:34 +08:00
StarHeartHunt
1222972b73 ️ optimize import 2021-07-08 14:39:38 +08:00
StarHeartHunt
7df407056b implement text merger 2021-07-08 10:49:02 +08:00
StarHeartHunt
79b6601d12 🍻 tweak 2021-07-08 10:07:55 +08:00
Ju4tCode
53d98f3d2e 🔀 Merge pull request #430
修复mirai adapter中上传相关api操作报错
2021-07-08 09:27:36 +08:00
StarHeartHunt
fe43c8d69a 💩 should implement rich text parser 2021-07-07 22:36:08 +08:00
StarHeartHunt
e490be9eb0 🎨 tweak 2021-07-07 22:29:13 +08:00
Mix
3af8b55985 🐛 fix access denied for mirai adapter upload related action 2021-07-07 20:39:46 +08:00
yanyongyu
aaed345a20 🚨 remove linter error 2021-07-07 14:09:03 +08:00
yanyongyu
f42d578765 🐛 fix log tag unescaped 2021-07-07 14:08:44 +08:00
StarHeartHunt
f5843dd3ad 🔊 forgot to add backspace 2021-07-06 22:11:34 +08:00
StarHeartHunt
840580334f 🔊 optimize log 2021-07-06 22:08:38 +08:00
StarHeartHunt
5a8b5b5696 ️ optimize import 2021-07-06 22:08:22 +08:00
StarHeartHunt
dc5aa3d4bf 🔥 remove rich_text parser 2021-07-06 22:01:02 +08:00
StarHeartHunt
b9befc8350 🔇 remove print 2021-07-06 21:15:02 +08:00
StarHeartHunt
e3c3e370cb ️ remove unnecessary code 2021-07-06 21:12:49 +08:00
StarHeartHunt
603a63a629 implement message serializer & deserializer 2021-07-06 18:01:41 +08:00
Ju4tCode
276d09bb54 🔀 Merge pull request #428
Plugin: nonebot_plugin_statistical
2021-07-06 15:18:48 +08:00
StarHeartHunt
5635c83bfb 🐛 fix p2p model parse 2021-07-06 14:58:38 +08:00
StarHeartHunt
0ec7cdc3aa update testcase 2021-07-06 14:58:00 +08:00
HibiKier
932963e71c 🍻 publish plugin nonebot_plugin_statistical 2021-07-06 06:14:20 +00:00
StarHeartHunt
322ac98c50 🐛 validate schema field & fix request construct 2021-07-06 10:57:51 +08:00
StarHeartHunt
811e94e186 implement message target guessing 2021-07-06 10:45:00 +08:00
StarHeartHunt
0c39300f4b add call_api and implement send func 2021-07-05 11:10:49 +08:00
StarHeartHunt
33bd7582be 🎨 sort import 2021-07-05 11:10:49 +08:00
StarHeartHunt
b6979594a7 implement group and private message 2021-07-05 11:10:49 +08:00
StarHeartHunt
150ef30b73 add custom exception 2021-07-05 11:10:49 +08:00
StarHeartHunt
1042759d60 ️ make api_endpoint hard_encoded 2021-07-05 11:10:49 +08:00
StarHeartHunt
866149902c update testcase 2021-07-05 11:10:49 +08:00
StarHeartHunt
136b13b4cc ️ remove unused import 2021-07-05 11:10:49 +08:00
StarHeartHunt
cc11e2e885 🔧 add config api_endpoint 2021-07-05 11:10:49 +08:00
StarHeartHunt
f9f1e33262 implement message constructor 2021-07-05 11:10:49 +08:00
StarHeartHunt
7a8f881b04 implement event parser 2021-07-05 11:10:49 +08:00
StarHeartHunt
20c3c24a6d 👷 implement testcase 2021-07-05 11:10:49 +08:00
yanyongyu
f80ba8451f 🎨 fix linter error 2021-07-05 11:10:49 +08:00
StarHeartHunt
b1fa2bbb80 🔧 add configs 2021-07-05 11:10:49 +08:00
StarHeartHunt
406511496d 🏷️ add events 2021-07-05 11:10:49 +08:00
StarHeartHunt
24144a9474 implement check_permission procedure 2021-07-05 11:10:23 +08:00
yanyongyu
3571a5fdc0 🐛 fix missing json encode for cqhttp http 2021-07-04 23:23:39 +08:00
StarHeartHunt
4afd681ca9 🏷️ add segment schema 2021-07-03 13:56:47 +08:00
StarHeartHunt
48816308f8 add encryption support 2021-07-03 13:55:20 +08:00
StarHeartHunt
3e66eb2fdb add encryption dependency 2021-07-03 13:53:43 +08:00
StarHeartHunt
d669fed5e9 add testcase for feishu adapter 2021-07-03 13:53:01 +08:00
yanyongyu
8e915f808b 🎨 fix linter error 2021-07-03 11:50:56 +08:00
StarHeartHunt
46ace83106 🎉 init feishu adapter 2021-07-01 07:59:50 +08:00
Ju4tCode
da16bdbb96 🔀 Merge pull request #421
Docs: fix typo
2021-06-27 21:20:01 +08:00
StarHeart
c1b7b78929 ✏️ fix typo 2021-06-27 20:01:05 +08:00
midori
b9de8baac4 New: get_bot function (#419)
Co-authored-by: nonebot <nonebot@users.noreply.github.com>
Co-authored-by: Ju4tCode <42488585+yanyongyu@users.noreply.github.com>
2021-06-27 14:03:54 +08:00
yanyongyu
b3718c3042 ⚗️ add forward driver aiohttp 2021-06-21 01:25:58 +08:00
yanyongyu
69cee3844e support dot notation for driver config 2021-06-21 01:25:58 +08:00
Ju4tCode
1db462e4ad 🔀 Merge pull request #416
Plugin: nonebot_plugin_russian
2021-06-20 21:24:44 +08:00
HibiKier
23cfa5564a 🍻 publish plugin nonebot_plugin_russian 2021-06-20 06:04:57 +00:00
Ju4tCode
7879346ca1 Merge pull request #414 from nonebot/remove-print
remove unnecessary print
2021-06-20 09:58:19 +08:00
nonebot
ef5a49933f 📝 update api docs 2021-06-20 01:28:07 +00:00
StarHeart
e0bd7e11d5 🔥 remove unnecessary print 2021-06-20 09:25:55 +08:00
yanyongyu
0c5bbdaabe 🎨 remove linter error 2021-06-19 15:18:57 +08:00
yanyongyu
d8e29a81aa support absolute plugin import 2021-06-19 15:15:00 +08:00
yanyongyu
9f15b69724 allow change handlers list when running 2021-06-18 16:27:41 +08:00
yanyongyu
cd12718dcb 🐛 update mirai adapter 2021-06-18 01:23:13 +08:00
Ju4tCode
94c3c47523 🔀 Merge pull request #412
Plugin: nonebot_plugin_pixivrank_search
2021-06-17 18:00:33 +08:00
HibiKier
fde6181d3c 🍻 publish plugin nonebot_plugin_pixivrank_search 2021-06-17 08:10:24 +00:00
Ju4tCode
a4c6d834ff 🔀 Merge pull request #410
Bug: 修复shell_command多次--help时重复输出
2021-06-17 10:59:27 +08:00
rmuchan
c8e494ca83 📝 update api docs 2021-06-17 02:20:46 +00:00
Muchan
f87c23c9a7 🐛 fix duplicated help 2021-06-17 10:14:36 +08:00
yanyongyu
b2f21ab974 🎨 fix message typing error 2021-06-17 01:07:19 +08:00
yanyongyu
6749afe75e 🚨 remove linter error 2021-06-16 00:58:47 +08:00
Ju4tCode
8849cb73bb 🔀 Merge pull request #409
Docs: typo
2021-06-15 10:21:03 +08:00
yanyongyu
ad2060e651 📝 update api docs 2021-06-15 10:16:31 +08:00
yanyongyu
c76dae584e 🐛 fix quart implement 2021-06-15 10:16:17 +08:00
StarHeart
edb7c79acf 📝 typo 2021-06-15 09:53:25 +08:00
yanyongyu
76c830739c 🎨 change reverse driver abstract methods 2021-06-15 01:23:12 +08:00
yanyongyu
8e6f8fada8 🐛 fix import recursion when same plugin and file name (fix #401) 2021-06-15 01:13:05 +08:00
yanyongyu
ddd96271b0 🎨 improve typing 2021-06-14 19:52:35 +08:00
Ju4tCode
e9bc98e74d 🔀 Merge pull request #406
Feature: 支持自定义 Response
2021-06-14 14:14:43 +08:00
StarHeartHunt
af6e9217c7 📝 update api docs 2021-06-13 18:08:29 +00:00
StarHeartHunt
c0d78449be support custom response 2021-06-14 02:06:37 +08:00
Mix
d7f2837efe 🔀 Merge pull request #408
Docs: 完善文档 Python 版本描述
2021-06-12 16:47:36 +08:00
StarHeart
cf9b5fd980 📝 complete python version requirement 2021-06-12 15:34:27 +08:00
Ju4tCode
b42cafafd6 🔀 Merge pull request #407
修复Mirai加群通过时报错
2021-06-11 23:02:57 +08:00
Mix
136c9a2687 🐛 Fix Mirai group join event approve failed, fix #400 2021-06-11 20:20:14 +08:00
yanyongyu
cf45572211 ⬆️ upgrade fastapi 2021-06-11 01:48:52 +08:00
Ju4tCode
c9d80255ae 🔀 Merge pull request #405
Bot: 绪山真寻bot
2021-06-10 13:10:07 +08:00
HibiKier
393be3baa4 🍻 publish bot 绪山真寻bot 2021-06-10 00:21:43 +00:00
Ju4tCode
fd01213697 🔀 Merge pull request #403
Bot: YanXiBot
2021-06-09 23:42:10 +08:00
Melodyknit
2f5eb1a0f9 🍻 publish bot YanXiBot 2021-06-09 15:19:27 +00:00
StarHeart
ca31ec5fe3 Merge pull request #398 from nonebot/StarHeartHunt-patch-1
Docs: update tagline
2021-06-02 10:23:55 +08:00
StarHeart
2003dfd703 📝 update tagline in README 2021-06-02 08:45:14 +08:00
StarHeart
f3342722f5 📝 update tagline 2021-06-02 08:43:01 +08:00
yanyongyu
b2f5f93603 🐛 fix error inherit state in session when using state_factory 2021-05-31 21:54:17 +08:00
yanyongyu
830276d110 🐛 fix state error when matcher update(fix #397) 2021-05-31 21:49:25 +08:00
Ju4tCode
9342d03f4d 🔀 Merge pull request #396
Update plugins.json
2021-05-31 16:19:30 +08:00
HibiKier
fe588caebb Update plugins.json 2021-05-31 16:04:11 +08:00
Ju4tCode
b0026831d0 🔀 Merge pull request #395
Update plugins.json
2021-05-31 15:38:54 +08:00
HibiKier
46d7804c98 Update plugins.json 2021-05-31 12:20:13 +08:00
yanyongyu
accbf57776 🚨 remove some linter warning 2021-05-31 01:06:56 +08:00
yanyongyu
62c0dd6e74 💡 add docstring 2021-05-31 00:27:31 +08:00
yanyongyu
916bb5b0e6 💡 update docstring 2021-05-30 11:07:27 +08:00
yanyongyu
45e1126f37 🐛 fix missing update when reject or pause (fix #394) 2021-05-30 10:55:34 +08:00
yanyongyu
57cf8e9bd8 🐛 fix cqhttp event session id mismatch for group 2021-05-29 19:32:05 +08:00
Ju4tCode
f609a9fe0e 🔀 Merge pull request #392
Docs: update telegram links
2021-05-29 18:26:34 +08:00
Ju4tCode
4795f01583 Merge branch 'dev' into richardchien-patch-1 2021-05-29 18:15:32 +08:00
Richard Chien
06f9f795aa 🔗 add discord badge 2021-05-29 14:09:19 +08:00
Richard Chien
2d7d8992c0 🔗 update community links 2021-05-29 13:53:43 +08:00
Ju4tCode
15007feea7 🔀 Merge pull request #391
Docs: add discord server badge
2021-05-29 00:08:47 +08:00
nonebot
8095be9ab9 📝 update api docs 2021-05-28 14:31:02 +00:00
StarHeart
ea48b86310 📝 add discord server link 2021-05-28 22:27:49 +08:00
Ju4tCode
6402d8a4de Merge pull request #388 from HibiKier/patch-2
Update plugins.json
2021-05-28 13:25:43 +08:00
HibiKier
5ec30c5122 Update plugins.json 2021-05-28 13:20:59 +08:00
yanyongyu
c4b83a60f1 🚧 add http request and response class 2021-05-27 01:01:58 +08:00
Ju4tCode
0fec4c8592 🔀 Merge pull request #387 2021-05-26 17:42:18 +08:00
HibiKier
a09e09b942 Update plugins.json 2021-05-26 17:13:06 +08:00
Ju4tCode
7e8296b36e 🔀 Merge pull request #386
typo
2021-05-25 21:10:53 +08:00
nonebot
322477638a 📝 update api docs 2021-05-25 12:48:51 +00:00
StarHeart
e659b4b2b6 🐛 typo 2021-05-25 20:46:27 +08:00
yanyongyu
27fe6e4fcb 🔥 remove cqhttp api self_id arg 2021-05-25 16:59:26 +08:00
Ju4tCode
7d8b0843a0 Merge pull request #382 from nonebot/plugin/issue381
Plugin: Nonebot2 消息撤回插件
2021-05-24 21:31:38 +08:00
MeetWq
e44b427b7a 🍻 publish plugin Nonebot2 消息撤回插件 2021-05-24 12:42:34 +00:00
Ju4tCode
2ff6f87842 🔀 Merge pull request #380
Update plugins.json
2021-05-24 17:13:48 +08:00
HibiKier
84dfe18f39 Update plugins.json 2021-05-24 16:59:05 +08:00
yanyongyu
918b375ece 💥 drop self_id call_api support 2021-05-24 16:49:27 +08:00
StarHeart
c82a4820f7 Merge pull request #377 from Cosmos-Break/patch-3
Docs: Readme.md 增加 awesome-nonebot 资源库
2021-05-23 20:26:34 +08:00
StarHeartHunt
c6e62957ab 📝 tweak expression 2021-05-23 15:48:13 +08:00
Cosmos-Break
8a14177219 📝 add link to awesome-nonebot 2021-05-23 15:45:30 +08:00
StarHeart
24268072fc Merge pull request #378 from Cosmos-Break/patch-4
Docs: Add mirai adapter port config
2021-05-23 15:33:40 +08:00
Cosmos-Break
3c65f2dd19 📝 add mirai port config 2021-05-23 15:28:48 +08:00
Jigsaw
3f14a92a3e Merge pull request #374 from nonebot/docs/mah-user-guide
更新 Mirai-API-HTTP 用户指南
2021-05-23 01:31:52 +08:00
Mix
adf2016f4e 📝 Update Mirai-API-HTTP user guide, fix #373 2021-05-23 01:29:52 +08:00
Ju4tCode
81bb8be7f3 🔀 Merge pull request #371
Plugin: nonebot-plugin-alias
2021-05-22 18:53:10 +08:00
MeetWq
744f9e9f5d 🍻 publish plugin nonebot-plugin-alias 2021-05-22 09:59:57 +00:00
Ju4tCode
e2de13e122 🔀 Merge pull request #369
Flow: add .DS_store to .gitignore
2021-05-22 11:32:46 +08:00
StarHeartHunt
3939dfa024 🙈 ignore .DS_Store 2021-05-22 11:27:16 +08:00
yanyongyu
8680a954f8 ♻️ separate driver 2021-05-21 17:06:20 +08:00
Ju4tCode
20001764bf 🔀 Merge pull request #367
Plugin: remove todo plugin
2021-05-21 15:18:09 +08:00
yanyongyu
61512ff01f 🏷️ add type hint for logger 2021-05-21 15:15:04 +08:00
Jigsaw
2488c6295e 📝 Remove nonebot_plugin_todo 2021-05-21 13:26:42 +08:00
Ju4tCode
100f560558 🔀 Merge pull request #366
Docs: update permission doc
2021-05-21 00:51:14 +08:00
StarHeartHunt
01678005f0 🎨 reformat docs 2021-05-21 00:46:09 +08:00
StarHeartHunt
00dc72b6c4 🔥 remove .DS_Store 2021-05-20 22:41:54 +08:00
AkiraXie
ca21fb8202 📝 fix typo 2021-05-20 20:28:11 +08:00
AkiraXie
5989c3fecd 📝 update permission doc 2021-05-20 20:20:51 +08:00
yanyongyu
7376933c31 📝 update api doc build 2021-05-20 15:09:59 +08:00
Ju4tCode
a573266cab Merge pull request #364 from nonebot/plugin/issue363
Plugin: nonebot_plugin_gamedraw
2021-05-17 11:28:00 +08:00
HibiKier
8374f86fde 🍻 publish plugin nonebot_plugin_gamedraw 2021-05-17 03:08:42 +00:00
Ju4tCode
4a18772d2c 🔀 Merge pull request #362
Plugin: Nonebot2插件轻量帮助列表
2021-05-17 10:07:42 +08:00
XZhouQD
5d0ac94bfe 🍻 publish plugin Nonebot2插件轻量帮助列表 2021-05-17 00:50:29 +00:00
Ju4tCode
a636ddfab4 🔀 Merge pull request #360
Docs: 添加中国大陆文档镜像
2021-05-15 10:45:32 +08:00
StarHeartHunt
5c2840ca27 📝 add chinese mainland docs mirror 2021-05-14 22:56:11 +08:00
Ju4tCode
44850a279d 🔀 Merge pull request #359
Docs: update cqhttp implementations name
2021-05-12 12:09:27 +08:00
XZhouQD
17f3258207 📝 update api docs 2021-05-12 04:03:04 +00:00
Xiaowei Zhou
b95fed69b0 [Docs] Fix: oicq-plugin-onebot -> node-onebot
Also fixed url there
2021-05-12 09:38:25 +08:00
Xiaowei Zhou
059935aedb [Docs] Update: oicq-plugin-onebot renmae 2021-05-12 09:20:51 +08:00
Xiaowei Zhou
c99e1880d3 [Doc] Update: Onebot-Kotlin rename
Update: cqhttp-mirai / cqhttp-mirai-embedded has been renamed to Onebot-Mirai / Onebot-Kotlin by its author [yyuueexxiinngg](https://github.com/yyuueexxiinngg). Since the embedded branch was abandoned, both links here point to master branch of [onebot-kotlin](https://github.com/yyuueexxiinngg/onebot-kotlin).
2021-05-12 08:54:19 +08:00
yanyongyu
faf7a3b500 📝 update doc 2021-05-10 18:42:32 +08:00
yanyongyu
41c5ac0ac7 improve plugin matcher system 2021-05-10 18:39:59 +08:00
yanyongyu
f8ad9ef278 ⚗️ support segment typing for message 2021-05-10 00:54:15 +08:00
Mix
5146a30836 🔀 Merge pull request #356
Plugin: Minecraft 服务器状态查询
2021-05-09 22:51:56 +08:00
Jigsaw111
db59cd9578 🍻 publish plugin Minecraft 服务器状态查询 2021-05-09 14:26:01 +00:00
yanyongyu
4b38afdcd7 cqhttp message segment support more types 2021-05-04 11:08:31 +08:00
Ju4tCode
b87971247a 🔀 Merge pull request #350
Docs: fix store link
2021-05-03 15:00:13 +08:00
yanyongyu
dcf4838fda 📝 fix store link 2021-05-03 14:56:24 +08:00
StarHeart
6f40365407 🐛 fix store link 2021-05-03 14:10:12 +08:00
Ju4tCode
315fdb97d3 🔀 Merge pull request #349
Adapter: gocq
2021-05-02 16:39:04 +08:00
yanyongyu
9a3e974063 🐛 fix adapter publish id link error 2021-05-02 16:37:57 +08:00
Jigsaw111
6b3183cdfa 🍻 publish adapter gocq 2021-05-02 08:37:17 +00:00
yanyongyu
5189a182b5 ✏️ fix typo 2021-05-02 16:26:47 +08:00
yanyongyu
884a7b966f 🐛 fix missing bool to str convert in cqhttp message segment 2021-05-02 14:24:12 +08:00
Ju4tCode
fa73c13800 🔀 Merge pull request #344
Docs: update load a plugin
2021-05-01 10:59:14 +08:00
Ju4tCode
593d593a62 📝 update doc 2021-05-01 10:53:18 +08:00
Jigsaw
c2c8906b7d 📝 update loading-a-plugin docs 2021-04-30 16:24:23 +08:00
Ju4tCode
71f68fc1ce 🔀 Merge pull request #343 2021-04-29 22:58:14 +08:00
Jigsaw111
add2bda2c1 🍻 publish plugin nonebot_plugin_puppet 2021-04-29 14:22:11 +00:00
Ju4tCode
beef2ad8cf 🔀 Merge pull request #338
Bot: Github Bot
2021-04-26 22:43:03 +08:00
yanyongyu
554865f97f 🍻 publish bot Github Bot 2021-04-26 14:35:25 +00:00
Ju4tCode
d3e7ed4a71 🔀 Merge pull request #336
Docs: update handlers overload
2021-04-25 13:23:05 +08:00
yanyongyu
56e489b458 📝 update doc 2021-04-25 13:18:36 +08:00
AkiraXie
5f3bd91321 📝 update description in handler-overload doc 2021-04-25 02:31:37 +08:00
AkiraXie
4655bf1df8 📝 update handlers-overload docs 2021-04-25 02:08:52 +08:00
yanyongyu
9052214e6d raise ImportError when exec_module 2021-04-21 18:26:58 +08:00
Ju4tCode
59405bbe7a 🔀 Merge pull request #335
Bot: change repository url
2021-04-20 01:08:39 +08:00
Ailitonia
260d119711 Bot: change repository url
Updated new repository url for Bot: Omega Miya
2021-04-19 23:30:42 +08:00
yanyongyu
5abc0d9614 📝 update changelog 2021-04-19 21:51:36 +08:00
Ju4tCode
4ba6ff106c Merge pull request #334 from nonebot/yanyongyu/issue332
Fix: log module name error
2021-04-19 21:50:11 +08:00
Ju4tCode
9e51df9116 🔀 Merge pull request #333
New: support custom log level config
2021-04-19 21:44:25 +08:00
yanyongyu
64d51448b8 🐛 fix log module name error 2021-04-19 21:43:28 +08:00
yanyongyu
79d3bbcdfe 🔊 change log level add level config 2021-04-19 21:15:10 +08:00
yanyongyu
c24d0def09 🔖 bump adapter cqhttp version 2021-04-18 23:30:57 +08:00
Ju4tCode
e08843dd5c 🔀 Merge pull request #331
Docs: 一点小修改
2021-04-16 15:47:35 +08:00
StarHeart
ec35ef041a 📝 tweak 2021-04-16 09:03:00 +08:00
Ju4tCode
efe8dd98b5 🔀 Merge pull request #330
Plugin: 待办事项提醒(闹钟)
2021-04-15 01:14:09 +08:00
Jigsaw111
3fb9b25284 🍻 publish plugin 待办事项提醒(闹钟) 2021-04-14 12:28:02 +00:00
Ju4tCode
06deb13826 🔀 Merge pull request #328
Docs: 文档优化
2021-04-13 13:09:38 +08:00
StarHeartHunt
7d189392d2 📝 recommend pylance 2021-04-13 00:24:49 +08:00
StarHeartHunt
2a07b49cb7 📝 tweak 2021-04-12 23:35:51 +08:00
yanyongyu
0be145491d 🚸 add question template 2021-04-12 13:06:03 +08:00
Ju4tCode
58dd4a2183 🔀 Merge pull request #326
优化 issue 模板 bug 报告
2021-04-12 12:44:15 +08:00
StarHeart
810477749b 🚸 implement bug report template 2021-04-12 12:08:54 +08:00
Ju4tCode
92b035bea8 🔀 Merge pull request #322
New: `handle_event` will return excecption
2021-04-09 12:50:47 +08:00
yanyongyu
9801a8cebd 🎨 format code 2021-04-09 12:26:27 +08:00
Mix
f5a22b3d4b 🥅 return event handling exception 2021-04-08 23:35:08 +08:00
Ju4tCode
abbcb36131 🔀 Merge pull request #321
add documentation issue template
2021-04-08 00:43:21 -05:00
Ju4tCode
d4860af85f 🔀 Merge pull request #320
忽略 yarn.lock 防止意外提交
2021-04-08 00:41:46 -05:00
Ju4tCode
50a4cbdb80 🔀 Merge pull request #319
Docs: 更新 go-cqhttp 配置文件
2021-04-08 00:38:51 -05:00
StarHeart
dff9a74f35 🚸 add doc issue template 2021-04-08 13:26:34 +08:00
StarHeartHunt
a5c2b06493 🙈 ignore yarn.lock 2021-04-08 13:05:41 +08:00
StarHeartHunt
7bb49f0b3c 📝 update go-cqhttp config file 2021-04-08 12:34:01 +08:00
Mix
00b4b880e9 🔀 Merge pull request #316
Docs: 写明所需 Python 最低版本小版本号
2021-04-07 01:18:17 +08:00
StarHeart
87d93def62 📝 declare patch version of minimal supported python version 2021-04-07 01:13:44 +08:00
Ju4tCode
0315aa7d8f 🔀 Merge pull request #314
Doc: update store style
2021-04-05 03:49:06 -05:00
yanyongyu
b9812ea11b 🎨 revert v-row 2021-04-05 16:39:26 +08:00
yanyongyu
207750774d 🎨 improve format 2021-04-05 16:35:29 +08:00
StarHeartHunt
176dbd5830 📝 update api docs 2021-04-05 05:52:25 +00:00
StarHeartHunt
1c6711355e 🎨 format files 2021-04-05 13:49:01 +08:00
StarHeartHunt
20e1bf9624 📝 improve store display effect 2021-04-05 13:34:35 +08:00
yanyongyu
d1a438a287 ⚗️ support tuple prefix in startswith 2021-04-04 12:28:10 +08:00
yanyongyu
0d467d9275 add startswith endswith ignorecase option #312 2021-04-04 12:19:03 +08:00
yanyongyu
c402b7599f 🐛 fix missing matcher when load external plugin with dot 2021-04-03 17:32:01 +08:00
Ju4tCode
916d620012 🔀 Merge pull request #311
Pre Release 2.0.0a13.post1
2021-04-01 12:42:58 -05:00
yanyongyu
0fd82d4f54 📝 archive doc 2021-04-02 01:38:42 +08:00
yanyongyu
e425571b08 🐛 fix protocol not found in py37 2021-04-02 01:17:33 +08:00
yanyongyu
85f0023350 🔥 improve matcher store 2021-04-02 01:09:40 +08:00
yanyongyu
0eadf5f4e9 🐛 fix load error 2021-04-02 00:05:27 +08:00
Ju4tCode
b09a7518f5 🔀 Merge pull request #310
Pre Release 2.0.0a13
2021-04-01 07:44:52 -05:00
yanyongyu
0235af770f 📌 bump version 2021-04-01 20:34:49 +08:00
yanyongyu
e03e3f6130 📝 update doc 2021-04-01 20:27:27 +08:00
yanyongyu
f0a6ff4627 ⚗️ add called api hook 2021-04-01 20:23:55 +08:00
Ju4tCode
6b763e20d0 🔀 Merge pull request #309
Fix: matcher got  recursion
2021-04-01 07:09:08 -05:00
yanyongyu
fcb1c5d316 🚑 fix matcher got recursion 2021-04-01 20:05:31 +08:00
Ju4tCode
953328903c 🔀 Merge pull request #308
Pre Release 2.0.0a12
2021-03-31 08:55:18 -05:00
yanyongyu
afba90838f 📝 archive doc 2021-03-31 21:37:01 +08:00
nonebot
f1ed783776 📝 update api docs 2021-03-31 13:27:02 +00:00
yanyongyu
59ec5bacde 📝 update changelog 2021-03-31 21:20:07 +08:00
yanyongyu
ca08c56df7 🐛 fix import hook export 2021-03-31 20:38:00 +08:00
yanyongyu
d1e8925fe0 ⬆️ bump version 2021-03-31 20:25:45 +08:00
yanyongyu
68ba1c1af2 🐛 fix reply get fail broken down 2021-03-31 20:09:00 +08:00
Ju4tCode
03ac119313 🔀 Merge pull request #307
New: add call_api hook
2021-03-31 04:00:18 -05:00
yanyongyu
8f99b01fb5 ⚗️ add call_api hook 2021-03-31 16:53:10 +08:00
yanyongyu
4e7592de98 🔒 ensure cqhttp str radd escaped 2021-03-30 16:21:56 +08:00
Ju4tCode
5db819738e 🔀 Merge pull request #300
Fix: mirai empty message chain when check at
2021-03-30 02:55:02 -05:00
SinonJZH
ade5d923ab 🐛 fix mirai message chain empty 2021-03-30 12:16:12 +08:00
yanyongyu
43b185a3b8 🔊 add log for event handle 2021-03-27 14:42:43 +08:00
yanyongyu
65ec4828a9 📝 update changelog 2021-03-26 14:27:05 +08:00
yanyongyu
1f585d8bcb store message in ParserExit exception 2021-03-26 11:25:13 +08:00
yanyongyu
b861149e0b add argparse help message 2021-03-25 18:22:56 +08:00
Ju4tCode
534b51bc73 🔀 Merge pull request #294
Doc: update hook docs
2021-03-25 02:14:41 -05:00
AkiraXie
430b3467cc 📝 fix typo 2021-03-24 20:04:48 +08:00
AkiraXie
2dc7107990 📝 update hook docs 2021-03-24 19:52:47 +08:00
Ju4tCode
81edb535a4 🔀 Merge pull request #293
Docs: runtime hook
2021-03-24 12:09:34 +08:00
yanyongyu
f00ce8b4f6 🐛 matcher.send returned none 2021-03-24 00:28:37 +08:00
StarHeartHunt
696ae2da6b 📝 update api docs 2021-03-23 15:11:34 +00:00
StarHeartHunt
b7e5ce88ea 📝 Correct params of hook functions 2021-03-23 23:10:05 +08:00
Ju4tCode
8fc8cb6112 🔀 Merge pull request #291
Plugin: 本地数据存储
2021-03-22 17:28:48 +08:00
yanyongyu
48fae782d7 📝 update plugin doc 2021-03-22 17:27:31 +08:00
yanyongyu
f3e78cc82e 🍻 publish plugin 本地数据存储 2021-03-22 09:25:11 +00:00
yanyongyu
45199a247b 🐛 fix plugin matcher data 2021-03-22 16:41:29 +08:00
yanyongyu
f0a8b47c06 💩 remove __manager__ 2021-03-22 01:23:09 +08:00
yanyongyu
6371cd6bfe 🐛 fix error matcher module when import 2021-03-22 01:15:15 +08:00
yanyongyu
d738f8674d 📝 update doc and chqnglog 2021-03-20 16:38:42 +08:00
Ju4tCode
abfda3113b 🔀 Merge pull request #276
Breaking: change cqhttp ding session id
2021-03-20 16:36:22 +08:00
yanyongyu
a941b32dd5 📝 update changelog 2021-03-20 16:33:16 +08:00
yanyongyu
1527fb55f5 💡 update handler docstring 2021-03-20 16:33:16 +08:00
Ju4tCode
ffc1cd7d8d 🔀 Merge pull request #290
Fix: cqhttp post secret checking error
2021-03-20 16:32:51 +08:00
Reverier-Xu
7f27957164 💥 change cqhttp ding session id 2021-03-20 16:13:02 +08:00
yanyongyu
f8c057b135 📌 update lock file 2021-03-20 15:13:08 +08:00
yanyongyu
2166595e50 🐛 fix cqhttp secret checking #289 2021-03-20 14:49:58 +08:00
yanyongyu
22033e1cfb 🐛 fix typing 2021-03-19 15:02:01 +08:00
yanyongyu
fc334ec7b9 add logger id 2021-03-19 00:24:38 +08:00
yanyongyu
e7dc4e1eec ⚗️ finish handler class 2021-03-18 21:30:52 +08:00
yanyongyu
6bd12b7f2c ⚗️ add handler class 2021-03-18 19:16:18 +08:00
Ju4tCode
5d48a92d1d 🔀 Merge pull request #287
Plugin: bilibili视频、番剧解析
2021-03-16 18:08:03 +08:00
mengshouer
4bc87ca747 🍻 publish plugin bilibili视频、番剧解析 2021-03-16 10:04:32 +00:00
yanyongyu
62135dc117 🔊 fix logger color tag 2021-03-16 16:20:58 +08:00
yanyongyu
1e294b8fbe 🐛 fix config load due to pydantic breaking change 2021-03-16 16:17:34 +08:00
Ju4tCode
9258bb09b4 🔀 Merge pull request #285
Doc: backword for 2.0.0a11 archive
2021-03-14 11:52:55 +08:00
StarHeartHunt
b31317720b 📝 add tips for separated adapters in 2.0.0a11 docs 2021-03-14 08:49:22 +08:00
yanyongyu
211c571508 🐛 fix reimport by require 2021-03-13 18:21:56 +08:00
yanyongyu
785eac1345 🏷️ fix regex rule typing error 2021-03-13 15:35:13 +08:00
yanyongyu
bb64c6fb71 🐛 fix type and permission updater 2021-03-12 16:28:56 +08:00
Ju4tCode
782232fb1a 🔀 Merge pull request #282
Bug: typo in built-in plugin
2021-03-11 14:57:09 +08:00
Artin
0fec9915de ding: send by webhook
close: #189

Feature: 钉钉添加 `send_by_webhook` 方法 #189
2021-03-11 13:26:16 +08:00
StarHeart
efacff698d 🐛 typo 2021-03-11 10:55:18 +08:00
Ju4tCode
36d0628e4f 🔀 Merge pull request #281
Fix: store bot display and readme
2021-03-11 00:39:08 +08:00
yanyongyu
46c65b919f 🐛 fix bot display bug 2021-03-11 00:27:32 +08:00
Ju4tCode
0b9aad09cf 🔀 Merge pull request #280
Bot: Omega Miya
2021-03-11 00:23:55 +08:00
Ailitonia
717e74f01d 🍻 publish bot Omega Miya 2021-03-10 16:22:39 +00:00
Ju4tCode
ef4f8df5a7 🔀 Merge pull request #278
Bot: HarukaBot
2021-03-11 00:21:13 +08:00
SK-415
dce1187750 🍻 publish bot HarukaBot 2021-03-10 14:45:43 +00:00
yanyongyu
5ee6beb4b8 🚑 fix test reload 2021-03-10 17:32:14 +08:00
Mix
3af8cc45ea 🔀 Merge pull request #274
Fix: Plugin Store link in README
2021-03-08 17:27:58 +08:00
yanyongyu
89ff2dd3c5 📝 update readme 2021-03-08 17:16:37 +08:00
SK-415
e7101a1f39 fix: Plugin Store link in README 2021-03-08 16:39:33 +08:00
Ju4tCode
2af7f2bedb 🔀 Merge pull request #273
Fix: mah friend request
2021-03-07 09:08:35 -06:00
notnotype
ad70fac377 📝 update api docs 2021-03-07 14:41:18 +00:00
notnotype
2885e6053c fix: mah adapter 不能接受好友请求 2021-03-07 22:36:38 +08:00
Ju4tCode
4661adc564 🔀 Merge pull request #272
Fix: errors in doc
2021-03-07 08:34:03 -06:00
yanyongyu
edc6da9e61 ✏️ fix plugin link 2021-03-07 22:24:04 +08:00
Ju4tCode
d49749e5a1 🔀 Merge pull request #269
Fix typo
2021-03-07 08:22:05 -06:00
Ju4tCode
8544fb2f69 🔀 Merge pull request #268
Doc: add adapter install guide
2021-03-07 08:20:52 -06:00
Ju4tCode
80e41d26e2 🔀 Merge pull request #270
Fix: doc plugin publish
2021-03-07 08:19:22 -06:00
StarHeart
8d6bb3768b 🐛 correct params order 2021-03-07 19:09:03 +08:00
StarHeart
c54007d7a4 🐛 typo 2021-03-07 18:54:00 +08:00
Ju4tCode
35bf3ef772 🔀 Merge pull request #267
Plugin: 插件管理器
2021-03-07 04:40:55 -06:00
StarHeartHunt
06e1459667 Merge branch 'docs' of github.com:StarHeartHunt/nonebot2-vercel-mirror into docs 2021-03-07 18:13:43 +08:00
StarHeartHunt
da97a18497 📝 remove redundant characters 2021-03-07 18:12:14 +08:00
StarHeartHunt
61e33e24e9 📝 update api docs 2021-03-07 10:04:53 +00:00
StarHeartHunt
f49a581193 📝 replace inaccurate words 2021-03-07 18:01:30 +08:00
StarHeartHunt
f30b9e4fb9 📝 tips for getting adapters list 2021-03-07 17:59:25 +08:00
StarHeartHunt
c3a8dc709f 📝 tips for installing separated adapters 2021-03-07 17:55:29 +08:00
Jigsaw111
63d6f173d6 🍻 publish plugin 插件管理器 2021-03-07 08:42:10 +00:00
Ju4tCode
8d80b610d1 🔀 Merge pull request #265
ci: 更新商店发布议题机器人
2021-03-06 11:19:58 -06:00
hemengyang
80a54914e2 👷 update publish issue bot 2021-03-07 00:43:12 +08:00
yanyongyu
ac613b5839 🐛 fix subplugin detect bug 2021-03-06 22:25:50 +08:00
yanyongyu
33412f9bd2 ⚗️ add reload dir config for fastapi 2021-03-06 11:56:58 +08:00
Ju4tCode
51304fdd8e 🔀 Merge pull request #262
Fix: exclude all `__init__.py` in adapter packaging
2021-03-05 11:46:22 -06:00
yanyongyu
e139c883a3 🚑 exclude all __init__ in packaging 2021-03-06 01:40:20 +08:00
Ju4tCode
662c5c09a6 🔀 Merge pull request #261
Fix: fix adapter override namespace file
2021-03-05 10:40:39 -06:00
yanyongyu
a99d33198f 🐛 fix override 2021-03-06 00:09:26 +08:00
yanyongyu
e6ac07e608 🔀 Merge branch 'dev' 2021-03-05 20:49:16 +08:00
yanyongyu
d476c7e999 👷 update release drafter 2021-03-05 20:48:44 +08:00
365 changed files with 20597 additions and 11950 deletions

View File

@@ -28,6 +28,11 @@ A clear and concise description of what you expected to happen.
- Python Version: [e.g. 3.8] - Python Version: [e.g. 3.8]
- Nonebot Version: [e.g. 2.0.0] - Nonebot Version: [e.g. 2.0.0]
**截图** **协议端信息:**
- 协议端: [e.g. go-cqhttp]
- 协议端版本: [e.g. 1.0.0]
**截图或日志**
If applicable, add screenshots to help explain your problem. If applicable, add screenshots to help explain your problem.

View File

@@ -1,5 +1,8 @@
blank_issues_enabled: false blank_issues_enabled: false
contact_links: contact_links:
- name: Question
url: https://github.com/nonebot/discussions/discussions/new
about: Ask questions about nonebot
- name: Plugin Publish - name: Plugin Publish
url: https://v2.nonebot.dev/store.html url: https://v2.nonebot.dev/store.html
about: Publish your plugin to nonebot homepage and nb-cli about: Publish your plugin to nonebot homepage and nb-cli

17
.github/ISSUE_TEMPLATE/document.md vendored Normal file
View File

@@ -0,0 +1,17 @@
---
name: Document improvement
about: Feedback on documentation, including errors and ideas
title: 'Docs: some description'
labels: documentation
assignees: ''
---
**描述问题或主题:**
**需做出的修改:**
* [ ] 一些修改
* [ ] 一些修改
* [ ] 一些修改

View File

@@ -15,6 +15,10 @@ categories:
- 'bug' - 'bug'
- title: '🍻 Plugin Publish' - title: '🍻 Plugin Publish'
label: 'Plugin' label: 'Plugin'
- title: '🍻 Bot Publish'
label: 'Bot'
- title: '🍻 Adapter Publish'
label: 'Adapter'
change-template: '- $TITLE @$AUTHOR (#$NUMBER)' change-template: '- $TITLE @$AUTHOR (#$NUMBER)'
change-title-escapes: '\<*_&' # You can add # and @ to disable mentions, and add ` to disable code blocks. change-title-escapes: '\<*_&' # You can add # and @ to disable mentions, and add ` to disable code blocks.
version-resolver: version-resolver:

View File

@@ -1,25 +0,0 @@
name: 'Plugin Issue Bot'
on:
push:
branches:
- master
issues:
types: [opened, reopened, edited]
pull_request:
types: [closed]
jobs:
issue_bot:
runs-on: ubuntu-latest
name: plugin issue bot
steps:
- name: Checkout code
uses: actions/checkout@v2
- name: NoneBot2 Plugin Issue Bot
uses: he0119/nonebot2-plugin-issue-bot@v0.2
with:
token: ${{ secrets.GH_TOKEN }}
base: master
path: docs/.vuepress/public/plugins.json

27
.github/workflows/publish_bot.yml vendored Normal file
View File

@@ -0,0 +1,27 @@
name: 'NoneBot2 Publish Bot'
on:
push:
branches:
- master
issues:
types: [opened, reopened, edited]
pull_request:
types: [closed]
jobs:
publish_bot:
runs-on: ubuntu-latest
name: nonebot2 publish bot
steps:
- name: Checkout code
uses: actions/checkout@v2
- name: NoneBot2 Publish Bot
uses: nonebot/nonebot2-publish-bot@main
with:
token: ${{ secrets.GH_TOKEN }}
base: master
plugin_path: docs/.vuepress/public/plugins.json
bot_path: docs/.vuepress/public/bots.json
adapter_path: docs/.vuepress/public/adapters.json

2
.gitignore vendored
View File

@@ -189,3 +189,5 @@ dev
docs_build/_build docs_build/_build
!tests/.env !tests/.env
*.xmind *.xmind
yarn.lock
.DS_Store

9
.prettierrc Normal file
View File

@@ -0,0 +1,9 @@
{
"tabWidth": 2,
"useTabs": false,
"endOfLine": "lf",
"arrowParens": "always",
"singleQuote": false,
"trailingComma": "es5",
"semi": true
}

View File

@@ -1,3 +1,4 @@
<!-- markdownlint-disable MD033 MD041-->
<p align="center"> <p align="center">
<a href="https://v2.nonebot.dev/"><img src="https://raw.githubusercontent.com/nonebot/nonebot2/master/docs/.vuepress/public/logo.png" width="200" height="200" alt="nonebot"></a> <a href="https://v2.nonebot.dev/"><img src="https://raw.githubusercontent.com/nonebot/nonebot2/master/docs/.vuepress/public/logo.png" width="200" height="200" alt="nonebot"></a>
</p> </p>
@@ -6,7 +7,10 @@
# NoneBot # NoneBot
_✨ Python 异步机器人框架 ✨_ <!-- prettier-ignore-start -->
<!-- markdownlint-disable-next-line MD036 -->
_✨ 跨平台 Python 异步机器人框架 ✨_
<!-- prettier-ignore-end -->
</div> </div>
@@ -17,7 +21,7 @@ _✨ Python 异步机器人框架 ✨_
<a href="https://pypi.python.org/pypi/nonebot2"> <a href="https://pypi.python.org/pypi/nonebot2">
<img src="https://img.shields.io/pypi/v/nonebot2" alt="pypi"> <img src="https://img.shields.io/pypi/v/nonebot2" alt="pypi">
</a> </a>
<img src="https://img.shields.io/badge/python-3.7+-blue" alt="python"><br /> <img src="https://img.shields.io/badge/python-3.7.3+-blue" alt="python"><br />
<a href="https://github.com/howmanybots/onebot/blob/master/README.md"> <a href="https://github.com/howmanybots/onebot/blob/master/README.md">
<img src="https://img.shields.io/badge/OneBot-v11-black?style=social&logo=data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABABAMAAABYR2ztAAAAIVBMVEUAAAAAAAADAwMHBwceHh4UFBQNDQ0ZGRkoKCgvLy8iIiLWSdWYAAAAAXRSTlMAQObYZgAAAQVJREFUSMftlM0RgjAQhV+0ATYK6i1Xb+iMd0qgBEqgBEuwBOxU2QDKsjvojQPvkJ/ZL5sXkgWrFirK4MibYUdE3OR2nEpuKz1/q8CdNxNQgthZCXYVLjyoDQftaKuniHHWRnPh2GCUetR2/9HsMAXyUT4/3UHwtQT2AggSCGKeSAsFnxBIOuAggdh3AKTL7pDuCyABcMb0aQP7aM4AnAbc/wHwA5D2wDHTTe56gIIOUA/4YYV2e1sg713PXdZJAuncdZMAGkAukU9OAn40O849+0ornPwT93rphWF0mgAbauUrEOthlX8Zu7P5A6kZyKCJy75hhw1Mgr9RAUvX7A3csGqZegEdniCx30c3agAAAABJRU5ErkJggg==" alt="cqhttp"> <img src="https://img.shields.io/badge/OneBot-v11-black?style=social&logo=data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABABAMAAABYR2ztAAAAIVBMVEUAAAAAAAADAwMHBwceHh4UFBQNDQ0ZGRkoKCgvLy8iIiLWSdWYAAAAAXRSTlMAQObYZgAAAQVJREFUSMftlM0RgjAQhV+0ATYK6i1Xb+iMd0qgBEqgBEuwBOxU2QDKsjvojQPvkJ/ZL5sXkgWrFirK4MibYUdE3OR2nEpuKz1/q8CdNxNQgthZCXYVLjyoDQftaKuniHHWRnPh2GCUetR2/9HsMAXyUT4/3UHwtQT2AggSCGKeSAsFnxBIOuAggdh3AKTL7pDuCyABcMb0aQP7aM4AnAbc/wHwA5D2wDHTTe56gIIOUA/4YYV2e1sg713PXdZJAuncdZMAGkAukU9OAn40O849+0ornPwT93rphWF0mgAbauUrEOthlX8Zu7P5A6kZyKCJy75hhw1Mgr9RAUvX7A3csGqZegEdniCx30c3agAAAABJRU5ErkJggg==" alt="cqhttp">
</a> </a>
@@ -30,18 +34,18 @@ _✨ Python 异步机器人框架 ✨_
<a href="https://core.telegram.org/bots/api"> <a href="https://core.telegram.org/bots/api">
<img src="https://img.shields.io/badge/telegram-Bot-lightgrey?style=social&logo=telegram"> <img src="https://img.shields.io/badge/telegram-Bot-lightgrey?style=social&logo=telegram">
</a> </a>
<a href="https://open.feishu.cn/document/home/index">
<img src="https://img.shields.io/badge/%E9%A3%9E%E4%B9%A6-Bot-lightgrey?style=social&logo=data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAADICAMAAACahl6sAAAAk1BMVEX///8zMzNJSUlSUlJcXFxtbW0zMzNLS0szMzMzMzNBQUGVlZUzMzM1NTU0NDQzMzMzMzM0NDQ0NDQ0NDQ3NzdDQ0M0NDQ2NjY4ODg9PT0zMzM0NDQ5OTk7OzszMzM0NDQ3NzczMzM0NDQ0NDQ0NDQ0NDQ3Nzc2NjY4ODg2NjY7Ozs0NDQ6Ojo6Ojo3Nzc4ODgzMzNGdMWJAAAAMHRSTlMD6h0TDgr8GNf0KQbvhLT45KKTmm4jwHVJLdLFQzbcjFTgzsq7rl58T2kyqD46Y1riMDRhAAAFr0lEQVR42uzZWXKiUACF4YMyqKAQhyjOc7STmLP/1bVlLukESIJ3sLGKbwFU/Q8HuIBKpVKpVCqVSqVSqVQqlUqlUvmNM10Mcfda/U6TPdw3e9lb8ayLO+bPniYu+amjNcPd8U7PFhML0RE5uCvnaY/5SVt0WFvckcu0vxjiYmDxbu5cl2mn9UVHRMa4B2LaP3RYKD1vL6adccRFLSLL/izxxbRz7UXHimdLlFdq2mlvnztYRznZh96cP3G/dkxQRrOnR5c/c5eiQ+S2UTbe/sHir9zD1w6+okz8aXvMItyRqE46ApSHmHYRYdLRoPCMcrAP3TkLC6fpDp5QAn/EtItqij3UG/zgQZH5aWc7ZqJjzA9jKFGf9ppXC3I6uMB/Mzh2mpQQ/Mnp4BSy1Kctx4pFx5qfhA4kqE87pCyrldfBDm6sLqat2mGnttXHDfkvYtryooHo2PCrFm5lcNw1qWr1XUeEm7BH3QYVRJNGcOmoietNmNKDWeKFnCo6b3Wc1drW/NsOLpFRqmmT4xgfPFw42Q7XhkFi2kq2DtKcR2Y8wpTacRdQ3aZYB59ggiOmrS6sFevgDNr9GW6pzRAZdsQsC3rV3x4i6uQha8+sB2h9am9c6rVBDj9ixr5k007rIs+CGV65pl3wXjRi2hrKYjFtM/rI02JaW3XaPYtGtZHHY9qL0lN7QuO2yBMzpenLTvtkZNos+AY1ZcpObtoLtWmrj6TNlCOuJqZ9M3PkaDBlIBHCmwpHyHpjSgMS2ryhcIqsmsWULmR0eTPhK7LsMdMOKHdJM+nw8E+8ZoYDOT3eRDDDuz6HNt7VeszaQtYDJch+38WRZ51TDO+0Y54hylzy0XHib2JI83c0zIoLd1hAeUus1jenQe2HQ79Dg6wB3i1d/uoNpS2JrulgHWqcRxqySjoObrFjfUlLVrVrOtiGMmdCA+ZJx8hlEa9QZ2+oXcNLOkIWEUAHe22sYxqykGdoUV//5w6eoKlkTI3Gdbx7CVmQB10lDWqzSTpemyyoAW28ubYO++oOLqBPbUUtJknHrMnCRihdyaOTdAQsLHSgtSTS2BEHLK4DvQYWFW2lOtiHZi3Fko6fXCjgNVooV0nHl7tMBP1aAaXtJDvYgwGxdMmzLzu1JUyYNSU7IAwiiZ8OJrxKlTzI38QnMORFoqSn8Fh9gikvIa/UVejgDMZMQ9mOOa8WwKCRyysslF6hn2HSwZX4+ew1KGEPCSZKhoqHMw9mLd1rO8aUMYZpexbRV/2AsYBxy7/t3NtuglAQheFR6wEPVEQtaq1WxQNqnfd/urY08QJFYHZS15D9vcHckMzOz/QWA9/3jqHrbmbr1bT10a90ncQcoiclgKY/Vq81q6P2JJqfI+NHPqdDSMRzsEtIXmYGcQcQk2fwKgHxTCIVJGMWwTu6sWGxPSFx+QpkOfz3QcYEJWQhtGsbR5aKCIrHInjXNsSDeITFZ6ELYZEMAnltY8AyawKz4KJAr21IBzkRmB6LOIRGOEhIaHYsciA0uxIshwa/DLQIzrAEy2HswBIBwck9yNOvbWT4YgHEU4zbEiyHsQsXhnmKccmxp2cbxvb8CyDbMBXwD4hsw1BQguUw9s4Mk20YOTFQtmHiDJVtGJhjZRtyEVi2ITbhnLBOMd5qOvqXwz9RFy3bkJpU0LINeTCsJdvIztHVZhsJo77SbOPG6FNltpFQqMxsE7hmS+9ymJxE7XKYUGupyzZS1Kbaso00tbWybONBTadyObyjPlaVbTycRFO28Uh9oyjbEJ/E2JImnVDXy1y6zpHvW5E2npJsI5unI9vIwVe3HKYZaMg2clkoyDby6Wl5mcv0Bp9t5DVEzzZyG4JnG/kdsLONArbQ2UYRlwZwtlHIsoGbbRSdRNtymGbf0LYcpgleQbMNwdUCbcthmrP2j++VjqdSy7Isy7Isy4LxDTcBnqEPd5jdAAAAAElFTkSuQmCC" alt="feishu">
</a>
<br /> <br />
<a href="https://jq.qq.com/?_wv=1027&k=5OFifDh"> <a href="https://jq.qq.com/?_wv=1027&k=5OFifDh">
<img src="https://img.shields.io/badge/qq%E7%BE%A4-768887710-orange?style=flat-square" alt="QQ Chat"> <img src="https://img.shields.io/badge/qq%E7%BE%A4-768887710-orange?style=flat-square" alt="QQ Chat">
</a> </a>
<a href="https://t.me/cqhttp"> <a href="https://t.me/botuniverse">
<img src="https://img.shields.io/badge/telegram-chat-blue?style=flat-square" alt="Telegram Chat"> <img src="https://img.shields.io/badge/telegram-botuniverse-blue?style=flat-square" alt="Telegram Channel">
</a> </a>
<a href="https://jq.qq.com/?_wv=1027&k=5Nl0zhE"> <a href="https://discord.gg/VKtE6Gdc4h">
<img src="https://img.shields.io/badge/%E7%89%88%E6%9C%AC%E5%8F%91%E5%B8%83%E7%BE%A4-218529254-green?style=flat-square" alt="QQ Release"> <img src="https://discordapp.com/api/guilds/847819937858584596/widget.png?style=shield" alt="Discord Server">
</a>
<a href="https://t.me/cqhttp_release">
<img src="https://img.shields.io/badge/%E7%89%88%E6%9C%AC%E5%8F%91%E5%B8%83%E9%A2%91%E9%81%93-join-green?style=flat-square" alt="Telegram Release">
</a> </a>
</p> </p>
@@ -54,6 +58,7 @@ _✨ Python 异步机器人框架 ✨_
· ·
<a href="#插件">文档打不开?</a> <a href="#插件">文档打不开?</a>
</p> </p>
<!-- markdownlint-enable MD033 -->
## 简介 ## 简介
@@ -72,12 +77,15 @@ NoneBot2 的驱动框架 `Driver` 以及通信协议 `Adapter` 均可**自定义
- [FastAPI](https://fastapi.tiangolo.com/) - [FastAPI](https://fastapi.tiangolo.com/)
- [Quart](https://pgjones.gitlab.io/quart/) (异步 flask ) - [Quart](https://pgjones.gitlab.io/quart/) (异步 flask )
目前 NoneBot2 内置的协议适配: 目前 NoneBot2 官方维护的协议适配:
- [OneBot(CQHTTP) 协议](https://github.com/howmanybots/onebot/blob/master/README.md) (QQ 等) - [OneBot(CQHTTP) 协议](https://github.com/howmanybots/onebot/blob/master/README.md) (QQ 等)
- [Mirai-API-HTTP 协议](https://github.com/project-mirai/mirai-api-http) - [Mirai-API-HTTP 协议](https://github.com/project-mirai/mirai-api-http)
- [钉钉](https://ding-doc.dingtalk.com/document#/org-dev-guide/elzz1p) - [钉钉](https://ding-doc.dingtalk.com/document#/org-dev-guide/elzz1p)
- [Telegram](https://core.telegram.org/bots/api) _计划中_ - [Telegram](https://core.telegram.org/bots/api)
- [飞书](https://open.feishu.cn/document/home/index)
更多:[商店](https://v2.nonebot.dev/store.html)
## 即刻开始 ## 即刻开始
@@ -98,7 +106,17 @@ NoneBot2 的驱动框架 `Driver` 以及通信协议 `Adapter` 均可**自定义
nb create nb create
``` ```
## 插件 ## 社区资源
### 常见问题
- [常见问题解答(FAQ)](https://faq.nonebot.dev/)
### 教程/实际项目/经验分享
- [awesome-nonebot](https://github.com/nonebot/awesome-nonebot)
### 插件
此外NoneBot2 还有丰富的官方以及第三方现成的插件供大家使用: 此外NoneBot2 还有丰富的官方以及第三方现成的插件供大家使用:
@@ -108,9 +126,12 @@ NoneBot2 的驱动框架 `Driver` 以及通信协议 `Adapter` 均可**自定义
nb plugin install nonebot_plugin_docs nb plugin install nonebot_plugin_docs
``` ```
或者尝试 [文档镜像](https://nonebot2-vercel-mirror.vercel.app) 或者尝试以下镜像:
- 其他插件请查看 [插件商店](https://v2.nonebot.dev/plugin-store.html) - [文档镜像(中国境内)](https://nb2.baka.icu)
- [文档镜像(vercel)](https://nonebot2-vercel-mirror.vercel.app)
- 其他插件请查看 [商店](https://v2.nonebot.dev/store.html)
## 贡献 ## 贡献

View File

@@ -1,7 +0,0 @@
# 深入
## 它如何工作?
<!-- TODO: how to work -->
~~未填坑~~

View File

@@ -1 +0,0 @@
# 权限控制

View File

@@ -1 +0,0 @@
# 钩子函数

View File

@@ -1,15 +0,0 @@
---
home: true
heroImage: /logo.png
tagline: 跨平台 Python 异步 QQ 机器人框架
actionText: 开始使用
actionLink: guide/
features:
- title: 简洁
details: 提供极其简洁易懂的 API使你可以毫无压力地开始验证你的绝佳创意只需编写最少量的代码即可实现丰富的功能。
- title: 易于扩展
details: 精心设计的消息处理流程使得你可以很方便地将原型扩充为具有大量实用功能的完整聊天机器人,并持续保证扩展性。
- title: 高性能
details: 采用异步 I/O利用 WebSocket 进行通信,以获得极高的性能;同时,支持使用多账号同时接入,减少业务宕机的可能。
footer: MIT Licensed | Copyright © 2018 - 2020 NoneBot Team
---

View File

@@ -1 +0,0 @@
# 事件处理函数重载

View File

@@ -1,60 +0,0 @@
# 钩子函数
[`钩子编程`](https://zh.wikipedia.org/wiki/%E9%92%A9%E5%AD%90%E7%BC%96%E7%A8%8B)
> 钩子编程hooking也称作“挂钩”是计算机程序设计术语指通过拦截软件模块间的函数调用、消息传递、事件传递来修改或扩展操作系统、应用程序或其他软件组件的行为的各种技术。处理被拦截的函数调用、事件、消息的代码被称为钩子hook
`nonebot2` 中有一系列预定义的钩子函数,这些函数位于 [`nonebot.message`](https://v2.nonebot.dev/api/message.html) 模块下,我们可以以装饰器的形式利用这些函数,进行以下四种操作:
:::warning 注意
1.在钩子函数中,与 `matcher` 运行状态相关的函数将不可用,如 `matcher.finish()`
2.如果需要在钩子函数中打断整个对话的执行,请参考以下范例:
```python
from nonebot.exception import IgnoredException
@event_preprocessor
async def do_something(matcher: Matcher, bot: Bot, event: Event, state: T_State):
raise IgnoredException("reason")
```
:::
## 事件预处理
```python
from nonebot.message import event_preprocessor
@event_preprocessor
async def do_something(matcher: Matcher, bot: Bot, event: Event, state: T_State):
pass
```
## 事件后处理
```python
from nonebot.message import event_postprocessor
@event_postprocessor
async def do_something(matcher: Matcher, bot: Bot, event: Event, state: T_State):
pass
```
## 运行预处理
```python
from nonebot.message import run_preprocessor
@run_preprocessor
async def do_something(matcher: Matcher, bot: Bot, event: Event, state: T_State):
pass
```
## 运行后处理
```python
from nonebot.message import run_postprocessor
@run_postprocessor
async def do_something(matcher: Matcher, bot: Bot, event: Event, state: T_State):
pass
```

View File

@@ -1,318 +0,0 @@
---
contentSidebar: true
sidebarDepth: 0
---
# NoneBot.drivers 模块
## 后端驱动适配基类
各驱动请继承以下基类
## _class_ `Driver`
基类:`abc.ABC`
Driver 基类。将后端框架封装,以满足适配器使用。
### `_adapters`
* **类型**
`Dict[str, Type[Bot]]`
* **说明**
已注册的适配器列表
### `_ws_connection_hook`
* **类型**
`Set[T_WebSocketConnectionHook]`
* **说明**
WebSocket 连接建立时执行的函数
### `_ws_disconnection_hook`
* **类型**
`Set[T_WebSocketDisconnectionHook]`
* **说明**
WebSocket 连接断开时执行的函数
### _abstract_ `__init__(env, config)`
* **参数**
* `env: Env`: 包含环境信息的 Env 对象
* `config: Config`: 包含配置信息的 Config 对象
### `env`
* **类型**
`str`
* **说明**
环境名称
### `config`
* **类型**
`Config`
* **说明**
配置对象
### `_clients`
* **类型**
`Dict[str, Bot]`
* **说明**
已连接的 Bot
### `register_adapter(name, adapter, **kwargs)`
* **说明**
注册一个协议适配器
* **参数**
* `name: str`: 适配器名称,用于在连接时进行识别
* `adapter: Type[Bot]`: 适配器 Class
### _abstract property_ `type`
驱动类型名称
### _abstract property_ `server_app`
驱动 APP 对象
### _abstract property_ `asgi`
驱动 ASGI 对象
### _abstract property_ `logger`
驱动专属 logger 日志记录器
### _property_ `bots`
* **类型**
`Dict[str, Bot]`
* **说明**
获取当前所有已连接的 Bot
### _abstract_ `on_startup(func)`
注册一个在驱动启动时运行的函数
### _abstract_ `on_shutdown(func)`
注册一个在驱动停止时运行的函数
### `on_bot_connect(func)`
* **说明**
装饰一个函数使他在 bot 通过 WebSocket 连接成功时执行。
* **函数参数**
* `bot: Bot`: 当前连接上的 Bot 对象
### `on_bot_disconnect(func)`
* **说明**
装饰一个函数使他在 bot 通过 WebSocket 连接断开时执行。
* **函数参数**
* `bot: Bot`: 当前连接上的 Bot 对象
### `_bot_connect(bot)`
在 WebSocket 连接成功后,调用该函数来注册 bot 对象
### `_bot_disconnect(bot)`
在 WebSocket 连接断开后,调用该函数来注销 bot 对象
### _abstract_ `run(host=None, port=None, *args, **kwargs)`
* **说明**
启动驱动框架
* **参数**
* `host: Optional[str]`: 驱动绑定 IP
* `post: Optional[int]`: 驱动绑定端口
* `*args`
* `**kwargs`
### _abstract async_ `_handle_http()`
用于处理 HTTP 类型请求的函数
### _abstract async_ `_handle_ws_reverse()`
用于处理 WebSocket 类型请求的函数
## _class_ `WebSocket`
基类:`object`
WebSocket 连接封装,统一接口方便外部调用。
### _abstract_ `__init__(websocket)`
* **参数**
* `websocket: Any`: WebSocket 连接对象
### _property_ `websocket`
WebSocket 连接对象
### _abstract property_ `closed`
* **类型**
`bool`
* **说明**
连接是否已经关闭
### _abstract async_ `accept()`
接受 WebSocket 连接请求
### _abstract async_ `close(code)`
关闭 WebSocket 连接请求
### _abstract async_ `receive()`
接收一条 WebSocket 信息
### _abstract async_ `send(data)`
发送一条 WebSocket 信息

View File

@@ -1,31 +0,0 @@
# 概览
<!-- :::tip 提示
如果在阅读本文档时遇到难以理解的词汇,请随时查阅 [术语表](../glossary.md) 或使用 [Google 搜索](https://www.google.com/)
::: -->
:::tip 提示
初次使用时可能会觉得这里的概览过于枯燥,可以先简单略读之后直接前往 [安装](./installation.md) 查看安装方法,并进行后续的基础使用教程。
:::
NoneBot2 是一个可扩展的 Python 异步机器人框架,它会对机器人收到的事件进行解析和处理,并以插件化的形式,按优先级分发给事件所对应的事件响应器,来完成具体的功能。
除了起到解析事件的作用NoneBot 还为插件提供了大量实用的预设操作和权限控制机制。对于命令处理,它更是提供了完善且易用的会话机制和内部调用机制,以分别适应命令的连续交互和插件内部功能复用等需求。
得益于 Python 的 [asyncio](https://docs.python.org/3/library/asyncio.html) 机制NoneBot 处理事件的吞吐量有了很大的保障,再配合 WebSocket 通信方式也是最建议的通信方式NoneBot 的性能可以达到 HTTP 通信方式的两倍以上,相较于传统同步 I/O 的 HTTP 通信,更是有质的飞跃。
需要注意的是NoneBot 仅支持 **Python 3.7+**
## 特色
NoneBot2 的驱动框架 `Driver` 以及通信协议 `Adapter` 均可**自定义**,并且可以作为插件进行**替换/添加**
- 提供使用简易的脚手架
- 提供丰富的官方插件
- 提供可添加/替换的驱动以及协议选项
- 基于异步 I/O
- 同时支持 HTTP 和反向 WebSocket 通信方式
- 支持多个机器人账号负载均衡
- 提供直观的交互式会话接口
- 提供可自定义的权限控制机制
- 多种方式渲染要发送的消息内容,使对话足够自然

View File

@@ -10,9 +10,17 @@
**便捷起见,以下内容对 `Nonebot2` 会被称为 `nonebot`,与 `Nonebot2` 交互的机器人实现会被称为 `协议端`**。 **便捷起见,以下内容对 `Nonebot2` 会被称为 `nonebot`,与 `Nonebot2` 交互的机器人实现会被称为 `协议端`**。
在实际应用中,`nonebot` 会充当一个高性能,轻量级的 Python 微服务框架。协议端可以通过 `http`, `websocket` 等方式与之通信,这个通信往往是双向的:一方面,协议端可以上报数据给 `nonebot``nonebot` 会处理数据并返回响应给协议端;另一方面,`nonebot` 可以主动推送数据给协议端。而 `nonebot` 便是围绕上述的双向通信进行工作的。 在实际应用中,`nonebot` 会充当一个高性能,轻量级的 Python 微服务框架。协议端可以通过 `http`, `websocket` 等方式与之通信,这个通信往往是双向的:一方面,协议端可以上报数据给 `nonebot``nonebot` 会处理数据并返回响应给协议端;另一方面,`nonebot` 可以主动推送数据给协议端。而 `nonebot` 便是围绕双向通信进行工作的。
在开始工作之前,`nonebot` 会依照**配置文件或初始化配置**启动,并会注册**协议适配器** `adapter`,之后便会加载**插件** 随后,倘若一个协议端与 `nonebot` 进行了连接,`nonebot` 的后端驱动 `driver` 就会将 `adapter` 实例化为 `bot``nonebot` 便会利用 `bot` 开始工作,它的工作内容分为两个方面 在开始工作之前,`nonebot` 需要进行准备工作
1. **运行 `nonebot.init` 初始化函数**,它会读取配置文件,并初始化 `nonebot` 和后端驱动 `driver` 对象。
2. **注册协议适配器 `adapter`**
3. **加载插件**
准备工作完成后,`nonebot` 会利用 `uvicorn` 启动,并运行 `on_startup` 钩子函数。
随后,倘若一个协议端与 `nonebot` 进行了连接,`nonebot` 的后端驱动 `driver` 就会将 `adapter` 实例化为 `bot``nonebot` 便会利用 `bot` 开始工作,它的工作内容分为两个方面:
1. **事件处理**`bot` 会将协议端上报的数据转化为 `事件`(`Event`),之后 `nonebot` 会根据一套既定流程来处理 `事件` 1. **事件处理**`bot` 会将协议端上报的数据转化为 `事件`(`Event`),之后 `nonebot` 会根据一套既定流程来处理 `事件`
@@ -41,7 +49,7 @@
1. 协议端会通过 `websocket` 或者 `http` 等方式与 `nonebot` 的后端驱动 `driver` 连接,`driver` 会根据之前注册的 `adapter` 和配置文件的内容来进行鉴权,从而获得这个连接的唯一识别 id `self-id`,随后 `adapter` 就会利用 `self-id` 实例化为 `bot` 对象。 1. 协议端会通过 `websocket` 或者 `http` 等方式与 `nonebot` 的后端驱动 `driver` 连接,`driver` 会根据之前注册的 `adapter` 和配置文件的内容来进行鉴权,从而获得这个连接的唯一识别 id `self-id`,随后 `adapter` 就会利用 `self-id` 实例化为 `bot` 对象。
::: tip ::: tip
需要注意的是,如果协议端通过 `websocket``nonebot` 连接,这个步骤只会在建立连接时进行;通过 `http` 方式连接时,会在协议端每次上报数据时都进行这个步骤。 需要注意的是,如果协议端通过 `websocket``nonebot` 连接,这个步骤只会在建立连接时进行,并在之后运行 `on_bot_connect` 钩子函数;通过 `http` 方式连接时,会在协议端每次上报数据时都进行这个步骤。
::: :::
::: warning ::: warning
@@ -142,7 +150,7 @@
这个异常可以在 `handler` 中由 `Matcher.reject` 抛出。 这个异常可以在 `handler` 中由 `Matcher.reject` 抛出。
`nonebot` 捕获到它时,会停止运行当前 `handler` 并结束当前 `matcher` 的运行,并将**当前 handler 和后续 `handler`**交给一个临时 `Matcher` 来响应当前交互用户的下一个消息事件,当临时 `Matcher` 响应时,临时 `Matcher` 会运行当前 `handler` 和后续的 `handler` `nonebot` 捕获到它时,会停止运行当前 `handler` 并结束当前 `matcher` 的运行,并将当前 handler 和后续 `handler` 交给一个临时 `Matcher` 来响应当前交互用户的下一个消息事件,当临时 `Matcher` 响应时,临时 `Matcher` 会运行当前 `handler` 和后续的 `handler`
4. **FinishedException** 4. **FinishedException**
@@ -158,7 +166,7 @@
## 调用 API ## 调用 API
`nonebot` 可以通过 `bot` 来调用 APIAPI 可以向协议端发送数据,也可以向协议端请求更多的数据。 `nonebot` 可以通过 `bot` 来调用 `API` `API` 可以向协议端发送数据,也可以向协议端请求更多的数据。
::: tip ::: tip
不同 `adapter` 规定了不同的 API对应的 API 列表请参照协议规范。 不同 `adapter` 规定了不同的 API对应的 API 列表请参照协议规范。

View File

@@ -0,0 +1,163 @@
# 钩子函数
[`钩子编程`](https://zh.wikipedia.org/wiki/%E9%92%A9%E5%AD%90%E7%BC%96%E7%A8%8B)
> 钩子编程hooking也称作“挂钩”是计算机程序设计术语指通过拦截软件模块间的函数调用、消息传递、事件传递来修改或扩展操作系统、应用程序或其他软件组件的行为的各种技术。处理被拦截的函数调用、事件、消息的代码被称为钩子hook
`nonebot2` 中有一系列预定义的钩子函数,分为两类:`全局钩子函数``事件钩子函数` ,这些钩子函数可以用装饰器的形式来使用。
## 全局钩子函数
全局钩子函数是指 `nonebot2` 针对其本身运行过程的钩子函数。
这些钩子函数是由其后端驱动 `driver`来运行的,故需要先获得全局 `driver` 对象:
```python
from nonebot import get_driver
driver=get_driver()
```
共分为六种函数:
### 启动准备
这个钩子函数会在 `nonebot2` 启动时运行。
```python
@driver.on_startup
async def do_something():
pass
```
### 终止处理
这个钩子函数会在 `nonebot2` 终止时运行。
```python
@driver.on_shutdown
async def do_something():
pass
```
### bot 连接处理
这个钩子函数会在 `bot` 通过 `websocket` 连接到 `nonebot2` 时运行。
```python
@driver.on_bot_connect
async def do_something(bot: Bot):
pass
```
### bot 断开处理
这个钩子函数会在 `bot` 断开与 `nonebot2``websocket` 连接时运行。
```python
@driver.on_bot_disconnect
async def do_something(bot: Bot):
pass
```
### bot api 调用钩子
这个钩子函数会在 `Bot` 调用 API 时运行。
```python
from nonebot.adapters import Bot
@Bot.on_calling_api
async def handle_api_call(bot: Bot, api: str, data: Dict[str, Any]):
pass
```
### bot api 调用后钩子
这个钩子函数会在 `Bot` 调用 API 后运行。
```python
from nonebot.adapters import Bot
@Bot.on_called_api
async def handle_api_result(bot: Bot, exception: Optional[Exception], api: str, data: Dict[str, Any], result: Any):
pass
```
## 事件处理钩子
这些钩子函数指的是影响 `nonebot2` 进行 `事件处理` 的函数。
:::tip 提示
关于 `事件处理` 的流程,可以在[这里](./README)查阅。
:::
:::warning 注意
1.在事件处理钩子函数中,与 `matcher` 运行状态相关的函数将不可用,如 `matcher.finish()`
2.如果需要在事件处理钩子函数中打断整个对话的执行,请参考以下范例:
```python
from nonebot.exception import IgnoredException
@event_preprocessor
async def do_something(bot: Bot, event: Event, state: T_State):
raise IgnoredException("reason")
```
:::
共分为四种函数:
### 事件预处理
这个钩子函数会在 `Event` 上报到 `nonebot2` 时运行
```python
from nonebot.message import event_preprocessor
@event_preprocessor
async def do_something(bot: Bot, event: Event, state: T_State):
pass
```
### 事件后处理
这个钩子函数会在 `nonebot2` 处理 `Event` 后运行
```python
from nonebot.message import event_postprocessor
@event_postprocessor
async def do_something(bot: Bot, event: Event, state: T_State):
pass
```
### 运行预处理
这个钩子函数会在 `nonebot2`运行 `matcher` 前运行。
```python
from nonebot.message import run_preprocessor
@run_preprocessor
async def do_something(matcher: Matcher, bot: Bot, event: Event, state: T_State):
pass
```
### 运行后处理
这个钩子函数会在 `nonebot2`运行 `matcher` 后运行。
```python
from nonebot.message import run_postprocessor
@run_postprocessor
async def do_something(matcher: Matcher, exception: Optional[Exception], bot: Bot, event: Event, state: T_State):
pass
```

View File

@@ -6,9 +6,9 @@
## 从 NoneBot v1 迁移 ## 从 NoneBot v1 迁移
`APScheduler` 作为 `nonebot` v1 的可选依赖,为众多 bot 提供了方便的定时任务功能。`nonebot2` 已将 `APScheduler` 独立为 `nonebot_plugin_apscheduler` 插件,你可以在 [插件广场](https://v2.nonebot.dev/plugin-store.html) 中找到它。 `APScheduler` 作为 `nonebot` v1 的可选依赖,为众多 bot 提供了方便的定时任务功能。`nonebot2` 已将 `APScheduler` 独立为 `nonebot_plugin_apscheduler` 插件,你可以在 [插件广场](https://v2.nonebot.dev/store.html) 中找到它。
相比于 `nonebot` v1 ,只需要安装插件并修改 `scheduler` 的导入方式即可完成迁移。 相比于 `nonebot` v1`nonebot` v2 只需要安装插件并修改 `scheduler` 的导入方式即可完成迁移。
## 安装插件 ## 安装插件

View File

@@ -19,6 +19,9 @@
* [nonebot.matcher](matcher.html) * [nonebot.matcher](matcher.html)
* [nonebot.handler](handler.html)
* [nonebot.rule](rule.html) * [nonebot.rule](rule.html)

View File

@@ -27,6 +27,36 @@ Driver 对象
Config 配置对象 Config 配置对象
### `_calling_api_hook`
* **类型**
`Set[T_CallingAPIHook]`
* **说明**
call_api 时执行的函数
### `_called_api_hook`
* **类型**
`Set[T_CalledAPIHook]`
* **说明**
call_api 后执行的函数
### _abstract_ `__init__(connection_type, self_id, *, websocket=None)` ### _abstract_ `__init__(connection_type, self_id, *, websocket=None)`
@@ -93,7 +123,7 @@ Adapter 类型
* `headers: dict`: 请求头 * `headers: dict`: 请求头
* `body: Optional[dict]`: 请求数据WebSocket 连接该部分为 * `body: Optional[bytes]`: 请求数据WebSocket 连接该部分为 None
@@ -127,7 +157,26 @@ Adapter 类型
### _abstract async_ `call_api(api, **data)` ### _abstract async_ `_call_api(api, **data)`
* **说明**
`adapter` 实际调用 api 的逻辑实现函数,实现该方法以调用 api。
* **参数**
* `api: str`: API 名称
* `**data`: API 数据
### _async_ `call_api(api, **data)`
* **说明** * **说明**
@@ -142,6 +191,9 @@ Adapter 类型
* `api: str`: API 名称 * `api: str`: API 名称
* `self_id: Optional[str]`: 指定调用 API 的机器人
* `**data`: API 数据 * `**data`: API 数据

View File

@@ -129,6 +129,9 @@ sidebarDepth: 0
* `api: str`: API 名称 * `api: str`: API 名称
* `event: Optional[MessageEvent]`: Event 对象
* `**data: Any`: API 参数 * `**data: Any`: API 参数
@@ -150,7 +153,7 @@ sidebarDepth: 0
### _async_ `send(event, message, at_sender=False, **kwargs)` ### _async_ `send(event, message, at_sender=False, webhook=None, secret=None, **kwargs)`
* **说明** * **说明**
@@ -171,6 +174,12 @@ sidebarDepth: 0
* `at_sender: bool`: 是否 @ 事件主体 * `at_sender: bool`: 是否 @ 事件主体
* `webhook: Optional[str]`: 该条消息将调用的 webhook 地址。不传则将使用 sessionWebhook若其也不存在该条消息不发送使用自定义 webhook 时注意你设置的安全方式如加关键词IP地址加签等等。
* `secret: Optional[str]`: 如果你使用自定义的 webhook 地址,推荐使用加签方式对消息进行验证,将 机器人安全设置页面加签一栏下面显示的SEC开头的字符串 传入这个参数即可。
* `**kwargs`: 覆盖默认参数 * `**kwargs`: 覆盖默认参数

View File

@@ -28,7 +28,7 @@ FastAPI 驱动框架设置,详情参考 FastAPI 文档
* **说明** * **说明**
openapi.json 地址,默认为 None 即关闭 `openapi.json` 地址,默认为 `None` 即关闭
@@ -43,7 +43,7 @@ FastAPI 驱动框架设置,详情参考 FastAPI 文档
* **说明** * **说明**
swagger 地址,默认为 None 即关闭 `swagger` 地址,默认为 `None` 即关闭
@@ -58,7 +58,22 @@ FastAPI 驱动框架设置,详情参考 FastAPI 文档
* **说明** * **说明**
redoc 地址,默认为 None 即关闭 `redoc` 地址,默认为 `None` 即关闭
### `fastapi_reload_dirs`
* **类型**
`List[str]`
* **说明**
`debug` 模式下重载监控文件夹列表,默认为 uvicorn 默认值

View File

@@ -0,0 +1,111 @@
---
contentSidebar: true
sidebarDepth: 0
---
# NoneBot.handler 模块
## 事件处理函数
该模块实现事件处理函数的封装,以实现动态参数等功能。
## _class_ `Handler`
基类:`object`
事件处理函数类
### `__init__(func)`
装饰事件处理函数以便根据动态参数运行
### `func`
* **类型**
`T_Handler`
* **说明**
事件处理函数
### `signature`
* **类型**
`inspect.Signature`
* **说明**
事件处理函数签名
### _property_ `bot_type`
* **类型**
`Union[Type["Bot"], inspect.Parameter.empty]`
* **说明**
事件处理函数接受的 Bot 对象类型
### _property_ `event_type`
* **类型**
`Optional[Union[Type[Event], inspect.Parameter.empty]]`
* **说明**
事件处理函数接受的 event 类型 / 不需要 event 参数
### _property_ `state_type`
* **类型**
`Optional[Union[T_State, inspect.Parameter.empty]]`
* **说明**
事件处理函数是否接受 state 参数
### _property_ `matcher_type`
* **类型**
`Optional[Union[Type["Matcher"], inspect.Parameter.empty]]`
* **说明**
事件处理函数是否接受 matcher 参数

View File

@@ -7,7 +7,7 @@ sidebarDepth: 0
## 事件响应器 ## 事件响应器
该模块实现事件响应器的创建与运行,并提供一些快捷方法来帮助用户更好的与机器人进行 对话 。 该模块实现事件响应器的创建与运行,并提供一些快捷方法来帮助用户更好的与机器人进行对话 。
## `matchers` ## `matchers`
@@ -202,7 +202,7 @@ sidebarDepth: 0
* **类型** * **类型**
`Optional[T_ArgsParser]` `Optional[T_TypeUpdater]`
@@ -217,7 +217,7 @@ sidebarDepth: 0
* **类型** * **类型**
`Optional[T_ArgsParser]` `Optional[T_PermissionUpdater]`
@@ -237,7 +237,7 @@ sidebarDepth: 0
* **类型** * **类型**
`List[T_Handler]` `List[Handler]`

View File

@@ -25,38 +25,6 @@ sidebarDepth: 0
## _class_ `Export`
基类:`dict`
* **说明**
插件导出内容以使得其他插件可以获得。
* **示例**
```python
nonebot.export().default = "bar"
@nonebot.export()
def some_function():
pass
# this doesn't work before python 3.9
# use
# export = nonebot.export(); @export.sub
# instead
# See also PEP-614: https://www.python.org/dev/peps/pep-0614/
@nonebot.export().sub
def something_else():
pass
```
## _class_ `Plugin` ## _class_ `Plugin`
基类:`object` 基类:`object`
@@ -82,15 +50,6 @@ def something_else():
* **说明**: 插件模块对象 * **说明**: 插件模块对象
### `matcher`
* **类型**: `Set[Type[Matcher]]`
* **说明**: 插件内定义的 `Matcher`
### `export` ### `export`
@@ -100,6 +59,15 @@ def something_else():
* **说明**: 插件内定义的导出内容 * **说明**: 插件内定义的导出内容
### _property_ `matcher`
* **类型**: `Set[Type[Matcher]]`
* **说明**: 插件内定义的 `Matcher`
## `on(type='', rule=None, permission=None, *, handlers=None, temp=False, priority=1, block=False, state=None, state_factory=None)` ## `on(type='', rule=None, permission=None, *, handlers=None, temp=False, priority=1, block=False, state=None, state_factory=None)`
@@ -121,7 +89,7 @@ def something_else():
* `permission: Optional[Permission]`: 事件响应权限 * `permission: Optional[Permission]`: 事件响应权限
* `handlers: Optional[List[T_Handler]]`: 事件处理函数列表 * `handlers: Optional[List[Union[T_Handler, Handler]]]`: 事件处理函数列表
* `temp: bool`: 是否为临时事件响应器(仅执行一次) * `temp: bool`: 是否为临时事件响应器(仅执行一次)
@@ -162,7 +130,7 @@ def something_else():
* `rule: Optional[Union[Rule, T_RuleChecker]]`: 事件响应规则 * `rule: Optional[Union[Rule, T_RuleChecker]]`: 事件响应规则
* `handlers: Optional[List[T_Handler]]`: 事件处理函数列表 * `handlers: Optional[List[Union[T_Handler, Handler]]]`: 事件处理函数列表
* `temp: bool`: 是否为临时事件响应器(仅执行一次) * `temp: bool`: 是否为临时事件响应器(仅执行一次)
@@ -206,7 +174,7 @@ def something_else():
* `permission: Optional[Permission]`: 事件响应权限 * `permission: Optional[Permission]`: 事件响应权限
* `handlers: Optional[List[T_Handler]]`: 事件处理函数列表 * `handlers: Optional[List[Union[T_Handler, Handler]]]`: 事件处理函数列表
* `temp: bool`: 是否为临时事件响应器(仅执行一次) * `temp: bool`: 是否为临时事件响应器(仅执行一次)
@@ -247,7 +215,7 @@ def something_else():
* `rule: Optional[Union[Rule, T_RuleChecker]]`: 事件响应规则 * `rule: Optional[Union[Rule, T_RuleChecker]]`: 事件响应规则
* `handlers: Optional[List[T_Handler]]`: 事件处理函数列表 * `handlers: Optional[List[Union[T_Handler, Handler]]]`: 事件处理函数列表
* `temp: bool`: 是否为临时事件响应器(仅执行一次) * `temp: bool`: 是否为临时事件响应器(仅执行一次)
@@ -288,7 +256,7 @@ def something_else():
* `rule: Optional[Union[Rule, T_RuleChecker]]`: 事件响应规则 * `rule: Optional[Union[Rule, T_RuleChecker]]`: 事件响应规则
* `handlers: Optional[List[T_Handler]]`: 事件处理函数列表 * `handlers: Optional[List[Union[T_Handler, Handler]]]`: 事件处理函数列表
* `temp: bool`: 是否为临时事件响应器(仅执行一次) * `temp: bool`: 是否为临时事件响应器(仅执行一次)
@@ -335,7 +303,7 @@ def something_else():
* `permission: Optional[Permission]`: 事件响应权限 * `permission: Optional[Permission]`: 事件响应权限
* `handlers: Optional[List[T_Handler]]`: 事件处理函数列表 * `handlers: Optional[List[Union[T_Handler, Handler]]]`: 事件处理函数列表
* `temp: bool`: 是否为临时事件响应器(仅执行一次) * `temp: bool`: 是否为临时事件响应器(仅执行一次)
@@ -382,7 +350,7 @@ def something_else():
* `permission: Optional[Permission]`: 事件响应权限 * `permission: Optional[Permission]`: 事件响应权限
* `handlers: Optional[List[T_Handler]]`: 事件处理函数列表 * `handlers: Optional[List[Union[T_Handler, Handler]]]`: 事件处理函数列表
* `temp: bool`: 是否为临时事件响应器(仅执行一次) * `temp: bool`: 是否为临时事件响应器(仅执行一次)
@@ -429,7 +397,7 @@ def something_else():
* `permission: Optional[Permission]`: 事件响应权限 * `permission: Optional[Permission]`: 事件响应权限
* `handlers: Optional[List[T_Handler]]`: 事件处理函数列表 * `handlers: Optional[List[Union[T_Handler, Handler]]]`: 事件处理函数列表
* `temp: bool`: 是否为临时事件响应器(仅执行一次) * `temp: bool`: 是否为临时事件响应器(仅执行一次)
@@ -481,7 +449,7 @@ def something_else():
* `permission: Optional[Permission]`: 事件响应权限 * `permission: Optional[Permission]`: 事件响应权限
* `handlers: Optional[List[T_Handler]]`: 事件处理函数列表 * `handlers: Optional[List[Union[T_Handler, Handler]]]`: 事件处理函数列表
* `temp: bool`: 是否为临时事件响应器(仅执行一次) * `temp: bool`: 是否为临时事件响应器(仅执行一次)
@@ -538,7 +506,7 @@ def something_else():
* `permission: Optional[Permission]`: 事件响应权限 * `permission: Optional[Permission]`: 事件响应权限
* `handlers: Optional[List[T_Handler]]`: 事件处理函数列表 * `handlers: Optional[List[Union[T_Handler, Handler]]]`: 事件处理函数列表
* `temp: bool`: 是否为临时事件响应器(仅执行一次) * `temp: bool`: 是否为临时事件响应器(仅执行一次)
@@ -590,7 +558,7 @@ def something_else():
* `permission: Optional[Permission]`: 事件响应权限 * `permission: Optional[Permission]`: 事件响应权限
* `handlers: Optional[List[T_Handler]]`: 事件处理函数列表 * `handlers: Optional[List[Union[T_Handler, Handler]]]`: 事件处理函数列表
* `temp: bool`: 是否为临时事件响应器(仅执行一次) * `temp: bool`: 是否为临时事件响应器(仅执行一次)
@@ -767,7 +735,7 @@ def something_else():
* `permission: Optional[Permission]`: 事件响应权限 * `permission: Optional[Permission]`: 事件响应权限
* `handlers: Optional[List[T_Handler]]`: 事件处理函数列表 * `handlers: Optional[List[Union[T_Handler, Handler]]]`: 事件处理函数列表
* `temp: bool`: 是否为临时事件响应器(仅执行一次) * `temp: bool`: 是否为临时事件响应器(仅执行一次)
@@ -808,7 +776,7 @@ def something_else():
* `rule: Optional[Union[Rule, T_RuleChecker]]`: 事件响应规则 * `rule: Optional[Union[Rule, T_RuleChecker]]`: 事件响应规则
* `handlers: Optional[List[T_Handler]]`: 事件处理函数列表 * `handlers: Optional[List[Union[T_Handler, Handler]]]`: 事件处理函数列表
* `temp: bool`: 是否为临时事件响应器(仅执行一次) * `temp: bool`: 是否为临时事件响应器(仅执行一次)
@@ -852,7 +820,7 @@ def something_else():
* `permission: Optional[Permission]`: 事件响应权限 * `permission: Optional[Permission]`: 事件响应权限
* `handlers: Optional[List[T_Handler]]`: 事件处理函数列表 * `handlers: Optional[List[Union[T_Handler, Handler]]]`: 事件处理函数列表
* `temp: bool`: 是否为临时事件响应器(仅执行一次) * `temp: bool`: 是否为临时事件响应器(仅执行一次)
@@ -893,7 +861,7 @@ def something_else():
* `rule: Optional[Union[Rule, T_RuleChecker]]`: 事件响应规则 * `rule: Optional[Union[Rule, T_RuleChecker]]`: 事件响应规则
* `handlers: Optional[List[T_Handler]]`: 事件处理函数列表 * `handlers: Optional[List[Union[T_Handler, Handler]]]`: 事件处理函数列表
* `temp: bool`: 是否为临时事件响应器(仅执行一次) * `temp: bool`: 是否为临时事件响应器(仅执行一次)
@@ -934,7 +902,7 @@ def something_else():
* `rule: Optional[Union[Rule, T_RuleChecker]]`: 事件响应规则 * `rule: Optional[Union[Rule, T_RuleChecker]]`: 事件响应规则
* `handlers: Optional[List[T_Handler]]`: 事件处理函数列表 * `handlers: Optional[List[Union[T_Handler, Handler]]]`: 事件处理函数列表
* `temp: bool`: 是否为临时事件响应器(仅执行一次) * `temp: bool`: 是否为临时事件响应器(仅执行一次)
@@ -981,7 +949,7 @@ def something_else():
* `permission: Optional[Permission]`: 事件响应权限 * `permission: Optional[Permission]`: 事件响应权限
* `handlers: Optional[List[T_Handler]]`: 事件处理函数列表 * `handlers: Optional[List[Union[T_Handler, Handler]]]`: 事件处理函数列表
* `temp: bool`: 是否为临时事件响应器(仅执行一次) * `temp: bool`: 是否为临时事件响应器(仅执行一次)
@@ -1028,7 +996,7 @@ def something_else():
* `permission: Optional[Permission]`: 事件响应权限 * `permission: Optional[Permission]`: 事件响应权限
* `handlers: Optional[List[T_Handler]]`: 事件处理函数列表 * `handlers: Optional[List[Union[T_Handler, Handler]]]`: 事件处理函数列表
* `temp: bool`: 是否为临时事件响应器(仅执行一次) * `temp: bool`: 是否为临时事件响应器(仅执行一次)
@@ -1075,7 +1043,7 @@ def something_else():
* `permission: Optional[Permission]`: 事件响应权限 * `permission: Optional[Permission]`: 事件响应权限
* `handlers: Optional[List[T_Handler]]`: 事件处理函数列表 * `handlers: Optional[List[Union[T_Handler, Handler]]]`: 事件处理函数列表
* `temp: bool`: 是否为临时事件响应器(仅执行一次) * `temp: bool`: 是否为临时事件响应器(仅执行一次)
@@ -1127,7 +1095,7 @@ def something_else():
* `permission: Optional[Permission]`: 事件响应权限 * `permission: Optional[Permission]`: 事件响应权限
* `handlers: Optional[List[T_Handler]]`: 事件处理函数列表 * `handlers: Optional[List[Union[T_Handler, Handler]]]`: 事件处理函数列表
* `temp: bool`: 是否为临时事件响应器(仅执行一次) * `temp: bool`: 是否为临时事件响应器(仅执行一次)
@@ -1184,7 +1152,7 @@ def something_else():
* `permission: Optional[Permission]`: 事件响应权限 * `permission: Optional[Permission]`: 事件响应权限
* `handlers: Optional[List[T_Handler]]`: 事件处理函数列表 * `handlers: Optional[List[Union[T_Handler, Handler]]]`: 事件处理函数列表
* `temp: bool`: 是否为临时事件响应器(仅执行一次) * `temp: bool`: 是否为临时事件响应器(仅执行一次)
@@ -1236,7 +1204,7 @@ def something_else():
* `permission: Optional[Permission]`: 事件响应权限 * `permission: Optional[Permission]`: 事件响应权限
* `handlers: Optional[List[T_Handler]]`: 事件处理函数列表 * `handlers: Optional[List[Union[T_Handler, Handler]]]`: 事件处理函数列表
* `temp: bool`: 是否为临时事件响应器(仅执行一次) * `temp: bool`: 是否为临时事件响应器(仅执行一次)
@@ -1442,22 +1410,6 @@ def something_else():
## `export()`
* **说明**
获取插件的导出内容对象
* **返回**
* `Export`
## `require(name)` ## `require(name)`
@@ -1478,3 +1430,51 @@ def something_else():
* `Optional[Export]` * `Optional[Export]`
## _class_ `Export`
基类:`dict`
* **说明**
插件导出内容以使得其他插件可以获得。
* **示例**
```python
nonebot.export().default = "bar"
@nonebot.export()
def some_function():
pass
# this doesn't work before python 3.9
# use
# export = nonebot.export(); @export.sub
# instead
# See also PEP-614: https://www.python.org/dev/peps/pep-0614/
@nonebot.export().sub
def something_else():
pass
```
## `export()`
* **说明**
获取插件的导出内容对象
* **返回**
* `Export`

View File

@@ -78,6 +78,38 @@ sidebarDepth: 0
## `T_CallingAPIHook`
* **类型**
`Callable[[Bot, str, Dict[str, Any]], Awaitable[None]]`
* **说明**
`bot.call_api` 时执行的函数
## `T_CalledAPIHook`
* **类型**
`Callable[[Bot, Optional[Exception], str, Dict[str, Any], Any], Awaitable[None]]`
* **说明**
`bot.call_api` 后执行的函数,参数分别为 bot, exception, api, data, result
## `T_EventPreProcessor` ## `T_EventPreProcessor`

View File

@@ -1,5 +1,11 @@
# CQHTTP 协议使用指南 # CQHTTP 协议使用指南
## 安装 NoneBot CQHTTP 适配器
```bash
pip install nonebot-adapter-cqhttp
```
## 配置 CQHTTP 协议端(以 QQ 为例) ## 配置 CQHTTP 协议端(以 QQ 为例)
单纯运行 NoneBot 实例并不会产生任何效果,因为此刻 QQ 这边还不知道 NoneBot 的存在,也就无法把消息发送给它,因此现在需要使用一个无头 QQ 来把消息等事件上报给 NoneBot。 单纯运行 NoneBot 实例并不会产生任何效果,因为此刻 QQ 这边还不知道 NoneBot 的存在,也就无法把消息发送给它,因此现在需要使用一个无头 QQ 来把消息等事件上报给 NoneBot。

View File

@@ -11,6 +11,16 @@
- [群机器人概述](https://developers.dingtalk.com/document/app/overview-of-group-robots) - [群机器人概述](https://developers.dingtalk.com/document/app/overview-of-group-robots)
- [开发企业内部机器人](https://developers.dingtalk.com/document/app/develop-enterprise-internal-robots) - [开发企业内部机器人](https://developers.dingtalk.com/document/app/develop-enterprise-internal-robots)
钉钉官方机器人教程Java
- [开发一个钉钉机器人](https://developers.dingtalk.com/document/tutorial/create-a-robot)
## 安装 NoneBot 钉钉 适配器
```bash
pip install nonebot-adapter-ding
```
## 关于 DingAdapter 的说明 ## 关于 DingAdapter 的说明
你需要显式的注册 ding 这个适配器: 你需要显式的注册 ding 这个适配器:
@@ -87,6 +97,58 @@ async def raw_handler(bot: DingBot, event: MessageEvent):
其他消息格式请查看 [钉钉适配器的 MessageSegment](https://github.com/nonebot/nonebot2/blob/dev/nonebot/adapters/ding/message.py#L8),里面封装了很多有关消息的方法,比如 `code``image``feedCard` 等。 其他消息格式请查看 [钉钉适配器的 MessageSegment](https://github.com/nonebot/nonebot2/blob/dev/nonebot/adapters/ding/message.py#L8),里面封装了很多有关消息的方法,比如 `code``image``feedCard` 等。
## 发送到特定群聊
钉钉也支持通过 Webhook 的方式直接将消息推送到某个群聊([参考链接](https://developers.dingtalk.com/document/app/custom-robot-access/title-zob-eyu-qse)),你可以在机器人的设置中看到当前群的 Webhook 地址。
![机器人所在群的 Webhook 地址](./images/ding/webhook.png)
获取到Webhook地址后用户可以向这个地址发起HTTP POST 请求,即可实现给该钉钉群发送消息。
对于这种通过 Webhook 推送的消息钉钉需要开发者进行安全方面的设置目前有3种安全设置方式请根据需要选择一种如下
1. **自定义关键词:** 最多可以设置10个关键词消息中至少包含其中1个关键词才可以发送成功。
例如添加了一个自定义关键词:监控报警,则这个机器人所发送的消息,必须包含监控报警这个词,才能发送成功。
2. **加签:** 发送请求时带上验签的值,可以在机器人设置里看到密钥。
![加签密钥](./images/ding/jiaqian.png)
3. **IP地址** 设定后只有来自IP地址范围内的请求才会被正常处理。支持两种设置方式IP地址和IP地址段暂不支持IPv6地址白名单。
如果你选择 1/3 两种安全设置,你需要自己确认当前网络和发送的消息能被钉钉接受,然后使用 `bot.send` 的时候将 webhook 地址传入 webhook 参数即可。
如我设置了 `打卡` 为关键词:
```python
message = MessageSegment.text("打卡成功XXXXXX")
await hello.send(
message,
webhook=
"https://oapi.dingtalk.com/robot/send?access_token=XXXXXXXXXXXXXX",
)
```
对于第二种加签方式,你可以在 `bot.send` 的时候把 `secret` 参数传进去Nonebot 内部会自动帮你计算发送该消息的签名并发送,如:
这里的 `secret` 参数就是加签选项给出的那个密钥。
```python
message = MessageSegment.raw({
"msgtype": "text",
"text": {
"content": 'hello from webhook,一定要注意安全方式的鉴权哦,否则可能发送失败的'
},
})
message += MessageSegment.atDingtalkIds(event.senderId)
await hello.send(
message,
webhook="https://oapi.dingtalk.com/robot/send?access_token=XXXXXXXXXXXXXX",
secret="SECXXXXXXXXXXXXXXXXXXXXXXXXX",
)
```
然后就可以发送成功了。
![测试 Webhook 发送](images/ding/test_webhook.png)
## 创建机器人并连接 ## 创建机器人并连接
在钉钉官方文档 [「开发企业内部机器人 -> 步骤一:创建机器人应用」](https://developers.dingtalk.com/document/app/develop-enterprise-internal-robots/title-ufs-4gh-poh) 中有详细介绍,这里就省去创建的步骤,介绍一下如何连接上程序。 在钉钉官方文档 [「开发企业内部机器人 -> 步骤一:创建机器人应用」](https://developers.dingtalk.com/document/app/develop-enterprise-internal-robots/title-ufs-4gh-poh) 中有详细介绍,这里就省去创建的步骤,介绍一下如何连接上程序。

View File

@@ -4,6 +4,5 @@
- 请千万注意事件处理器的优先级设定 - 请千万注意事件处理器的优先级设定
- 在匹配规则中请勿使用耗时极长的函数 - 在匹配规则中请勿使用耗时极长的函数
- 同一个用户可以**跨群**(**私聊**)继续他的事件处理(除非做出权限限制,将在后续介绍)
如果「指南」还不能满足你,前往 [进阶](../advanced/README.md) 查看更多的功能信息。 如果「指南」还不能满足你,前往 [进阶](../advanced/README.md) 查看更多的功能信息。

View File

Before

Width:  |  Height:  |  Size: 124 KiB

After

Width:  |  Height:  |  Size: 124 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 100 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 75 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 100 KiB

View File

@@ -1,6 +1,6 @@
# 安装 # 安装
## NoneBot ## 安装 NoneBot
:::warning 注意 :::warning 注意
请确保你的 Python 版本 >= 3.7。 请确保你的 Python 版本 >= 3.7。
@@ -67,15 +67,23 @@ poetry install --no-dev # 推荐
pip install . # 不推荐 pip install . # 不推荐
``` ```
## 安装适配器
适配器可以通过 `nb-cli` 在创建项目时根据你的选择自动安装,也可以自行使用 `pip` 安装
```bash
pip install nonebot-adapter-<adapter-name>
```
```bash
# 列出所有的适配器
nb adapter list
```
## 安装插件 ## 安装插件
插件可以通过 `nb-cli` 进行安装,也可以自行安装并加载插件。 插件可以通过 `nb-cli` 进行安装,也可以自行安装并加载插件。
:::warning 注意
如果你想直接从nb-cli安装插件请确保你的当前目录中含有能正常工作的bot.py
安装完成后请重启当前bot.py(假如你在运行它的话)。
:::
```bash ```bash
# 列出所有的插件 # 列出所有的插件
nb plugin list nb plugin list
@@ -92,6 +100,7 @@ nb plugin install xxx
- [NoneBot-Plugin-Docs](https://github.com/nonebot/nonebot2/tree/master/packages/nonebot-plugin-docs) 离线文档插件 - [NoneBot-Plugin-Docs](https://github.com/nonebot/nonebot2/tree/master/packages/nonebot-plugin-docs) 离线文档插件
- [NoneBot-Plugin-Test](https://github.com/nonebot/plugin-test) 本地机器人测试前端插件 - [NoneBot-Plugin-Test](https://github.com/nonebot/plugin-test) 本地机器人测试前端插件
- [NoneBot-Plugin-APScheduler](https://github.com/nonebot/plugin-apscheduler) 定时任务插件 - [NoneBot-Plugin-APScheduler](https://github.com/nonebot/plugin-apscheduler) 定时任务插件
- [NoneBot-Plugin-LocalStore](https://github.com/nonebot/plugin-localstore) 本地数据文件存储插件
- [NoneBot-Plugin-Sentry](https://github.com/cscs181/QQ-GitHub-Bot/tree/master/src/plugins/nonebot_plugin_sentry) Sentry 在线日志分析插件 - [NoneBot-Plugin-Sentry](https://github.com/cscs181/QQ-GitHub-Bot/tree/master/src/plugins/nonebot_plugin_sentry) Sentry 在线日志分析插件
- [NoneBot-Plugin-Status](https://github.com/cscs181/QQ-GitHub-Bot/tree/master/src/plugins/nonebot_plugin_status) 服务器状态查看插件 - [NoneBot-Plugin-Status](https://github.com/cscs181/QQ-GitHub-Bot/tree/master/src/plugins/nonebot_plugin_status) 服务器状态查看插件

View File

@@ -28,6 +28,12 @@ Mirai-API-HTTP 的适配器以 [AGPLv3 许可](https://opensource.org/licenses/A
**为了便捷起见, 以下内容均以缩写 `MAH` 代替 `mirai-api-http`** **为了便捷起见, 以下内容均以缩写 `MAH` 代替 `mirai-api-http`**
## 安装 NoneBot Mirai 适配器
```bash
pip install nonebot-adapter-mirai
```
## 配置 MAH 客户端 ## 配置 MAH 客户端
正如你可能刚刚在[CQHTTP 协议使用指南](./cqhttp-guide.md)中所读到的: 正如你可能刚刚在[CQHTTP 协议使用指南](./cqhttp-guide.md)中所读到的:

View File

@@ -119,6 +119,10 @@
"title": "nonebot.matcher 模块", "title": "nonebot.matcher 模块",
"path": "matcher" "path": "matcher"
}, },
{
"title": "nonebot.handler 模块",
"path": "handler"
},
{ {
"title": "nonebot.rule 模块", "title": "nonebot.rule 模块",
"path": "rule" "path": "rule"

View File

@@ -1,7 +1,7 @@
--- ---
home: true home: true
heroImage: /logo.png heroImage: /logo.png
tagline: An asynchronous QQ bot framework. tagline: 跨平台 Python 异步机器人框架
actionText: 开始使用 actionText: 开始使用
actionLink: guide/ actionLink: guide/
features: features:
@@ -11,5 +11,5 @@ features:
details: 精心设计的消息处理流程使得你可以很方便地将原型扩充为具有大量实用功能的完整聊天机器人,并持续保证扩展性。 details: 精心设计的消息处理流程使得你可以很方便地将原型扩充为具有大量实用功能的完整聊天机器人,并持续保证扩展性。
- title: 高性能 - title: 高性能
details: 采用异步 I/O利用 WebSocket 进行通信,以获得极高的性能;同时,支持使用多账号同时接入,减少业务宕机的可能。 details: 采用异步 I/O利用 WebSocket 进行通信,以获得极高的性能;同时,支持使用多账号同时接入,减少业务宕机的可能。
footer: MIT Licensed | Copyright © 2018 - 2020 NoneBot Team footer: MIT Licensed | Copyright © 2018 - 2021 NoneBot Team
--- ---

View File

@@ -0,0 +1,177 @@
# 深入
## 它如何工作?
如同[概览](../guide/README.md)所言:
> NoneBot2 是一个可扩展的 Python 异步机器人框架,它会对机器人收到的事件进行解析和处理,并以插件化的形式,按优先级分发给事件所对应的事件响应器,来完成具体的功能。
`Nonebot2` 是一个可以对机器人上报的事件进行处理并完成具体功能的机器人框架,在这里,我们将简要讲述它的工作内容。
**便捷起见,以下内容对 `Nonebot2` 会被称为 `nonebot`,与 `Nonebot2` 交互的机器人实现会被称为 `协议端`**
在实际应用中,`nonebot` 会充当一个高性能,轻量级的 Python 微服务框架。协议端可以通过 `http`, `websocket` 等方式与之通信,这个通信往往是双向的:一方面,协议端可以上报数据给 `nonebot``nonebot` 会处理数据并返回响应给协议端;另一方面,`nonebot` 可以主动推送数据给协议端。而 `nonebot` 便是围绕双向通信进行工作的。
在开始工作之前,`nonebot` 需要进行准备工作:
1. **运行 `nonebot.init` 初始化函数**,它会读取配置文件,并初始化 `nonebot` 和后端驱动 `driver` 对象。
2. **注册协议适配器 `adapter`**
3. **加载插件**
准备工作完成后,`nonebot` 会利用 `uvicorn` 启动,并运行 `on_startup` 钩子函数。
随后,倘若一个协议端与 `nonebot` 进行了连接,`nonebot` 的后端驱动 `driver` 就会将 `adapter` 实例化为 `bot``nonebot` 便会利用 `bot` 开始工作,它的工作内容分为两个方面:
1. **事件处理**`bot` 会将协议端上报的数据转化为 `事件`(`Event`),之后 `nonebot` 会根据一套既定流程来处理 `事件`
2. **调用 `API`**, 在**事件处理**的过程中,`nonebot` 可以通过 `bot` 调用协议端指定的 `API` 来获取更多数据,或者反馈响应给协议端; `nonebot` 也可以通过调用 `API` 向协议端主动请求数据或者主动推送数据。
在**指南**模块, 我们已经叙述了[如何配置 nonebot](../guide/basic-configuration.md), [如何注册协议适配器](../guide/getting-started.md)[如何加载插件](../guide/loading-a-plugin.md), 在这里便不再赘述。
下面,我们将对**事件处理** **调用 API**进行说明。
## 事件处理
我们可以先看事件处理的流程图:
![handle-event](../guide/images/Handle-Event.png)
在流程图里,我们可以看到,`nonebot` 会有三个阶段来处理事件:
1. **driver 处理上报数据**
2. **adapter 处理原始数据**
3. **nonebot 处理 Event**
我们将顺序说明这三个阶段。其中,会将第三个阶段拆分成**概念解释****处理 Event****特殊异常处理**三个部分来说明。
### driver 处理上报数据
1. 协议端会通过 `websocket` 或者 `http` 等方式与 `nonebot` 的后端驱动 `driver` 连接,`driver` 会根据之前注册的 `adapter` 和配置文件的内容来进行鉴权,从而获得这个连接的唯一识别 id `self-id`,随后 `adapter` 就会利用 `self-id` 实例化为 `bot` 对象。
::: tip
需要注意的是,如果协议端通过 `websocket``nonebot` 连接,这个步骤只会在建立连接时进行,并在之后运行 `on_bot_connect` 钩子函数;通过 `http` 方式连接时,会在协议端每次上报数据时都进行这个步骤。
:::
::: warning
连接之前必须要注册 `adapter`
:::
::: warning
`self-id` 是帐号的唯一识别 ID这意味着不能出现相同的 `self-id`
:::
2. `driver` 会将接收到的数据转交给 `bot` 对象进一步处理。
### adapter 处理原始数据
1. `bot` 会利用事先定义好的 `Event Model` 对上报的数据进行分析处理,将数据转化为 `nonebot` 可以处理的 `Event` 对象。
::: tip
`adapter` 在转换数据格式的同时可以进行一系列的特殊操作,例如 `CQHTTP` 会对 `reply` 信息进行提取。
:::
2. `Event` 会传入 `nonebot` 做进一步处理。
### nonebot 处理 Event
在讲述这个阶段之前,我们需要先对几个概念进行解释。
#### 概念解释
1. **hook**,或者说**钩子函数**,它们可以在 `nonebot` 处理 `Event` 的不同时刻进行拦截,修改或者扩展,在 `nonebot` 中,钩子函数分为 `事件预处理hook``运行预处理hook``运行后处理hook``事件后处理hook`
::: tip
关于`hook`的更多信息,可以查阅[这里](./runtime-hook.md)
:::
2. **Matcher**与**matcher**,在**指南**中,我们讲述了[如何注册事件响应器](../guide/creating-a-matcher),这里的事件响应器或者说 `Matcher` 并不是一个具体的实例 `instance`,而是一个具有特定属性的类 `class`。只有当 `Matcher` **响应事件**时,才会实例化为具体的 `instance`,也就是 `matcher``matcher` 可以认为是 `nonebot` 处理 `Event` 的基本单位,运行 `matcher``nonebot`工作的主要内容。
3. **handler**,或者说**事件处理函数**, 它们可以认为是 `nonebot` 处理 `Event` 的最小单位。在不考虑 `hook` 的情况下,**运行 matcher 就是顺序运行 matcher.handlers**,这句话换种表达方式就是,`handler` 只有添加到 `matcher.handlers` 时,才可以参与到 `nonebot` 的工作中来。
::: tip
如何让 `handler` 添加到 `matcher.handlers`
一方面,我们可以参照[这里](../guide/creating-a-handler)利用装饰器来添加;另一方面,我们在用 `on()` 或者 `on_*()` 注册事件响应器时,可以添加 `handlers=[handler1, handler2, ...]` 这样的关键词参数来添加。
:::
#### 处理 Event
1. **执行事件预处理 hook** `nonebot` 接收到 `Event` 后,会传入到 `事件预处理hook` 中进行处理。
::: warning
需要注意的是,执行多个 `事件预处理hook` 时并无顺序可言,它们是**并行运行**的。这个原则同样适用于其他的 `hook`
:::
2. **按优先级升序选出同一优先级的 Matcher**`nonebot` 提供了一个全局字典 `matchers`,这个字典的 `key` 是优先级 `priority``value` 是一个 `list`,里面存放着同一优先级的 `Matcher`。在注册 `Matcher` 时,它和优先级 `priority` 会添加到里面。
在执行 `事件预处理hook` 后,`nonebot` 会对 `matchers``key` 升序排序并选择出当前最小优先级的 `Matcher`
3. **根据 Matcher 定义的 Rule, Permission 判断是否运行**,在选出 `Matcher` 后,`nonebot` 会将 `bot``Event` 传入到 `Matcher.check_rule``Matcher.check_perm` 两个函数中,两个函数分别对 Matcher 定义的 Rule, Permission 进行 check当 check 通过后,这个 `Matcher` 就会响应事件。但是当同一个优先级的所有 `Matcher` 均没有响应时,`nonebot` 会返回到上一个步骤,选择出下一优先级的 `Matcher`
4. **实例化 matcher 并执行运行预处理 hook**,当 `Matcher` 响应事件后,它便会实例化为 `matcher`,并执行 `运行预处理hook`
5. **顺序运行 matcher 的所有 handlers**`运行预处理hook` 执行完毕后,便会运行 `matcher`,也就是**顺序运行**它的 `handlers`
::: tip
`matcher` 运行 `handlers` 的顺序是: 先运行该 `matcher` 的类 `Matcher` 注册时添加的 `handlers`(如果有的话),再按照装饰器装饰顺序运行装饰的 `handlers`
:::
6. **执行运行后处理 hook**`matcher``handlers` 运行完毕后,会执行 `运行后处理hook`
7. **判断是否停止事件传播**`nonebot` 会根据当前优先级所有 `matcher``block` 参数或者 `StopPropagation` 异常判断是否停止传播 `Event`,如果事件没有停止传播,`nonebot` 便会返回到第 2 步, 选择出下一优先级的 `Matcher`
8. **执行事件后处理 hook**,在 `Event` 停止传播或执行完所有响应的 `Matcher` 后,`nonebot` 会执行 `事件后处理hook`
`事件后处理hook` 执行完毕后,当前`Event`的处理周期就顺利结束了。
#### 特殊异常处理
在这个阶段,`nonebot` 规定了几个特殊的异常,当 `nonebot` 捕获到它们时,会用特定的行为来处理它们。
1. **IgnoredException**
这个异常可以在 `事件预处理hook``运行预处理hook` 抛出。
`事件预处理hook` 抛出它时,`nonebot` 会忽略当前的 `Event`,不进行处理。
`运行预处理hook` 抛出它时,`nonebot` 会忽略当前的 `matcher`,结束当前 `matcher` 的运行。
::: warning
`hook` 需要抛出这个异常时,要写明原因。
:::
2. **PausedException**
这个异常可以在 `handler` 中由 `Matcher.pause` 抛出。
`nonebot` 捕获到它时,会停止运行当前 `handler` 并结束当前 `matcher` 的运行,并将后续的 `handler` 交给一个临时 `Matcher` 来响应当前交互用户的下一个消息事件,当临时 `Matcher` 响应时,临时 `Matcher` 会运行后续的 handlers。
3. **RejectedException**
这个异常可以在 `handler` 中由 `Matcher.reject` 抛出。
`nonebot` 捕获到它时,会停止运行当前 `handler` 并结束当前 `matcher` 的运行,并将当前 handler 和后续 `handler` 交给一个临时 `Matcher` 来响应当前交互用户的下一个消息事件,当临时 `Matcher` 响应时,临时 `Matcher` 会运行当前 `handler` 和后续的 `handler`
4. **FinishedException**
这个异常可以在 `handler` 中由 `Matcher.finish` 抛出。
`nonebot` 捕获到它时,会停止运行当前 `handler` 并结束当前 `matcher` 的运行。
5. **StopPropagation**
这个异常一般会在执行 `运行后处理hook` 后抛出。
`nonebot` 捕获到它时, 会停止传播当前 `Event`,不再寻找下一优先级的 `Matcher`,直接执行 `事件后处理hook`
## 调用 API
`nonebot` 可以通过 `bot` 来调用 `API` `API` 可以向协议端发送数据,也可以向协议端请求更多的数据。
::: tip
不同 `adapter` 规定了不同的 API对应的 API 列表请参照协议规范。
:::
一般来说,我们可以用 `bot.*` 来调用 `API`(\*是 `API``action` 或者 `endpoint`)。
对于发送消息而言,一方面可以调用既有的 API另一方面 `nonebot` 实现了两个便捷方法,`bot.send(event, message, **kwargs)` 方法和可以在 `handler` 中使用的 `Matcher.send(message, **kwargs)` 方法,来向事件主体发送消息。

View File

@@ -9,7 +9,7 @@
下面将介绍第二种方法—— `export``require` 机制: 下面将介绍第二种方法—— `export``require` 机制:
## 使用 export and require ## 使用 export require
现在,假定有两个插件 `pluginA``pluginB`,需要在 `pluginB` 中调用 `pluginA` 中的一个变量 `varA` 和一个函数 `funcA` 现在,假定有两个插件 `pluginA``pluginB`,需要在 `pluginB` 中调用 `pluginA` 中的一个变量 `varA` 和一个函数 `funcA`

View File

@@ -0,0 +1,64 @@
# 事件处理函数重载
当我们在编写 `nonebot2` 应用时,常常会遇到这样一个问题:该怎么让同一类型的不同事件执行不同的响应逻辑?又或者如何让不同的 `adapter` 针对同一类型的事件作出不同响应?
针对这个问题, `nonebot2` 提供一个便捷而高效的解决方案:事件处理函数重载机制。简单地说,`handler` (事件处理函数) 会根据其参数的 `type hints` ([PEP484 类型标注](https://www.python.org/dev/peps/pep-0484/)) 来对相对应的 `adapter``Event` 进行响应,并且会忽略不符合其参数类型标注的情况。
必须要注意的是,该机制利用了 `inspect` 标准库获取到了事件处理函数的 `singnature` (签名) ,进一步获取到参数名称和类型标注。故而,我们在编写 `handler` 时,参数的名称和类型标注必须要符合 `T_Handler` 规定,详情可以参看 **指南** 中的[事件处理](../guide/creating-a-handler)。
::: tip 提示
如果想了解更多关于 `inspect` 标准库的信息,可以查看[官方文档](https://docs.python.org/zh-cn/3.9/library/inspect.html)。
:::
下面,我们会以 `CQHTTP` 中的 `群聊消息事件``私聊消息事件` 为例,对该机制的应用进行简单的介绍。
## 一个例子
首先,我们需要导入需要的方法、类型。
```python
from nonebot import on_command
from nonebot.adapters.cqhttp import Bot, GroupMessageEvent, PrivateMessageEvent
```
之后,我们可以注册一个 `Matcher` 来响应 `消息事件`
```python
matcher = on_command("testoverload")
```
最后, 我们编写不同的 `handler` 并编写不同的类型标注来实现事件处理函数重载:
```python
@matcher.handle()
async def _(bot: Bot, event: GroupMessageEvent):
await matcher.send("群聊消息事件响应成功!")
@matcher.handle()
async def _(bot: Bot, event: PrivateMessageEvent):
await matcher.send("私聊消息事件响应成功!")
```
此时,我们可以在群聊或私聊中对我们的机器人发送 `testoverload` ,它会在不同的场景做出不同的应答。
这样一个简单的事件处理函数重载就完成了。
## 进阶
事件处理函数重载机制同样支持被 `matcher.got` 等装饰器装饰的函数。 例如:
```python
@matcher.got("key1", prompt="群事件提问")
async def _(bot: Bot, event: GroupMessageEvent):
await matcher.send("群聊消息事件响应成功!")
@matcher.got("key2", prompt="私聊事件提问")
async def _(bot: Bot, event: PrivateMessageEvent):
await matcher.send("私聊消息事件响应成功!")
```
只有触发事件符合的函数才会触发装饰器。

View File

@@ -0,0 +1,90 @@
# 权限控制
**权限控制**是机器人在实际应用中需要解决的重点问题之一,`Nonebot` 提供了十分完善且灵活的权限控制机制—— `Permission` 机制。接下来我们将对这个机制进行简单的说明。
## 应用
如同 `Rule` 一样, `Permission` 可以在[注册事件响应器](../guide/creating-a-matcher)时添加 `permission` 参数来加以应用,这样 `Nonebot` 会在事件响应时检测事件主体的权限。下面我们以 `SUPERUSER` 为例,对该机制的应用做一下介绍。
```python
from nonebot.permission import SUPERUSER
from nonebot.adapters import Bot
from nonebot import on_command
matcher = on_command("测试超管", permission=SUPERUSER)
@matcher.handle()
async def _(bot: Bot):
await matcher.send("超管命令测试成功")
@matcher.got("key1", "超管提问")
async def _(bot: Bot, event: Event):
await matcher.send("超管命令got成功")
```
在这段代码中,我们事件响应器指定了 `SUPERUSER` 这样一个权限,那么机器人只会响应超级管理员的 `测试超管` 命令,并且会响应该超级管理员的连续对话。
::: tip 提示
在这里需要强调的是,`Permission``Rule` 的表现并不相同, `Rule` 只会在初次响应时生效,在余下的对话中并没有限制事件;但是 `Permission` 会持续生效,在连续对话中会一直对事件主体加以限制。
:::
## 进阶
`Permission` 除了可以在注册事件响应器时加以应用,还可以在编写事件处理函数 `handler` 时主动调用,我们可以利用这个特性在一个 `handler` 里对不同权限的事件主体进行区别响应,下面我们以 `CQHTTP` 中的 `GROUP_ADMIN` (普通管理员非群主)和 `GROUP_OWNER` 为例,说明下怎么进行主动调用。
```python
from nonebot import on_command
from nonebot.adapters.cqhttp import Bot
from nonebot.adapters.cqhttp import GroupMessageEvent
from nonebot.adapters.cqhttp import GROUP_ADMIN, GROUP_OWNER
matcher = on_command("测试权限")
@matcher.handle()
async def _(bot: Bot, event: GroupMessageEvent):
if await GROUP_ADMIN(bot, event):
await matcher.send("管理员测试成功")
elif await GROUP_OWNER(bot, event):
await matcher.send("群主测试成功")
else:
await matcher.send("群员测试成功")
```
在这段代码里,我们并没有对命令的权限指定,这个命令会响应所有在群聊中的 `测试权限` 命令,但是在 `handler` 里,我们对两个 `Permission` 进行主动调用,从而可以对不同的角色进行不同的响应。
## 自定义
如同 `Rule` 一样, `Permission` 也是由非负数个 `PermissionChecker` 组成的,但只需其中一个返回 `True` 时就会匹配成功。下面则是 `PermissionChecker``Permission` 示例:
```python
from nonebot.adapters import Bot, Event
from nonebot.permission import Permission
async def async_checker(bot: Bot, event: Event) -> bool:
return True
def sync_checker(bot: Bot, event: Event) -> bool:
return True
def check(arg1, arg2):
async def _checker(bot: Bot, event: Event) -> bool:
return bool(arg1 + arg2)
return Permission(_checker)
```
`Permission``PermissionChecker` 之间可以使用 `或 |` 互相组合:
```python
from nonebot.permission import Permission
Permission(async_checker1) | sync_checker | async_checker2
```
同样地,如果想用 `Permission(*checkers)` 包裹构造 `Permission` ,函数必须是异步的;但是在利用 `或 |` 符号连接构造时, `Nonebot` 会自动包裹同步函数为异步函数。

View File

@@ -0,0 +1,163 @@
# 钩子函数
[`钩子编程`](https://zh.wikipedia.org/wiki/%E9%92%A9%E5%AD%90%E7%BC%96%E7%A8%8B)
> 钩子编程hooking也称作“挂钩”是计算机程序设计术语指通过拦截软件模块间的函数调用、消息传递、事件传递来修改或扩展操作系统、应用程序或其他软件组件的行为的各种技术。处理被拦截的函数调用、事件、消息的代码被称为钩子hook
`nonebot2` 中有一系列预定义的钩子函数,分为两类:`全局钩子函数``事件钩子函数` ,这些钩子函数可以用装饰器的形式来使用。
## 全局钩子函数
全局钩子函数是指 `nonebot2` 针对其本身运行过程的钩子函数。
这些钩子函数是由其后端驱动 `driver`来运行的,故需要先获得全局 `driver` 对象:
```python
from nonebot import get_driver
driver=get_driver()
```
共分为六种函数:
### 启动准备
这个钩子函数会在 `nonebot2` 启动时运行。
```python
@driver.on_startup
async def do_something():
pass
```
### 终止处理
这个钩子函数会在 `nonebot2` 终止时运行。
```python
@driver.on_shutdown
async def do_something():
pass
```
### bot 连接处理
这个钩子函数会在 `bot` 通过 `websocket` 连接到 `nonebot2` 时运行。
```python
@driver.on_bot_connect
async def do_something(bot: Bot):
pass
```
### bot 断开处理
这个钩子函数会在 `bot` 断开与 `nonebot2``websocket` 连接时运行。
```python
@driver.on_bot_disconnect
async def do_something(bot: Bot):
pass
```
### bot api 调用钩子
这个钩子函数会在 `Bot` 调用 API 时运行。
```python
from nonebot.adapters import Bot
@Bot.on_calling_api
async def handle_api_call(bot: Bot, api: str, data: Dict[str, Any]):
pass
```
### bot api 调用后钩子
这个钩子函数会在 `Bot` 调用 API 后运行。
```python
from nonebot.adapters import Bot
@Bot.on_called_api
async def handle_api_result(bot: Bot, exception: Optional[Exception], api: str, data: Dict[str, Any], result: Any):
pass
```
## 事件处理钩子
这些钩子函数指的是影响 `nonebot2` 进行 `事件处理` 的函数。
:::tip 提示
关于 `事件处理` 的流程,可以在[这里](./README)查阅。
:::
:::warning 注意
1.在事件处理钩子函数中,与 `matcher` 运行状态相关的函数将不可用,如 `matcher.finish()`
2.如果需要在事件处理钩子函数中打断整个对话的执行,请参考以下范例:
```python
from nonebot.exception import IgnoredException
@event_preprocessor
async def do_something(bot: Bot, event: Event, state: T_State):
raise IgnoredException("reason")
```
:::
共分为四种函数:
### 事件预处理
这个钩子函数会在 `Event` 上报到 `nonebot2` 时运行
```python
from nonebot.message import event_preprocessor
@event_preprocessor
async def do_something(bot: Bot, event: Event, state: T_State):
pass
```
### 事件后处理
这个钩子函数会在 `nonebot2` 处理 `Event` 后运行
```python
from nonebot.message import event_postprocessor
@event_postprocessor
async def do_something(bot: Bot, event: Event, state: T_State):
pass
```
### 运行预处理
这个钩子函数会在 `nonebot2`运行 `matcher` 前运行。
```python
from nonebot.message import run_preprocessor
@run_preprocessor
async def do_something(matcher: Matcher, bot: Bot, event: Event, state: T_State):
pass
```
### 运行后处理
这个钩子函数会在 `nonebot2`运行 `matcher` 后运行。
```python
from nonebot.message import run_postprocessor
@run_postprocessor
async def do_something(matcher: Matcher, exception: Optional[Exception], bot: Bot, event: Event, state: T_State):
pass
```

View File

@@ -6,9 +6,9 @@
## 从 NoneBot v1 迁移 ## 从 NoneBot v1 迁移
`APScheduler` 作为 `nonebot` v1 的可选依赖,为众多 bot 提供了方便的定时任务功能。`nonebot2` 已将 `APScheduler` 独立为 `nonebot_plugin_apscheduler` 插件,你可以在 [插件广场](https://v2.nonebot.dev/plugin-store.html) 中找到它。 `APScheduler` 作为 `nonebot` v1 的可选依赖,为众多 bot 提供了方便的定时任务功能。`nonebot2` 已将 `APScheduler` 独立为 `nonebot_plugin_apscheduler` 插件,你可以在 [商店](https://v2.nonebot.dev/store.html) 中找到它。
相比于 `nonebot` v1`nonebot` v2只需要安装插件并修改 `scheduler` 的导入方式即可完成迁移。 相比于 `nonebot` v1`nonebot` v2 只需要安装插件并修改 `scheduler` 的导入方式即可完成迁移。
## 安装插件 ## 安装插件
@@ -47,9 +47,9 @@ poetry add nonebot-plugin-apscheduler
```python ```python
from nonebot import require from nonebot import require
scheduler = require('nonebot_plugin_apscheduler').scheduler scheduler = require("nonebot_plugin_apscheduler").scheduler
@scheduler.scheduled_job('cron', hour='*/2', id='xxx', args=[1], kwargs={arg2: 2}) @scheduler.scheduled_job("cron", hour="*/2", id="xxx", args=[1], kwargs={"arg2": 2})
async def run_every_2_hour(arg1, arg2): async def run_every_2_hour(arg1, arg2):
pass pass
@@ -71,7 +71,7 @@ scheduler.add_job(run_every_day_from_program_start, "interval", days=1, id="xxx"
```python ```python
from nonebot import require from nonebot import require
scheduler = require('nonebot_plugin_apscheduler').scheduler scheduler = require("nonebot_plugin_apscheduler").scheduler
``` ```
### 编写定时任务 ### 编写定时任务

View File

@@ -19,6 +19,9 @@
* [nonebot.matcher](matcher.html) * [nonebot.matcher](matcher.html)
* [nonebot.handler](handler.html)
* [nonebot.rule](rule.html) * [nonebot.rule](rule.html)
@@ -46,6 +49,9 @@
* [nonebot.drivers.quart](drivers/quart.html) * [nonebot.drivers.quart](drivers/quart.html)
* [nonebot.drivers.aiohttp](drivers/aiohttp.html)
* [nonebot.adapters](adapters/) * [nonebot.adapters](adapters/)
@@ -56,3 +62,6 @@
* [nonebot.adapters.mirai](adapters/mirai.html) * [nonebot.adapters.mirai](adapters/mirai.html)
* [nonebot.adapters.feishu](adapters/feishu.html)

View File

@@ -27,35 +27,57 @@ Driver 对象
Config 配置对象 Config 配置对象
### _abstract_ `__init__(connection_type, self_id, *, websocket=None)` ### `_calling_api_hook`
* **类型**
`Set[T_CallingAPIHook]`
* **说明**
call_api 时执行的函数
### `_called_api_hook`
* **类型**
`Set[T_CalledAPIHook]`
* **说明**
call_api 后执行的函数
### `__init__(self_id, request)`
* **参数** * **参数**
* `connection_type: str`: http 或者 websocket
* `self_id: str`: 机器人 ID * `self_id: str`: 机器人 ID
* `websocket: Optional[WebSocket]`: Websocket 连接对象 * `request: HTTPConnection`: request 连接对象
### `connection_type`
连接类型
### `self_id` ### `self_id`
机器人 ID 机器人 ID
### `websocket` ### `request`
Websocket 连接对象 连接信息
### _abstract property_ `type` ### _abstract property_ `type`
@@ -63,16 +85,16 @@ Websocket 连接对象
Adapter 类型 Adapter 类型
### _classmethod_ `register(driver, config)` ### _classmethod_ `register(driver, config, **kwargs)`
* **说明** * **说明**
register 方法会在 driver.register_adapter 时被调用,用于初始化相关配置 `register` 方法会在 `driver.register_adapter` 时被调用,用于初始化相关配置
### _abstract async classmethod_ `check_permission(driver, connection_type, headers, body)` ### _abstract async classmethod_ `check_permission(driver, request)`
* **说明** * **说明**
@@ -87,27 +109,17 @@ Adapter 类型
* `driver: Driver`: Driver 对象 * `driver: Driver`: Driver 对象
* `connection_type: str`: 连接类型 * `request: HTTPConnection`: request 请求详情
* `headers: dict`: 请求头
* `body: Optional[dict]`: 请求数据WebSocket 连接该部分为空
* **返回** * **返回**
* `str`: 连接唯一标识符 * `Optional[str]`: 连接唯一标识符`None` 代表连接不合法
* `Optional[HTTPResponse]`: HTTP 上报响应
* **异常**
* `RequestDenied`: 请求非法
@@ -123,11 +135,30 @@ Adapter 类型
* **参数** * **参数**
* `message: dict`: 收到的上报消息 * `message: bytes`: 收到的上报消息
### _abstract async_ `call_api(api, **data)` ### _abstract async_ `_call_api(api, **data)`
* **说明**
`adapter` 实际调用 api 的逻辑实现函数,实现该方法以调用 api。
* **参数**
* `api: str`: API 名称
* `**data`: API 数据
### _async_ `call_api(api, **data)`
* **说明** * **说明**
@@ -177,9 +208,59 @@ await bot.send_msg(message="hello world")
### _classmethod_ `on_calling_api(func)`
* **说明**
调用 api 预处理。
* **参数**
* `bot: Bot`: 当前 bot 对象
* `api: str`: 调用的 api 名称
* `data: Dict[str, Any]`: api 调用的参数字典
### _classmethod_ `on_called_api(func)`
* **说明**
调用 api 后处理。
* **参数**
* `bot: Bot`: 当前 bot 对象
* `exception: Optional[Exception]`: 调用 api 时发生的错误
* `api: str`: 调用的 api 名称
* `data: Dict[str, Any]`: api 调用的参数字典
* `result: Any`: api 调用的返回
## _class_ `MessageSegment` ## _class_ `MessageSegment`
基类:`abc.ABC` 基类:`Mapping`, `abc.ABC`, `Generic`[`nonebot.adapters._base.TM`]
消息段基类 消息段基类
@@ -204,7 +285,7 @@ await bot.send_msg(message="hello world")
## _class_ `Message` ## _class_ `Message`
基类:`list`, `abc.ABC` 基类:`List`[`nonebot.adapters._base.TMS`], `abc.ABC`
消息数组 消息数组
@@ -251,15 +332,6 @@ await bot.send_msg(message="hello world")
### `reduce()`
* **说明**
缩减消息数组,即按 MessageSegment 的实现拼接相邻消息段
### `extract_plain_text()` ### `extract_plain_text()`
@@ -291,6 +363,9 @@ Event 基类。提供获取关键信息的方法,其余信息可直接获取
* `Literal["message", "notice", "request", "meta_event"]` * `Literal["message", "notice", "request", "meta_event"]`
* 其他自定义 `str`
### _abstract_ `get_event_name()` ### _abstract_ `get_event_name()`

View File

@@ -26,6 +26,9 @@ CQHTTP 配置类
* `secret` / `cqhttp_secret`: CQHTTP HTTP 上报数据签名口令 * `secret` / `cqhttp_secret`: CQHTTP HTTP 上报数据签名口令
* `ws_urls` / `cqhttp_ws_urls`: CQHTTP 正向 Websocket 连接 Bot ID、目标 URL 字典
# NoneBot.adapters.cqhttp.utils 模块 # NoneBot.adapters.cqhttp.utils 模块
@@ -147,7 +150,7 @@ CQHTTP 配置类
* **说明** * **说明**
检查消息开头是否存在,去除并赋值 `event.to_me` 检查消息开头是否存在昵称,去除并赋值 `event.to_me`
@@ -193,7 +196,7 @@ CQHTTP 配置类
## _class_ `Bot` ## _class_ `Bot`
基类:[`nonebot.adapters.Bot`](README.md#nonebot.adapters.Bot) 基类:[`nonebot.adapters._base.Bot`](README.md#nonebot.adapters._base.Bot)
CQHTTP 协议 Bot 适配。继承属性参考 [BaseBot](./#class-basebot) 。 CQHTTP 协议 Bot 适配。继承属性参考 [BaseBot](./#class-basebot) 。
@@ -204,7 +207,7 @@ CQHTTP 协议 Bot 适配。继承属性参考 [BaseBot](./#class-basebot) 。
* 返回: `"cqhttp"` * 返回: `"cqhttp"`
### _async classmethod_ `check_permission(driver, connection_type, headers, body)` ### _async classmethod_ `check_permission(driver, request)`
* **说明** * **说明**
@@ -307,17 +310,119 @@ CQHTTP 协议 Bot 适配。继承属性参考 [BaseBot](./#class-basebot) 。
## _class_ `MessageSegment` ## _class_ `MessageSegment`
基类:[`nonebot.adapters.MessageSegment`](README.md#nonebot.adapters.MessageSegment) 基类:[`nonebot.adapters._base.MessageSegment`](README.md#nonebot.adapters._base.MessageSegment)[`Message`]
CQHTTP 协议 MessageSegment 适配。具体方法参考协议消息段类型或源码。 CQHTTP 协议 MessageSegment 适配。具体方法参考协议消息段类型或源码。
### _classmethod_ `get_message_class()`
### `is_text()`
### _static_ `anonymous(ignore_failure=None)`
### _static_ `at(user_id)`
### _static_ `contact(type_, id)`
### _static_ `contact_group(group_id)`
### _static_ `contact_user(user_id)`
### _static_ `dice()`
### _static_ `face(id_)`
### _static_ `forward(id_)`
### _static_ `image(file, type_=None, cache=True, proxy=True, timeout=None)`
### _static_ `json(data)`
### _static_ `location(latitude, longitude, title=None, content=None)`
### _static_ `music(type_, id_)`
### _static_ `music_custom(url, audio, title, content=None, img_url=None)`
### _static_ `node(id_)`
### _static_ `node_custom(user_id, nickname, content)`
### _static_ `poke(type_, id_)`
### _static_ `record(file, magic=None, cache=None, proxy=None, timeout=None)`
### _static_ `reply(id_)`
### _static_ `rps()`
### _static_ `shake()`
### _static_ `share(url='', title='', content=None, image=None)`
### _static_ `text(text)`
### _static_ `video(file, cache=None, proxy=None, timeout=None)`
### _static_ `xml(data)`
### `type`
* 类型: `str`
* 说明: 消息段类型
### `data`
* 类型: `Dict[str, Union[str, list]]`
* 说明: 消息段数据
## _class_ `Message` ## _class_ `Message`
基类:[`nonebot.adapters.Message`](README.md#nonebot.adapters.Message) 基类:[`nonebot.adapters._base.Message`](README.md#nonebot.adapters._base.Message)[`nonebot.adapters.cqhttp.message.MessageSegment`]
CQHTTP 协议 Message 适配。 CQHTTP 协议 Message 适配。
### _classmethod_ `get_segment_class()`
### `extract_plain_text()`
# NoneBot.adapters.cqhttp.permission 模块 # NoneBot.adapters.cqhttp.permission 模块
@@ -377,7 +482,7 @@ CQHTTP 协议 Message 适配。
## _class_ `Event` ## _class_ `Event`
基类:[`nonebot.adapters.Event`](README.md#nonebot.adapters.Event) 基类:[`nonebot.adapters._base.Event`](README.md#nonebot.adapters._base.Event)
CQHTTP 协议事件,字段与 CQHTTP 一致。各事件字段参考 [CQHTTP 文档](https://github.com/howmanybots/onebot/blob/master/README.md) CQHTTP 协议事件,字段与 CQHTTP 一致。各事件字段参考 [CQHTTP 文档](https://github.com/howmanybots/onebot/blob/master/README.md)

View File

@@ -94,7 +94,7 @@ sidebarDepth: 0
## _class_ `Bot` ## _class_ `Bot`
基类:[`nonebot.adapters.Bot`](README.md#nonebot.adapters.Bot) 基类:[`nonebot.adapters._base.Bot`](README.md#nonebot.adapters._base.Bot)
钉钉 协议 Bot 适配。继承属性参考 [BaseBot](./#class-basebot) 。 钉钉 协议 Bot 适配。继承属性参考 [BaseBot](./#class-basebot) 。
@@ -105,7 +105,7 @@ sidebarDepth: 0
* 返回: `"ding"` * 返回: `"ding"`
### _async classmethod_ `check_permission(driver, connection_type, headers, body)` ### _async classmethod_ `check_permission(driver, request)`
* **说明** * **说明**
@@ -129,6 +129,9 @@ sidebarDepth: 0
* `api: str`: API 名称 * `api: str`: API 名称
* `event: Optional[MessageEvent]`: Event 对象
* `**data: Any`: API 参数 * `**data: Any`: API 参数
@@ -150,7 +153,7 @@ sidebarDepth: 0
### _async_ `send(event, message, at_sender=False, **kwargs)` ### _async_ `send(event, message, at_sender=False, webhook=None, secret=None, **kwargs)`
* **说明** * **说明**
@@ -171,6 +174,12 @@ sidebarDepth: 0
* `at_sender: bool`: 是否 @ 事件主体 * `at_sender: bool`: 是否 @ 事件主体
* `webhook: Optional[str]`: 该条消息将调用的 webhook 地址。不传则将使用 sessionWebhook若其也不存在该条消息不发送使用自定义 webhook 时注意你设置的安全方式如加关键词IP地址加签等等。
* `secret: Optional[str]`: 如果你使用自定义的 webhook 地址,推荐使用加签方式对消息进行验证,将 机器人安全设置页面加签一栏下面显示的SEC开头的字符串 传入这个参数即可。
* `**kwargs`: 覆盖默认参数 * `**kwargs`: 覆盖默认参数
@@ -199,7 +208,7 @@ sidebarDepth: 0
## _class_ `MessageSegment` ## _class_ `MessageSegment`
基类:[`nonebot.adapters.MessageSegment`](README.md#nonebot.adapters.MessageSegment) 基类:[`nonebot.adapters._base.MessageSegment`](README.md#nonebot.adapters._base.MessageSegment)[`Message`]
钉钉 协议 MessageSegment 适配。具体方法参考协议消息段类型或源码。 钉钉 协议 MessageSegment 适配。具体方法参考协议消息段类型或源码。
@@ -236,12 +245,12 @@ message += MessageSegment.atDingtalkIds(event.senderId)
### _static_ `extension(dict_)` ### _static_ `extension(dict_)`
"标记 text 文本的 extension 属性,需要与 text 消息段相加。 标记 text 文本的 extension 属性,需要与 text 消息段相加。
### _static_ `code(code_language, code)` ### _static_ `code(code_language, code)`
"发送 code 消息段 发送 code 消息段
### _static_ `markdown(title, text)` ### _static_ `markdown(title, text)`
@@ -265,7 +274,7 @@ message += MessageSegment.atDingtalkIds(event.senderId)
* `btnOrientation`: 0按钮竖直排列 1按钮横向排列 * `btnOrientation`: 0按钮竖直排列 1按钮横向排列
* `btns`: [{ "title": title, "actionURL": actionURL }, ...] * `btns`: `[{ "title": title, "actionURL": actionURL }, ...]`
@@ -277,13 +286,13 @@ message += MessageSegment.atDingtalkIds(event.senderId)
* **参数** * **参数**
* `links`: [{ "title": xxx, "messageURL": xxx, "picURL": xxx }, ...] * `links`: `[{ "title": xxx, "messageURL": xxx, "picURL": xxx }, ...]`
## _class_ `Message` ## _class_ `Message`
基类:[`nonebot.adapters.Message`](README.md#nonebot.adapters.Message) 基类:[`nonebot.adapters._base.Message`](README.md#nonebot.adapters._base.Message)[`nonebot.adapters.ding.message.MessageSegment`]
钉钉 协议 Message 适配。 钉钉 协议 Message 适配。
@@ -292,7 +301,7 @@ message += MessageSegment.atDingtalkIds(event.senderId)
## _class_ `Event` ## _class_ `Event`
基类:[`nonebot.adapters.Event`](README.md#nonebot.adapters.Event) 基类:[`nonebot.adapters._base.Event`](README.md#nonebot.adapters._base.Event)
钉钉协议事件。各事件字段参考 [钉钉文档](https://ding-doc.dingtalk.com/document#/org-dev-guide/elzz1p) 钉钉协议事件。各事件字段参考 [钉钉文档](https://ding-doc.dingtalk.com/document#/org-dev-guide/elzz1p)

View File

@@ -0,0 +1,246 @@
---
contentSidebar: true
sidebarDepth: 0
---
# NoneBot.adapters.feishu 模块
# NoneBot.adapters.feishu.config 模块
## _class_ `Config`
钉钉配置类
* **配置项**
* `app_id` / `feishu_app_id`: 飞书开放平台后台“凭证与基础信息”处给出的 App ID
* `app_secret` / `feishu_app_secret`: 飞书开放平台后台“凭证与基础信息”处给出的 App Secret
* `encrypt_key` / `feishu_encrypt_key`: 飞书开放平台后台“事件订阅”处设置的 Encrypt Key
* `verification_token` / `feishu_verification_token`: 飞书开放平台后台“事件订阅”处设置的 Verification Token
* `tenant_access_token` / `feishu_tenant_access_token`: 请求飞书 API 后返回的租户密钥
# NoneBot.adapters.feishu.exception 模块
## _exception_ `ActionFailed`
基类:[`nonebot.exception.ActionFailed`](../exception.md#nonebot.exception.ActionFailed), `nonebot.adapters.feishu.exception.FeishuAdapterException`
* **说明**
API 请求返回错误信息。
* **参数**
* `retcode: Optional[int]`: 错误码
## _exception_ `NetworkError`
基类:[`nonebot.exception.NetworkError`](../exception.md#nonebot.exception.NetworkError), `nonebot.adapters.feishu.exception.FeishuAdapterException`
* **说明**
网络错误。
* **参数**
* `retcode: Optional[int]`: 错误码
# NoneBot.adapters.feishu.bot 模块
## `_check_at_me(bot, event)`
* **说明**
检查消息开头或结尾是否存在 @机器人,去除并赋值 `event.reply`, `event.to_me`
* **参数**
* `bot: Bot`: Bot 对象
* `event: Event`: Event 对象
## `_check_nickname(bot, event)`
* **说明**
检查消息开头是否存在昵称,去除并赋值 `event.to_me`
* **参数**
* `bot: Bot`: Bot 对象
* `event: Event`: Event 对象
## `_handle_api_result(result)`
* **说明**
处理 API 请求返回值。
* **参数**
* `result: Optional[Dict[str, Any]]`: API 返回数据
* **返回**
* `Any`: API 调用返回数据
* **异常**
* `ActionFailed`: API 调用失败
## _class_ `Bot`
基类:[`nonebot.adapters._base.Bot`](README.md#nonebot.adapters._base.Bot)
飞书 协议 Bot 适配。继承属性参考 [BaseBot](./#class-basebot) 。
### _async_ `handle_message(message)`
* **说明**
处理事件并转换为 [Event](#class-event)
### _async_ `call_api(api, **data)`
* **说明**
调用 飞书 协议 API
* **参数**
* `api: str`: API 名称
* `**data: Any`: API 参数
* **返回**
* `Any`: API 调用返回数据
* **异常**
* `NetworkError`: 网络错误
* `ActionFailed`: API 调用失败
# NoneBot.adapters.feishu.message 模块
## _class_ `MessageSegment`
基类:[`nonebot.adapters._base.MessageSegment`](README.md#nonebot.adapters._base.MessageSegment)[`Message`]
飞书 协议 MessageSegment 适配。具体方法参考协议消息段类型或源码。
## _class_ `Message`
基类:[`nonebot.adapters._base.Message`](README.md#nonebot.adapters._base.Message)[`nonebot.adapters.feishu.message.MessageSegment`]
飞书 协议 Message 适配。
## _class_ `MessageSerializer`
基类:`object`
飞书 协议 Message 序列化器。
## _class_ `MessageDeserializer`
基类:`object`
飞书 协议 Message 反序列化器。
# NoneBot.adapters.feishu.event 模块
## _class_ `Event`
基类:[`nonebot.adapters._base.Event`](README.md#nonebot.adapters._base.Event)
飞书协议事件。各事件字段参考 [飞书文档](https://open.feishu.cn/document/ukTMukTMukTM/uYDNxYjL2QTM24iN0EjN/event-list)
## `get_event_model(event_name)`
* **说明**
根据事件名获取对应 `Event Model``FallBack Event Model` 列表
* **返回**
* `List[Type[Event]]`

File diff suppressed because it is too large Load Diff

View File

@@ -59,6 +59,8 @@ NoneBot 主要配置。大小写不敏感。
NoneBot 运行所使用的 `Driver` 。继承自 `nonebot.driver.BaseDriver` NoneBot 运行所使用的 `Driver` 。继承自 `nonebot.driver.BaseDriver`
配置格式为 `<module>[:<class>]`,默认类名为 `Driver`
### `host` ### `host`
@@ -106,6 +108,30 @@ NoneBot 主要配置。大小写不敏感。
### `log_level`
* **类型**: `Union[int, str]`
* **默认值**: `None`
* **说明**
配置 NoneBot 日志输出等级,可以为 `int` 类型等级或等级名称,参考 [loguru 日志等级](https://loguru.readthedocs.io/en/stable/api/logger.html#levels)。
* **示例**
```default
LOG_LEVEL=25
LOG_LEVEL=INFO
```
### `api_root` ### `api_root`

View File

@@ -0,0 +1,529 @@
---
contentSidebar: true
sidebarDepth: 0
---
# NoneBot.drivers 模块
## 后端驱动适配基类
各驱动请继承以下基类
## _class_ `Driver`
基类:`abc.ABC`
Driver 基类。
### `_adapters`
* **类型**
`Dict[str, Type[Bot]]`
* **说明**
已注册的适配器列表
### `_bot_connection_hook`
* **类型**
`Set[T_BotConnectionHook]`
* **说明**
Bot 连接建立时执行的函数
### `_bot_disconnection_hook`
* **类型**
`Set[T_BotDisconnectionHook]`
* **说明**
Bot 连接断开时执行的函数
### `__init__(env, config)`
* **参数**
* `env: Env`: 包含环境信息的 Env 对象
* `config: Config`: 包含配置信息的 Config 对象
### `env`
* **类型**
`str`
* **说明**
环境名称
### `config`
* **类型**
`Config`
* **说明**
配置对象
### `_clients`
* **类型**
`Dict[str, Bot]`
* **说明**
已连接的 Bot
### _property_ `bots`
* **类型**
`Dict[str, Bot]`
* **说明**
获取当前所有已连接的 Bot
### `register_adapter(name, adapter, **kwargs)`
* **说明**
注册一个协议适配器
* **参数**
* `name: str`: 适配器名称,用于在连接时进行识别
* `adapter: Type[Bot]`: 适配器 Class
* `**kwargs`: 其他传递给适配器的参数
### _abstract property_ `type`
驱动类型名称
### _abstract property_ `logger`
驱动专属 logger 日志记录器
### _abstract_ `run(*args, **kwargs)`
* **说明**
启动驱动框架
* **参数**
* `*args`
* `**kwargs`
### _abstract_ `on_startup(func)`
注册一个在驱动启动时运行的函数
### _abstract_ `on_shutdown(func)`
注册一个在驱动停止时运行的函数
### `on_bot_connect(func)`
* **说明**
装饰一个函数使他在 bot 通过 WebSocket 连接成功时执行。
* **函数参数**
* `bot: Bot`: 当前连接上的 Bot 对象
### `on_bot_disconnect(func)`
* **说明**
装饰一个函数使他在 bot 通过 WebSocket 连接断开时执行。
* **函数参数**
* `bot: Bot`: 当前连接上的 Bot 对象
### `_bot_connect(bot)`
在 WebSocket 连接成功后,调用该函数来注册 bot 对象
### `_bot_disconnect(bot)`
在 WebSocket 连接断开后,调用该函数来注销 bot 对象
## _class_ `ForwardDriver`
基类:`nonebot.drivers.Driver`
Forward Driver 基类。将客户端框架封装,以满足适配器使用。
### _abstract_ `setup_http_polling(setup)`
* **说明**
注册一个 HTTP 轮询连接,如果传入一个函数,则该函数会在每次连接时被调用
* **参数**
* `setup: Union[HTTPPollingSetup, Callable[[], Awaitable[HTTPPollingSetup]]]`
### _abstract_ `setup_websocket(setup)`
* **说明**
注册一个 WebSocket 连接,如果传入一个函数,则该函数会在每次重连时被调用
* **参数**
* `setup: Union[WebSocketSetup, Callable[[], Awaitable[WebSocketSetup]]]`
## _class_ `ReverseDriver`
基类:`nonebot.drivers.Driver`
Reverse Driver 基类。将后端框架封装,以满足适配器使用。
### _abstract property_ `server_app`
驱动 APP 对象
### _abstract property_ `asgi`
驱动 ASGI 对象
## _class_ `HTTPConnection`
基类:`abc.ABC`
### `http_version`
One of `"1.0"`, `"1.1"` or `"2"`.
### `scheme`
URL scheme portion (likely `"http"` or `"https"`).
### `path`
HTTP request target excluding any query string,
with percent-encoded sequences and UTF-8 byte sequences
decoded into characters.
### `query_string`
URL portion after the `?`, percent-encoded.
### `headers`
A dict of name-value pairs,
where name is the header name, and value is the header value.
Order of header values must be preserved from the original HTTP request;
order of header names is not important.
Header names must be lowercased.
### _abstract property_ `type`
Connection type.
## _class_ `HTTPRequest`
基类:`nonebot.drivers.HTTPConnection`
HTTP 请求封装。参考 [asgi http scope](https://asgi.readthedocs.io/en/latest/specs/www.html#http-connection-scope)。
### `method`
The HTTP method name, uppercased.
### `body`
Body of the request.
Optional; if missing defaults to `b""`.
### _property_ `type`
Always `http`
## _class_ `HTTPResponse`
基类:`object`
HTTP 响应封装。参考 [asgi http scope](https://asgi.readthedocs.io/en/latest/specs/www.html#http-connection-scope)。
### `status`
HTTP status code.
### `body`
HTTP body content.
Optional; if missing defaults to `None`.
### `headers`
A dict of name-value pairs,
where name is the header name, and value is the header value.
Order must be preserved in the HTTP response.
Header names must be lowercased.
Optional; if missing defaults to an empty dict.
### _property_ `type`
Always `http`
## _class_ `WebSocket`
基类:`nonebot.drivers.HTTPConnection`, `abc.ABC`
WebSocket 连接封装。参考 [asgi websocket scope](https://asgi.readthedocs.io/en/latest/specs/www.html#websocket-connection-scope)。
### _property_ `type`
Always `websocket`
### _abstract property_ `closed`
* **类型**
`bool`
* **说明**
连接是否已经关闭
### _abstract async_ `accept()`
接受 WebSocket 连接请求
### _abstract async_ `close(code)`
关闭 WebSocket 连接请求
### _abstract async_ `receive()`
接收一条 WebSocket text 信息
### _abstract async_ `receive_bytes()`
接收一条 WebSocket binary 信息
### _abstract async_ `send(data)`
发送一条 WebSocket text 信息
### _abstract async_ `send_bytes(data)`
发送一条 WebSocket binary 信息
## _class_ `HTTPPollingSetup`
基类:`object`
### `adapter`
协议适配器名称
### `self_id`
机器人 ID
### `url`
URL
### `method`
HTTP method
### `body`
HTTP body
### `headers`
HTTP headers
### `http_version`
HTTP version
### `poll_interval`
HTTP 轮询间隔
## _class_ `WebSocketSetup`
基类:`object`
### `adapter`
协议适配器名称
### `self_id`
机器人 ID
### `url`
URL
### `headers`
HTTP headers
### `reconnect_interval`
WebSocket 重连间隔

View File

@@ -0,0 +1,101 @@
---
contentSidebar: true
sidebarDepth: 0
---
# NoneBot.drivers.aiohttp 模块
## AIOHTTP 驱动适配
本驱动仅支持客户端连接
## _class_ `Driver`
基类:[`nonebot.drivers.ForwardDriver`](README.md#nonebot.drivers.ForwardDriver)
AIOHTTP 驱动框架
### _property_ `type`
驱动名称: `aiohttp`
### _property_ `logger`
aiohttp driver 使用的 logger
### `on_startup(func)`
* **说明**
注册一个启动时执行的函数
* **参数**
* `func: Callable[[], Awaitable[None]]`
### `on_shutdown(func)`
* **说明**
注册一个停止时执行的函数
* **参数**
* `func: Callable[[], Awaitable[None]]`
### `setup_http_polling(setup)`
* **说明**
注册一个 HTTP 轮询连接,如果传入一个函数,则该函数会在每次连接时被调用
* **参数**
* `setup: Union[HTTPPollingSetup, Callable[[], Awaitable[HTTPPollingSetup]]]`
### `setup_websocket(setup)`
* **说明**
注册一个 WebSocket 连接,如果传入一个函数,则该函数会在每次重连时被调用
* **参数**
* `setup: Union[WebSocketSetup, Callable[[], Awaitable[WebSocketSetup]]]`
### `run(*args, **kwargs)`
启动 aiohttp driver
## _class_ `WebSocket`
基类:[`nonebot.drivers.WebSocket`](README.md#nonebot.drivers.WebSocket)

View File

@@ -7,6 +7,8 @@ sidebarDepth: 0
## FastAPI 驱动适配 ## FastAPI 驱动适配
本驱动同时支持服务端以及客户端连接
后端使用方法请参考: [FastAPI 文档](https://fastapi.tiangolo.com/) 后端使用方法请参考: [FastAPI 文档](https://fastapi.tiangolo.com/)
@@ -28,7 +30,7 @@ FastAPI 驱动框架设置,详情参考 FastAPI 文档
* **说明** * **说明**
openapi.json 地址,默认为 None 即关闭 `openapi.json` 地址,默认为 `None` 即关闭
@@ -43,7 +45,7 @@ FastAPI 驱动框架设置,详情参考 FastAPI 文档
* **说明** * **说明**
swagger 地址,默认为 None 即关闭 `swagger` 地址,默认为 `None` 即关闭
@@ -58,13 +60,28 @@ FastAPI 驱动框架设置,详情参考 FastAPI 文档
* **说明** * **说明**
redoc 地址,默认为 None 即关闭 `redoc` 地址,默认为 `None` 即关闭
### `fastapi_reload_dirs`
* **类型**
`List[str]`
* **说明**
`debug` 模式下重载监控文件夹列表,默认为 uvicorn 默认值
## _class_ `Driver` ## _class_ `Driver`
基类:[`nonebot.drivers.Driver`](README.md#nonebot.drivers.Driver) 基类:[`nonebot.drivers.ReverseDriver`](README.md#nonebot.drivers.ReverseDriver), [`nonebot.drivers.ForwardDriver`](README.md#nonebot.drivers.ForwardDriver)
FastAPI 驱动框架 FastAPI 驱动框架
@@ -115,6 +132,43 @@ fastapi 使用的 logger
参考文档: [Events](https://fastapi.tiangolo.com/advanced/events/#startup-event) 参考文档: [Events](https://fastapi.tiangolo.com/advanced/events/#startup-event)
### `setup_http_polling(setup)`
* **说明**
注册一个 HTTP 轮询连接,如果传入一个函数,则该函数会在每次连接时被调用
* **参数**
* `setup: Union[HTTPPollingSetup, Callable[[], Awaitable[HTTPPollingSetup]]]`
### `setup_websocket(setup)`
* **说明**
注册一个 WebSocket 连接,如果传入一个函数,则该函数会在每次重连时被调用
* **参数**
* `setup: Union[WebSocketSetup, Callable[[], Awaitable[WebSocketSetup]]]`
### `run(host=None, port=None, *, app=None, **kwargs)` ### `run(host=None, port=None, *, app=None, **kwargs)`
使用 `uvicorn` 启动 FastAPI 使用 `uvicorn` 启动 FastAPI
## _class_ `WebSocket`
基类:[`nonebot.drivers.WebSocket`](README.md#nonebot.drivers.WebSocket)

View File

@@ -10,9 +10,31 @@ sidebarDepth: 0
后端使用方法请参考: [Quart 文档](https://pgjones.gitlab.io/quart/index.html) 后端使用方法请参考: [Quart 文档](https://pgjones.gitlab.io/quart/index.html)
## _class_ `Config`
基类:`pydantic.env_settings.BaseSettings`
Quart 驱动框架设置
### `quart_reload_dirs`
* **类型**
`List[str]`
* **说明**
`debug` 模式下重载监控文件夹列表,默认为 uvicorn 默认值
## _class_ `Driver` ## _class_ `Driver`
基类:[`nonebot.drivers.Driver`](README.md#nonebot.drivers.Driver) 基类:[`nonebot.drivers.ReverseDriver`](README.md#nonebot.drivers.ReverseDriver)
Quart 驱动框架 Quart 驱动框架
@@ -44,7 +66,7 @@ Quart 驱动框架
### _property_ `logger` ### _property_ `logger`
fastapi 使用的 logger Quart 使用的 logger
### `on_startup(func)` ### `on_startup(func)`
@@ -60,3 +82,8 @@ fastapi 使用的 logger
### `run(host=None, port=None, *, app=None, **kwargs)` ### `run(host=None, port=None, *, app=None, **kwargs)`
使用 `uvicorn` 启动 Quart 使用 `uvicorn` 启动 Quart
## _class_ `WebSocket`
基类:[`nonebot.drivers.WebSocket`](README.md#nonebot.drivers.WebSocket)

View File

@@ -40,6 +40,27 @@ sidebarDepth: 0
## _exception_ `ParserExit`
基类:`nonebot.exception.NoneBotException`
* **说明**
`shell command` 处理消息失败时返回的异常
* **参数**
* `status`
* `message`
## _exception_ `PausedException` ## _exception_ `PausedException`
基类:`nonebot.exception.NoneBotException` 基类:`nonebot.exception.NoneBotException`
@@ -111,27 +132,6 @@ sidebarDepth: 0
## _exception_ `RequestDenied`
基类:`nonebot.exception.NoneBotException`
* **说明**
Bot 连接请求不合法。
* **参数**
* `status_code: int`: HTTP 状态码
* `reason: str`: 拒绝原因
## _exception_ `AdapterException` ## _exception_ `AdapterException`
基类:`nonebot.exception.NoneBotException` 基类:`nonebot.exception.NoneBotException`

View File

@@ -0,0 +1,111 @@
---
contentSidebar: true
sidebarDepth: 0
---
# NoneBot.handler 模块
## 事件处理函数
该模块实现事件处理函数的封装,以实现动态参数等功能。
## _class_ `Handler`
基类:`object`
事件处理函数类
### `__init__(func)`
装饰事件处理函数以便根据动态参数运行
### `func`
* **类型**
`T_Handler`
* **说明**
事件处理函数
### `signature`
* **类型**
`inspect.Signature`
* **说明**
事件处理函数签名
### _property_ `bot_type`
* **类型**
`Union[Type["Bot"], inspect.Parameter.empty]`
* **说明**
事件处理函数接受的 Bot 对象类型
### _property_ `event_type`
* **类型**
`Optional[Union[Type[Event], inspect.Parameter.empty]]`
* **说明**
事件处理函数接受的 event 类型 / 不需要 event 参数
### _property_ `state_type`
* **类型**
`Optional[Union[T_State, inspect.Parameter.empty]]`
* **说明**
事件处理函数是否接受 state 参数
### _property_ `matcher_type`
* **类型**
`Optional[Union[Type["Matcher"], inspect.Parameter.empty]]`
* **说明**
事件处理函数是否接受 matcher 参数

View File

@@ -7,7 +7,7 @@ sidebarDepth: 0
## 事件响应器 ## 事件响应器
该模块实现事件响应器的创建与运行,并提供一些快捷方法来帮助用户更好的与机器人进行 对话 。 该模块实现事件响应器的创建与运行,并提供一些快捷方法来帮助用户更好的与机器人进行对话 。
## `matchers` ## `matchers`
@@ -35,6 +35,21 @@ sidebarDepth: 0
### `module` ### `module`
* **类型**
`Optional[ModuleType]`
* **说明**
事件响应器所在模块
### `plugin_name`
* **类型** * **类型**
`Optional[str]` `Optional[str]`
@@ -43,7 +58,37 @@ sidebarDepth: 0
* **说明** * **说明**
事件响应器所在模块名称 事件响应器所在插件名
### `module_name`
* **类型**
`Optional[str]`
* **说明**
事件响应器所在模块名
### `module_prefix`
* **类型**
`Optional[str]`
* **说明**
事件响应器所在模块前缀
@@ -197,6 +242,36 @@ sidebarDepth: 0
### `_default_type_updater`
* **类型**
`Optional[T_TypeUpdater]`
* **说明**
事件响应器类型更新函数
### `_default_permission_updater`
* **类型**
`Optional[T_PermissionUpdater]`
* **说明**
事件响应器权限更新函数
### `__init__()` ### `__init__()`
实例化 Matcher 以便运行 实例化 Matcher 以便运行
@@ -207,7 +282,7 @@ sidebarDepth: 0
* **类型** * **类型**
`List[T_Handler]` `List[Handler]`
@@ -217,7 +292,7 @@ sidebarDepth: 0
### _classmethod_ `new(type_='', rule=None, permission=None, handlers=None, temp=False, priority=1, block=False, *, module=None, default_state=None, default_state_factory=None, expire_time=None)` ### _classmethod_ `new(type_='', rule=None, permission=None, handlers=None, temp=False, priority=1, block=False, *, module=None, expire_time=None, default_state=None, default_state_factory=None, default_parser=None, default_type_updater=None, default_permission_updater=None)`
* **说明** * **说明**
@@ -341,6 +416,38 @@ sidebarDepth: 0
### _classmethod_ `type_updater(func)`
* **说明**
装饰一个函数来更改当前事件响应器的默认响应事件类型更新函数
* **参数**
* `func: T_TypeUpdater`: 响应事件类型更新函数
### _classmethod_ `permission_updater(func)`
* **说明**
装饰一个函数来更改当前事件响应器的默认会话权限更新函数
* **参数**
* `func: T_PermissionUpdater`: 会话权限更新函数
### _classmethod_ `handle()` ### _classmethod_ `handle()`
@@ -468,3 +575,12 @@ sidebarDepth: 0
* `**kwargs`: 其他传递给 `bot.send` 的参数,请参考对应 adapter 的 bot 对象 api * `**kwargs`: 其他传递给 `bot.send` 的参数,请参考对应 adapter 的 bot 对象 api
### `stop_propagation()`
* **说明**
阻止事件传播

View File

@@ -52,6 +52,15 @@ sidebarDepth: 0
* `load_plugins` => `nonebot.plugin.load_plugins` * `load_plugins` => `nonebot.plugin.load_plugins`
* `load_all_plugins` => `nonebot.plugin.load_all_plugins`
* `load_from_json` => `nonebot.plugin.load_from_json`
* `load_from_toml` => `nonebot.plugin.load_from_toml`
* `load_builtin_plugins` => `nonebot.plugin.load_builtin_plugins` * `load_builtin_plugins` => `nonebot.plugin.load_builtin_plugins`
@@ -160,6 +169,52 @@ asgi = nonebot.get_asgi()
``` ```
## `get_bot(self_id=None)`
* **说明**
当提供 self_id 时,此函数是 get_bots()[self_id] 的简写;当不提供时,返回一个 Bot。
* **参数**
* `self_id: Optional[str]`: 用来识别 Bot 的 ID
* **返回**
* `Bot`: Bot 对象
* **异常**
* `KeyError`: 对应 ID 的 Bot 不存在
* `ValueError`: 全局 Driver 对象尚未初始化 (nonebot.init 尚未调用)
* `ValueError`: 没有传入 ID 且没有 Bot 可用
* **用法**
```python
assert nonebot.get_bot('12345') == nonebot.get_bots()['12345']
another_unspecified_bot = nonebot.get_bot()
```
## `get_bots()` ## `get_bots()`

View File

@@ -14,6 +14,80 @@ sidebarDepth: 0
::: :::
## _class_ `Permission`
基类:`object`
* **说明**
`Matcher` 规则类,当事件传递时,在 `Matcher` 运行前进行检查。
* **示例**
```python
Permission(async_function) | sync_function
# 等价于
from nonebot.utils import run_sync
Permission(async_function, run_sync(sync_function))
```
### `__init__(*checkers)`
* **参数**
* `*checkers: Callable[[Bot, Event], Awaitable[bool]]`: **异步** PermissionChecker
### `checkers`
* **说明**
存储 `PermissionChecker`
* **类型**
* `Set[Callable[[Bot, Event], Awaitable[bool]]]`
### _async_ `__call__(bot, event)`
* **说明**
检查是否满足某个权限
* **参数**
* `bot: Bot`: Bot 对象
* `event: Event`: Event 对象
* **返回**
* `bool`
## `MESSAGE` ## `MESSAGE`
@@ -38,84 +112,26 @@ sidebarDepth: 0
* **说明**: 匹配任意 `meta_event` 类型事件,仅在需要同时捕获不同类型事件时使用。优先使用 meta_event type 的 Matcher。 * **说明**: 匹配任意 `meta_event` 类型事件,仅在需要同时捕获不同类型事件时使用。优先使用 meta_event type 的 Matcher。
## `USER(*user, perm=<nonebot.permission.Permission object>)` ## `USER(*user, perm=None)`
* **说明** * **说明**
在白名单内且满足 perm `event``session_id` 在白名单内且满足 perm
* **参数** * **参数**
* `*user: int`: 白名单 * `*user: str`: 白名单
* `perm: Permission`: 需要同时满足的权限 * `perm: Optional[Permission]`: 需要同时满足的权限
## `PRIVATE`
* **说明**: 匹配任意私聊消息类型事件
## `PRIVATE_FRIEND`
* **说明**: 匹配任意好友私聊消息类型事件
## `PRIVATE_GROUP`
* **说明**: 匹配任意群临时私聊消息类型事件
## `PRIVATE_OTHER`
* **说明**: 匹配任意其他私聊消息类型事件
## `GROUP`
* **说明**: 匹配任意群聊消息类型事件
## `GROUP_MEMBER`
* **说明**: 匹配任意群员群聊消息类型事件
:::warning 警告
该权限通过 event.sender 进行判断且不包含管理员以及群主!
:::
## `GROUP_ADMIN`
* **说明**: 匹配任意群管理员群聊消息类型事件
## `GROUP_OWNER`
* **说明**: 匹配任意群主群聊消息类型事件
## `SUPERUSER` ## `SUPERUSER`
* **说明**: 匹配任意超级用户消息类型事件 * **说明**: 匹配任意超级用户消息类型事件
## `EVERYBODY`
* **说明**: 匹配任意消息类型事件

View File

@@ -25,38 +25,6 @@ sidebarDepth: 0
## _class_ `Export`
基类:`dict`
* **说明**
插件导出内容以使得其他插件可以获得。
* **示例**
```python
nonebot.export().default = "bar"
@nonebot.export()
def some_function():
pass
# this doesn't work before python 3.9
# use
# export = nonebot.export(); @export.sub
# instead
# See also PEP-614: https://www.python.org/dev/peps/pep-0614/
@nonebot.export().sub
def something_else():
pass
```
## _class_ `Plugin` ## _class_ `Plugin`
基类:`object` 基类:`object`
@@ -82,16 +50,7 @@ def something_else():
* **说明**: 插件模块对象 * **说明**: 插件模块对象
### `matcher` ### _property_ `export`
* **类型**: `Set[Type[Matcher]]`
* **说明**: 插件内定义的 `Matcher`
### `export`
* **类型**: `Export` * **类型**: `Export`
@@ -100,6 +59,15 @@ def something_else():
* **说明**: 插件内定义的导出内容 * **说明**: 插件内定义的导出内容
### _property_ `matcher`
* **类型**: `Set[Type[Matcher]]`
* **说明**: 插件内定义的 `Matcher`
## `on(type='', rule=None, permission=None, *, handlers=None, temp=False, priority=1, block=False, state=None, state_factory=None)` ## `on(type='', rule=None, permission=None, *, handlers=None, temp=False, priority=1, block=False, state=None, state_factory=None)`
@@ -121,7 +89,7 @@ def something_else():
* `permission: Optional[Permission]`: 事件响应权限 * `permission: Optional[Permission]`: 事件响应权限
* `handlers: Optional[List[T_Handler]]`: 事件处理函数列表 * `handlers: Optional[List[Union[T_Handler, Handler]]]`: 事件处理函数列表
* `temp: bool`: 是否为临时事件响应器(仅执行一次) * `temp: bool`: 是否为临时事件响应器(仅执行一次)
@@ -162,7 +130,7 @@ def something_else():
* `rule: Optional[Union[Rule, T_RuleChecker]]`: 事件响应规则 * `rule: Optional[Union[Rule, T_RuleChecker]]`: 事件响应规则
* `handlers: Optional[List[T_Handler]]`: 事件处理函数列表 * `handlers: Optional[List[Union[T_Handler, Handler]]]`: 事件处理函数列表
* `temp: bool`: 是否为临时事件响应器(仅执行一次) * `temp: bool`: 是否为临时事件响应器(仅执行一次)
@@ -206,7 +174,7 @@ def something_else():
* `permission: Optional[Permission]`: 事件响应权限 * `permission: Optional[Permission]`: 事件响应权限
* `handlers: Optional[List[T_Handler]]`: 事件处理函数列表 * `handlers: Optional[List[Union[T_Handler, Handler]]]`: 事件处理函数列表
* `temp: bool`: 是否为临时事件响应器(仅执行一次) * `temp: bool`: 是否为临时事件响应器(仅执行一次)
@@ -247,7 +215,7 @@ def something_else():
* `rule: Optional[Union[Rule, T_RuleChecker]]`: 事件响应规则 * `rule: Optional[Union[Rule, T_RuleChecker]]`: 事件响应规则
* `handlers: Optional[List[T_Handler]]`: 事件处理函数列表 * `handlers: Optional[List[Union[T_Handler, Handler]]]`: 事件处理函数列表
* `temp: bool`: 是否为临时事件响应器(仅执行一次) * `temp: bool`: 是否为临时事件响应器(仅执行一次)
@@ -288,7 +256,7 @@ def something_else():
* `rule: Optional[Union[Rule, T_RuleChecker]]`: 事件响应规则 * `rule: Optional[Union[Rule, T_RuleChecker]]`: 事件响应规则
* `handlers: Optional[List[T_Handler]]`: 事件处理函数列表 * `handlers: Optional[List[Union[T_Handler, Handler]]]`: 事件处理函数列表
* `temp: bool`: 是否为临时事件响应器(仅执行一次) * `temp: bool`: 是否为临时事件响应器(仅执行一次)
@@ -314,7 +282,7 @@ def something_else():
## `on_startswith(msg, rule=None, **kwargs)` ## `on_startswith(msg, rule=None, ignorecase=False, **kwargs)`
* **说明** * **说明**
@@ -326,16 +294,19 @@ def something_else():
* **参数** * **参数**
* `msg: str`: 指定消息开头内容 * `msg: Union[str, Tuple[str, ...]]`: 指定消息开头内容
* `rule: Optional[Union[Rule, T_RuleChecker]]`: 事件响应规则 * `rule: Optional[Union[Rule, T_RuleChecker]]`: 事件响应规则
* `ignorecase: bool`: 是否忽略大小写
* `permission: Optional[Permission]`: 事件响应权限 * `permission: Optional[Permission]`: 事件响应权限
* `handlers: Optional[List[T_Handler]]`: 事件处理函数列表 * `handlers: Optional[List[Union[T_Handler, Handler]]]`: 事件处理函数列表
* `temp: bool`: 是否为临时事件响应器(仅执行一次) * `temp: bool`: 是否为临时事件响应器(仅执行一次)
@@ -361,7 +332,7 @@ def something_else():
## `on_endswith(msg, rule=None, **kwargs)` ## `on_endswith(msg, rule=None, ignorecase=False, **kwargs)`
* **说明** * **说明**
@@ -373,16 +344,19 @@ def something_else():
* **参数** * **参数**
* `msg: str`: 指定消息结尾内容 * `msg: Union[str, Tuple[str, ...]]`: 指定消息结尾内容
* `rule: Optional[Union[Rule, T_RuleChecker]]`: 事件响应规则 * `rule: Optional[Union[Rule, T_RuleChecker]]`: 事件响应规则
* `ignorecase: bool`: 是否忽略大小写
* `permission: Optional[Permission]`: 事件响应权限 * `permission: Optional[Permission]`: 事件响应权限
* `handlers: Optional[List[T_Handler]]`: 事件处理函数列表 * `handlers: Optional[List[Union[T_Handler, Handler]]]`: 事件处理函数列表
* `temp: bool`: 是否为临时事件响应器(仅执行一次) * `temp: bool`: 是否为临时事件响应器(仅执行一次)
@@ -429,7 +403,7 @@ def something_else():
* `permission: Optional[Permission]`: 事件响应权限 * `permission: Optional[Permission]`: 事件响应权限
* `handlers: Optional[List[T_Handler]]`: 事件处理函数列表 * `handlers: Optional[List[Union[T_Handler, Handler]]]`: 事件处理函数列表
* `temp: bool`: 是否为临时事件响应器(仅执行一次) * `temp: bool`: 是否为临时事件响应器(仅执行一次)
@@ -481,7 +455,7 @@ def something_else():
* `permission: Optional[Permission]`: 事件响应权限 * `permission: Optional[Permission]`: 事件响应权限
* `handlers: Optional[List[T_Handler]]`: 事件处理函数列表 * `handlers: Optional[List[Union[T_Handler, Handler]]]`: 事件处理函数列表
* `temp: bool`: 是否为临时事件响应器(仅执行一次) * `temp: bool`: 是否为临时事件响应器(仅执行一次)
@@ -538,7 +512,7 @@ def something_else():
* `permission: Optional[Permission]`: 事件响应权限 * `permission: Optional[Permission]`: 事件响应权限
* `handlers: Optional[List[T_Handler]]`: 事件处理函数列表 * `handlers: Optional[List[Union[T_Handler, Handler]]]`: 事件处理函数列表
* `temp: bool`: 是否为临时事件响应器(仅执行一次) * `temp: bool`: 是否为临时事件响应器(仅执行一次)
@@ -590,7 +564,7 @@ def something_else():
* `permission: Optional[Permission]`: 事件响应权限 * `permission: Optional[Permission]`: 事件响应权限
* `handlers: Optional[List[T_Handler]]`: 事件处理函数列表 * `handlers: Optional[List[Union[T_Handler, Handler]]]`: 事件处理函数列表
* `temp: bool`: 是否为临时事件响应器(仅执行一次) * `temp: bool`: 是否为临时事件响应器(仅执行一次)
@@ -695,7 +669,7 @@ def something_else():
* `cmd: Union[str, Tuple[str, ...]]`: 命令前缀 * `cmd: Union[str, Tuple[str, ...]]`: 命令前缀
* `**kwargs`: 其他传递给 `on_command` 的参数,将会覆盖命令组默认值 * `**kwargs`: 其他传递给 `on_shell_command` 的参数,将会覆盖命令组默认值
@@ -767,7 +741,7 @@ def something_else():
* `permission: Optional[Permission]`: 事件响应权限 * `permission: Optional[Permission]`: 事件响应权限
* `handlers: Optional[List[T_Handler]]`: 事件处理函数列表 * `handlers: Optional[List[Union[T_Handler, Handler]]]`: 事件处理函数列表
* `temp: bool`: 是否为临时事件响应器(仅执行一次) * `temp: bool`: 是否为临时事件响应器(仅执行一次)
@@ -808,7 +782,7 @@ def something_else():
* `rule: Optional[Union[Rule, T_RuleChecker]]`: 事件响应规则 * `rule: Optional[Union[Rule, T_RuleChecker]]`: 事件响应规则
* `handlers: Optional[List[T_Handler]]`: 事件处理函数列表 * `handlers: Optional[List[Union[T_Handler, Handler]]]`: 事件处理函数列表
* `temp: bool`: 是否为临时事件响应器(仅执行一次) * `temp: bool`: 是否为临时事件响应器(仅执行一次)
@@ -852,7 +826,7 @@ def something_else():
* `permission: Optional[Permission]`: 事件响应权限 * `permission: Optional[Permission]`: 事件响应权限
* `handlers: Optional[List[T_Handler]]`: 事件处理函数列表 * `handlers: Optional[List[Union[T_Handler, Handler]]]`: 事件处理函数列表
* `temp: bool`: 是否为临时事件响应器(仅执行一次) * `temp: bool`: 是否为临时事件响应器(仅执行一次)
@@ -893,7 +867,7 @@ def something_else():
* `rule: Optional[Union[Rule, T_RuleChecker]]`: 事件响应规则 * `rule: Optional[Union[Rule, T_RuleChecker]]`: 事件响应规则
* `handlers: Optional[List[T_Handler]]`: 事件处理函数列表 * `handlers: Optional[List[Union[T_Handler, Handler]]]`: 事件处理函数列表
* `temp: bool`: 是否为临时事件响应器(仅执行一次) * `temp: bool`: 是否为临时事件响应器(仅执行一次)
@@ -934,7 +908,7 @@ def something_else():
* `rule: Optional[Union[Rule, T_RuleChecker]]`: 事件响应规则 * `rule: Optional[Union[Rule, T_RuleChecker]]`: 事件响应规则
* `handlers: Optional[List[T_Handler]]`: 事件处理函数列表 * `handlers: Optional[List[Union[T_Handler, Handler]]]`: 事件处理函数列表
* `temp: bool`: 是否为临时事件响应器(仅执行一次) * `temp: bool`: 是否为临时事件响应器(仅执行一次)
@@ -972,7 +946,10 @@ def something_else():
* **参数** * **参数**
* `msg: str`: 指定消息开头内容 * `msg: Union[str, Tuple[str, ...]]`: 指定消息开头内容
* `ignorecase: bool`: 是否忽略大小写
* `rule: Optional[Union[Rule, T_RuleChecker]]`: 事件响应规则 * `rule: Optional[Union[Rule, T_RuleChecker]]`: 事件响应规则
@@ -981,7 +958,7 @@ def something_else():
* `permission: Optional[Permission]`: 事件响应权限 * `permission: Optional[Permission]`: 事件响应权限
* `handlers: Optional[List[T_Handler]]`: 事件处理函数列表 * `handlers: Optional[List[Union[T_Handler, Handler]]]`: 事件处理函数列表
* `temp: bool`: 是否为临时事件响应器(仅执行一次) * `temp: bool`: 是否为临时事件响应器(仅执行一次)
@@ -1019,7 +996,10 @@ def something_else():
* **参数** * **参数**
* `msg: str`: 指定消息结尾内容 * `msg: Union[str, Tuple[str, ...]]`: 指定消息结尾内容
* `ignorecase: bool`: 是否忽略大小写
* `rule: Optional[Union[Rule, T_RuleChecker]]`: 事件响应规则 * `rule: Optional[Union[Rule, T_RuleChecker]]`: 事件响应规则
@@ -1028,7 +1008,7 @@ def something_else():
* `permission: Optional[Permission]`: 事件响应权限 * `permission: Optional[Permission]`: 事件响应权限
* `handlers: Optional[List[T_Handler]]`: 事件处理函数列表 * `handlers: Optional[List[Union[T_Handler, Handler]]]`: 事件处理函数列表
* `temp: bool`: 是否为临时事件响应器(仅执行一次) * `temp: bool`: 是否为临时事件响应器(仅执行一次)
@@ -1075,7 +1055,7 @@ def something_else():
* `permission: Optional[Permission]`: 事件响应权限 * `permission: Optional[Permission]`: 事件响应权限
* `handlers: Optional[List[T_Handler]]`: 事件处理函数列表 * `handlers: Optional[List[Union[T_Handler, Handler]]]`: 事件处理函数列表
* `temp: bool`: 是否为临时事件响应器(仅执行一次) * `temp: bool`: 是否为临时事件响应器(仅执行一次)
@@ -1127,7 +1107,7 @@ def something_else():
* `permission: Optional[Permission]`: 事件响应权限 * `permission: Optional[Permission]`: 事件响应权限
* `handlers: Optional[List[T_Handler]]`: 事件处理函数列表 * `handlers: Optional[List[Union[T_Handler, Handler]]]`: 事件处理函数列表
* `temp: bool`: 是否为临时事件响应器(仅执行一次) * `temp: bool`: 是否为临时事件响应器(仅执行一次)
@@ -1184,7 +1164,7 @@ def something_else():
* `permission: Optional[Permission]`: 事件响应权限 * `permission: Optional[Permission]`: 事件响应权限
* `handlers: Optional[List[T_Handler]]`: 事件处理函数列表 * `handlers: Optional[List[Union[T_Handler, Handler]]]`: 事件处理函数列表
* `temp: bool`: 是否为临时事件响应器(仅执行一次) * `temp: bool`: 是否为临时事件响应器(仅执行一次)
@@ -1236,7 +1216,7 @@ def something_else():
* `permission: Optional[Permission]`: 事件响应权限 * `permission: Optional[Permission]`: 事件响应权限
* `handlers: Optional[List[T_Handler]]`: 事件处理函数列表 * `handlers: Optional[List[Union[T_Handler, Handler]]]`: 事件处理函数列表
* `temp: bool`: 是否为临时事件响应器(仅执行一次) * `temp: bool`: 是否为临时事件响应器(仅执行一次)
@@ -1267,7 +1247,7 @@ def something_else():
* **说明** * **说明**
使用 `importlib` 加载单个插件,可以是本地插件或是通过 `pip` 安装的插件。 使用 `PluginManager` 加载单个插件,可以是本地插件或是通过 `pip` 安装的插件。
@@ -1308,6 +1288,85 @@ def something_else():
## `load_all_plugins(module_path, plugin_dir)`
* **说明**
导入指定列表中的插件以及指定目录下多个插件,以 `_` 开头的插件不会被导入!
* **参数**
* `module_path: Set[str]`: 指定插件集合
* `plugin_dir: Set[str]`: 指定插件路径集合
* **返回**
* `Set[Plugin]`
## `load_from_json(file_path, encoding='utf-8')`
* **说明**
导入指定 json 文件中的 `plugins` 以及 `plugin_dirs` 下多个插件,以 `_` 开头的插件不会被导入!
* **参数**
* `file_path: str`: 指定 json 文件路径
* `encoding: str`: 指定 json 文件编码
* **返回**
* `Set[Plugin]`
## `load_from_toml(file_path, encoding='utf-8')`
* **说明**
导入指定 toml 文件 `[nonebot.plugins]` 中的 `plugins` 以及 `plugin_dirs` 下多个插件,
`_` 开头的插件不会被导入!
* **参数**
* `file_path: str`: 指定 toml 文件路径
* `encoding: str`: 指定 toml 文件编码
* **返回**
* `Set[Plugin]`
## `load_builtin_plugins(name='echo')` ## `load_builtin_plugins(name='echo')`
@@ -1363,22 +1422,6 @@ def something_else():
## `export()`
* **说明**
获取插件的导出内容对象
* **返回**
* `Export`
## `require(name)` ## `require(name)`
@@ -1399,3 +1442,51 @@ def something_else():
* `Optional[Export]` * `Optional[Export]`
## _class_ `Export`
基类:`dict`
* **说明**
插件导出内容以使得其他插件可以获得。
* **示例**
```python
nonebot.export().default = "bar"
@nonebot.export()
def some_function():
pass
# this doesn't work before python 3.9
# use
# export = nonebot.export(); @export.sub
# instead
# See also PEP-614: https://www.python.org/dev/peps/pep-0614/
@nonebot.export().sub
def something_else():
pass
```
## `export()`
* **说明**
获取插件的导出内容对象
* **返回**
* `Export`

View File

@@ -91,7 +91,7 @@ Rule(async_function, run_sync(sync_function))
## `startswith(msg)` ## `startswith(msg, ignorecase=False)`
* **说明** * **说明**
@@ -107,7 +107,7 @@ Rule(async_function, run_sync(sync_function))
## `endswith(msg)` ## `endswith(msg, ignorecase=False)`
* **说明** * **说明**

View File

@@ -46,7 +46,7 @@ sidebarDepth: 0
## `T_WebSocketConnectionHook` ## `T_BotConnectionHook`
* **类型** * **类型**
@@ -57,12 +57,12 @@ sidebarDepth: 0
* **说明** * **说明**
WebSocket 连接建立时执行的函数 Bot 连接建立时执行的函数
## `T_WebSocketDisconnectionHook` ## `T_BotDisconnectionHook`
* **类型** * **类型**
@@ -73,7 +73,39 @@ sidebarDepth: 0
* **说明** * **说明**
WebSocket 连接断开时执行的函数 Bot 连接断开时执行的函数
## `T_CallingAPIHook`
* **类型**
`Callable[[Bot, str, Dict[str, Any]], Awaitable[None]]`
* **说明**
`bot.call_api` 时执行的函数
## `T_CalledAPIHook`
* **类型**
`Callable[[Bot, Optional[Exception], str, Dict[str, Any], Any], Awaitable[None]]`
* **说明**
`bot.call_api` 后执行的函数,参数分别为 bot, exception, api, data, result
@@ -212,3 +244,35 @@ sidebarDepth: 0
* **说明** * **说明**
ArgsParser 即消息参数解析函数,在 Matcher.got 获取参数时被运行。 ArgsParser 即消息参数解析函数,在 Matcher.got 获取参数时被运行。
## `T_TypeUpdater`
* **类型**
`Callable[[Bot, Event, T_State, str], Awaitable[str]]`
* **说明**
TypeUpdater 在 Matcher.pause, Matcher.reject 时被运行,用于更新响应的事件类型。默认会更新为 `message`
## `T_PermissionUpdater`
* **类型**
`Callable[[Bot, Event, T_State, Permission], Awaitable[Permission]]`
* **说明**
PermissionUpdater 在 Matcher.pause, Matcher.reject 时被运行,用于更新会话对象权限。默认会更新为当前事件的触发对象。

View File

@@ -52,7 +52,18 @@ sidebarDepth: 0
## `logger_wrapper` ## _class_ `DataclassEncoder`
基类:`json.encoder.JSONEncoder`
* **说明**
在JSON序列化 `Message` (List[Dataclass]) 时使用的 `JSONEncoder`
## `logger_wrapper(logger_name)`
* **说明** * **说明**
@@ -72,13 +83,3 @@ sidebarDepth: 0
* `exception: Optional[Exception]`: 异常信息 * `exception: Optional[Exception]`: 异常信息
## _class_ `DataclassEncoder`
基类:`json.encoder.JSONEncoder`
* **说明**
在JSON序列化 `Message` (List[Dataclass]) 时使用的 `JSONEncoder`

View File

@@ -8,15 +8,13 @@
初次使用时可能会觉得这里的概览过于枯燥,可以先简单略读之后直接前往 [安装](./installation.md) 查看安装方法,并进行后续的基础使用教程。 初次使用时可能会觉得这里的概览过于枯燥,可以先简单略读之后直接前往 [安装](./installation.md) 查看安装方法,并进行后续的基础使用教程。
::: :::
## 简介
NoneBot2 是一个可扩展的 Python 异步机器人框架,它会对机器人收到的事件进行解析和处理,并以插件化的形式,按优先级分发给事件所对应的事件响应器,来完成具体的功能。 NoneBot2 是一个可扩展的 Python 异步机器人框架,它会对机器人收到的事件进行解析和处理,并以插件化的形式,按优先级分发给事件所对应的事件响应器,来完成具体的功能。
除了起到解析事件的作用NoneBot 还为插件提供了大量实用的预设操作和权限控制机制。对于命令处理,它更是提供了完善且易用的会话机制和内部调用机制,以分别适应命令的连续交互和插件内部功能复用等需求。 除了起到解析事件的作用NoneBot 还为插件提供了大量实用的预设操作和权限控制机制。对于命令处理,它更是提供了完善且易用的会话机制和内部调用机制,以分别适应命令的连续交互和插件内部功能复用等需求。
得益于 Python 的 [asyncio](https://docs.python.org/3/library/asyncio.html) 机制NoneBot 处理事件的吞吐量有了很大的保障,再配合 WebSocket 通信方式也是最建议的通信方式NoneBot 的性能可以达到 HTTP 通信方式的两倍以上,相较于传统同步 I/O 的 HTTP 通信,更是有质的飞跃。 得益于 Python 的 [asyncio](https://docs.python.org/3/library/asyncio.html) 机制NoneBot 处理事件的吞吐量有了很大的保障,再配合 WebSocket 通信方式也是最建议的通信方式NoneBot 的性能可以达到 HTTP 通信方式的两倍以上,相较于传统同步 I/O 的 HTTP 通信,更是有质的飞跃。
需要注意的是NoneBot 仅支持 **Python 3.7+** 需要注意的是NoneBot 仅支持 **Python 3.7.3 以上版本**
## 特色 ## 特色

View File

@@ -1,5 +1,11 @@
# CQHTTP 协议使用指南 # CQHTTP 协议使用指南
## 安装 NoneBot CQHTTP 适配器
```bash
pip install nonebot-adapter-cqhttp
```
## 配置 CQHTTP 协议端(以 QQ 为例) ## 配置 CQHTTP 协议端(以 QQ 为例)
单纯运行 NoneBot 实例并不会产生任何效果,因为此刻 QQ 这边还不知道 NoneBot 的存在,也就无法把消息发送给它,因此现在需要使用一个无头 QQ 来把消息等事件上报给 NoneBot。 单纯运行 NoneBot 实例并不会产生任何效果,因为此刻 QQ 这边还不知道 NoneBot 的存在,也就无法把消息发送给它,因此现在需要使用一个无头 QQ 来把消息等事件上报给 NoneBot。
@@ -7,10 +13,10 @@
QQ 协议端举例: QQ 协议端举例:
- [go-cqhttp](https://github.com/Mrs4s/go-cqhttp) (基于 [MiraiGo](https://github.com/Mrs4s/MiraiGo)) - [go-cqhttp](https://github.com/Mrs4s/go-cqhttp) (基于 [MiraiGo](https://github.com/Mrs4s/MiraiGo))
- [cqhttp-mirai-embedded](https://github.com/yyuueexxiinngg/cqhttp-mirai/tree/embedded) - [onebot-kotlin](https://github.com/yyuueexxiinngg/onebot-kotlin)
- [Mirai](https://github.com/mamoe/mirai) + [cqhttp-mirai](https://github.com/yyuueexxiinngg/cqhttp-mirai) - [Mirai](https://github.com/mamoe/mirai) + [onebot-mirai](https://github.com/yyuueexxiinngg/onebot-kotlin)
- [Mirai](https://github.com/mamoe/mirai) + [Mirai Native](https://github.com/iTXTech/mirai-native) + [CQHTTP](https://github.com/richardchien/coolq-http-api) - [Mirai](https://github.com/mamoe/mirai) + [Mirai Native](https://github.com/iTXTech/mirai-native) + [CQHTTP](https://github.com/richardchien/coolq-http-api)
- [OICQ-http-api](https://github.com/takayama-lily/onebot) (基于 [OICQ](https://github.com/takayama-lily/oicq)) - [node-onebot](https://github.com/takayama-lily/node-onebot) (基于 [abot](https://github.com/takayama-lily/abot), [OICQ](https://github.com/takayama-lily/oicq))
这里以 [go-cqhttp](https://github.com/Mrs4s/go-cqhttp) 为例 这里以 [go-cqhttp](https://github.com/Mrs4s/go-cqhttp) 为例
@@ -18,65 +24,75 @@ QQ 协议端举例:
2. 运行 exe 文件或者使用 `./go-cqhttp` 启动 2. 运行 exe 文件或者使用 `./go-cqhttp` 启动
3. 生成默认配置文件并修改默认配置 3. 生成默认配置文件并修改默认配置
```hjson{2,3,35-36,42} ### 选项 1 反向 WebSocket 连接
{
```yml{2,3,6,10}
account:
uin: 机器人QQ号 uin: 机器人QQ号
password: 机器人密码 password: "机器人密码"
encrypt_password: false
password_encrypted: "" message:
enable_db: true post-format: array
access_token: ""
relogin: { servers:
enabled: true - ws-reverse:
relogin_delay: 3 universal: ws://127.0.0.1:8080/cqhttp/ws
max_relogin_times: 0
}
_rate_limit: {
enabled: false
frequency: 1
bucket_size: 1
}
ignore_invalid_cqcode: false
force_fragmented: false
heartbeat_interval: 0
http_config: {
enabled: false
host: "0.0.0.0"
port: 5700
timeout: 0
post_urls: {}
}
ws_config: {
enabled: false
host: "0.0.0.0"
port: 6700
}
ws_reverse_servers: [
{
enabled: true
reverse_url: ws://127.0.0.1:8080/cqhttp/ws
reverse_api_url: ws://you_websocket_api.server
reverse_event_url: ws://you_websocket_event.server
reverse_reconnect_interval: 3000
}
]
post_message_format: array
use_sso_address: false
debug: false
log_level: ""
web_ui: {
enabled: false
host: 127.0.0.1
web_ui_port: 9999
web_input: false
}
}
``` ```
其中 `ws://127.0.0.1:8080/cqhttp/ws` 中的 `127.0.0.1``8080` 应分别对应 nonebot 配置的 HOST 和 PORT。 其中 `ws://127.0.0.1:8080/cqhttp/ws` 中的 `127.0.0.1``8080` 应分别对应 nonebot 配置的 HOST 和 PORT。
`cqhttp` 是前述 `register_adapter` 时传入的第一个参数,代表设置的 `CQHTTPBot` 适配器的路径,你可以对不同的适配器设置不同路径以作区别。 `cqhttp` 是前述 `register_adapter` 时传入的第一个参数,代表设置的 `CQHTTPBot` 适配器的路径,你可以对不同的适配器设置不同路径以作区别。
### 选项 2 HTTP POST 上报
```yml{2,3,6,11}
account:
uin: 机器人QQ号
password: "机器人密码"
message:
post-format: array
servers:
- http:
post:
- url: "http://127.0.0.1:8080/cqhttp/http"
secret: ""
```
其中 `ws://127.0.0.1:8080/cqhttp/http` 中的 `127.0.0.1``8080` 应分别对应 nonebot 配置的 HOST 和 PORT。
`cqhttp` 是前述 `register_adapter` 时传入的第一个参数,代表设置的 `CQHTTPBot` 适配器的路径,你可以对不同的适配器设置不同路径以作区别。
### 选项 3 正向 WebSocket 连接
```yml{2,3,6,10,11}
account:
uin: 机器人QQ号
password: "机器人密码"
message:
post-format: array
servers:
- ws:
host: 127.0.0.1
port: 6700
```
NoneBot 配置
```dotenv
CQHTTP_WS_URLS={"机器人QQ号": "ws://127.0.0.1:6700/"}
```
其中 `ws://127.0.0.1:6700/` 中的 `127.0.0.1``6700` 应分别对应 go-cqhttp 配置的 HOST 和 PORT。
正向连接可以选择支持客户端连接方式的 `Driver` 来进行连接,请根据需求进行选择:
- `nonebot.drivers.fastapi`: 同时支持正向和反向
- `nonebot.drivers.aiohttp`: 仅支持正向
## 历史性的第一次对话 ## 历史性的第一次对话
一旦新的配置文件正确生效之后NoneBot 所在的控制台(如果正在运行的话)应该会输出类似下面的内容(两条访问日志): 一旦新的配置文件正确生效之后NoneBot 所在的控制台(如果正在运行的话)应该会输出类似下面的内容(两条访问日志):

View File

@@ -43,7 +43,7 @@ async def handle_city(bot: Bot, event: Event, state: T_State):
指示 NoneBot 接收一条新的用户消息后继续执行该处理函数。此时函数将会接收到新的消息而非前一条消息,之前相关信息可以存储在 state 中。 指示 NoneBot 接收一条新的用户消息后继续执行该处理函数。此时函数将会接收到新的消息而非前一条消息,之前相关信息可以存储在 state 中。
特别,当装饰的函数前没有其他事件处理函数,那么 `receive()` 不会接收一条新的消息而是直接使用第一条接收到的消息。 特别,当装饰的函数前没有其他事件处理函数,那么 `receive()` 不会接收一条新的消息而是直接使用第一条接收到的消息。
#### got(key, prompt, args_parser) #### got(key, prompt, args_parser)

View File

@@ -101,6 +101,8 @@ nb plugin install nonebot_plugin_test
NoneBot 内置的事件响应器中,所有 `message` 类的事件响应器默认会阻断事件传递,其他则不会。 NoneBot 内置的事件响应器中,所有 `message` 类的事件响应器默认会阻断事件传递,其他则不会。
在部分情况中,可以使用 `matcher.stop_propagation()` 方法动态阻止事件传播,该方法需要 `handler` 在参数中获取 `matcher` 实例后调用方法。
## 自定义 rule ## 自定义 rule
rule 的出现使得 nonebot 对事件的响应可以非常自由nonebot 内置了一些规则: rule 的出现使得 nonebot 对事件的响应可以非常自由nonebot 内置了一些规则:

View File

@@ -8,7 +8,7 @@
nb plugin new nb plugin new
``` ```
插件通常有两种形式,下面分别介绍 下面分别对两种通常的插件形式做具体介绍
## 单文件形式 ## 单文件形式

View File

@@ -34,6 +34,13 @@ AweSome-Bot
## 启动 Bot ## 启动 Bot
:::warning 提示
如果您使用如 `VSCode` / `PyCharm` 等 IDE 启动 nonebot请检查 IDE 当前工作空间目录是否与当前侧边栏打开目录一致。
- 注意:在二者不一致的环境下可能导致 nonebot 读取配置文件和插件等不符合预期
:::
通过 `nb-cli` 通过 `nb-cli`
```bash ```bash

Some files were not shown because too many files have changed in this diff Show More