mirror of
https://github.com/nonebot/nonebot2.git
synced 2025-10-08 03:36:44 +00:00
Compare commits
561 Commits
Author | SHA1 | Date | |
---|---|---|---|
|
cfd992b6b1 | ||
|
6ec1159f95 | ||
|
38ac45f687 | ||
|
1331cbf8a3 | ||
|
a6fc0e408c | ||
|
66b2153493 | ||
|
94b98b74b9 | ||
|
f3abd2f1a3 | ||
|
1280cf9ba3 | ||
|
bac56635c0 | ||
|
6d9caadffc | ||
|
4a7c07a7ac | ||
|
910d18e79f | ||
|
5cff80812e | ||
|
c8a8ff28ec | ||
|
292b8e6366 | ||
|
9e9608abd8 | ||
|
3452880b16 | ||
|
ef2c98c6af | ||
|
246b8ccbe7 | ||
|
2355c6385d | ||
|
75811c0b64 | ||
|
3a510e3888 | ||
|
161cfbe1b8 | ||
|
0b08d23e34 | ||
|
2ebf7fc096 | ||
|
041b59011b | ||
|
92a411e3b4 | ||
|
81cbf84dca | ||
|
4364685b30 | ||
|
cfdebb30b7 | ||
|
049d14295e | ||
|
3dc93f7997 | ||
|
b19c2e4191 | ||
|
d121a2080b | ||
|
919e3ebf8c | ||
|
b0f4b8ffa1 | ||
|
b3bf9470cf | ||
|
16029a33e8 | ||
|
b31d04dc5d | ||
|
e0f73ba193 | ||
|
0b35d5e724 | ||
|
c747342709 | ||
|
244df12069 | ||
|
368afe6d63 | ||
|
5cd61c09a8 | ||
|
1e55fbf6b1 | ||
|
463ff260c4 | ||
|
89e32a3241 | ||
|
4f8771acbd | ||
|
a212baf90b | ||
|
5db8b124ab | ||
|
a273d75b07 | ||
|
55a402203e | ||
|
64967e8807 | ||
|
43917b5aad | ||
|
b97133fb59 | ||
|
855f61d837 | ||
|
e2003e27df | ||
|
d82749c48e | ||
|
0a802f9b13 | ||
|
e0610fdcc0 | ||
|
20d0ecfc7f | ||
|
fa15e5b0ee | ||
|
d9cc912ccb | ||
|
09d9f414ce | ||
|
ca09fb8372 | ||
|
b25a0387ba | ||
|
9931563d80 | ||
|
53a576dae5 | ||
|
44d13acc81 | ||
|
59f567004f | ||
|
956e581d72 | ||
|
b635d01519 | ||
|
12c1f6d764 | ||
|
b66a4df4c5 | ||
|
46c61df081 | ||
|
b6ec81c21d | ||
|
f9f2f1b0bd | ||
|
45396e3163 | ||
|
7ced508f9d | ||
|
ed1f1c27e2 | ||
|
3fa75b1c78 | ||
|
258ef670e2 | ||
|
5cf665fa21 | ||
|
116f16b470 | ||
|
9518e3c568 | ||
|
57827ea4bb | ||
|
8e41422055 | ||
|
fcd168fd3e | ||
|
fe1bd87ff8 | ||
|
efe1615d16 | ||
|
ca26609308 | ||
|
01e818f6a4 | ||
|
1c73a9adfa | ||
|
a739b93561 | ||
|
7cfdc2dd37 | ||
|
a6ff3711bb | ||
|
58d10abd32 | ||
|
f0bc47ec5e | ||
|
b5f2b1a76d | ||
|
4f4a072dd7 | ||
|
fff7d3bff6 | ||
|
474fd10613 | ||
|
9bea710e45 | ||
|
3c76c6ff8b | ||
|
a8a61623d2 | ||
|
24ce531598 | ||
|
a6be0c370f | ||
|
22c7371f2e | ||
|
bfb77e9cdf | ||
|
9aa346fb1f | ||
|
1dfe5d49fc | ||
|
e48788e41f | ||
|
802c39da32 | ||
|
0d23a9ab8d | ||
|
109cae6dac | ||
|
f63ef8d23b | ||
|
3d4d3b0f24 | ||
|
a3fa1a36c9 | ||
|
45cec05bbc | ||
|
e4d1462585 | ||
|
18c6bea451 | ||
|
c4e3309026 | ||
|
57a60ae45b | ||
|
e7f5097e17 | ||
|
e437c13bb3 | ||
|
edd7f3ccc8 | ||
|
26f0d66017 | ||
|
5791018af1 | ||
|
2c6b41f62c | ||
|
f2b23f1b44 | ||
|
a534f7b58c | ||
|
81398bb803 | ||
|
3a0265b0f6 | ||
|
59db66ef27 | ||
|
a04957a354 | ||
|
371cfd4a0e | ||
|
037a5ccce0 | ||
|
879767df01 | ||
|
31b18e36e7 | ||
|
eb3e20abfb | ||
|
b96823b5bd | ||
|
b098c8477b | ||
|
02b2589eeb | ||
|
05ea21becd | ||
|
2836f50e74 | ||
|
7b3d66cd2a | ||
|
ceebe0e95d | ||
|
2fe01f33e0 | ||
|
410266acb1 | ||
|
02924d56cd | ||
|
0bd8d4fbbc | ||
|
547bebebd9 | ||
|
f8703557a0 | ||
|
8e97a84ad8 | ||
|
3564228183 | ||
|
bb93757f51 | ||
|
e18b3d04fb | ||
|
458085b317 | ||
|
832875e7cf | ||
|
73762e65bb | ||
|
26e627c36c | ||
|
8b93dc7769 | ||
|
6cfd44224d | ||
|
dc8b7887d7 | ||
|
18f98e4cbc | ||
|
db73d2b621 | ||
|
7a3cd8c395 | ||
|
358528b495 | ||
|
cda1ad093f | ||
|
f48c61c2e0 | ||
|
571cdef826 | ||
|
0ce3ee6c20 | ||
|
600fc4fffd | ||
|
c1b10a0e48 | ||
|
904f285f62 | ||
|
8680695586 | ||
|
a1803553fb | ||
|
9c647682e7 | ||
|
fb6e5a69f2 | ||
|
cf85cbecb3 | ||
|
948ea93599 | ||
|
de48ed99a7 | ||
|
8a6c26440c | ||
|
cf747f954c | ||
|
54a7e4808c | ||
|
03f5683d52 | ||
|
58c922f042 | ||
|
98e65ebdec | ||
|
e4a4a8127e | ||
|
72b0ee0130 | ||
|
679ec94020 | ||
|
1f0be1e1e3 | ||
|
bcc55a9143 | ||
|
749d33478a | ||
|
cb68e0ee1b | ||
|
ecc613f6c5 | ||
|
04b3fda40c | ||
|
32787fdc1e | ||
|
637c48aea7 | ||
|
5768b5bdd6 | ||
|
96d05cb521 | ||
|
92e5b8ea88 | ||
|
59ed869ed0 | ||
|
a14d475de2 | ||
|
8ea4561f1c | ||
|
5ac43eb459 | ||
|
c22d97fe47 | ||
|
bb964213f1 | ||
|
ef1547cbfe | ||
|
f2295318a9 | ||
|
66b54de869 | ||
|
d802fad111 | ||
|
8acd561de6 | ||
|
b4e20e00e4 | ||
|
3230dfc14a | ||
|
607f338934 | ||
|
758108229a | ||
|
aac4571d43 | ||
|
0436c1b7b8 | ||
|
a740a9cfea | ||
|
57ff73269b | ||
|
625c12fc12 | ||
|
4fc655323d | ||
|
f0482bb636 | ||
|
df6486f926 | ||
|
141cd10651 | ||
|
711fffe3b0 | ||
|
2c056364c1 | ||
|
c6921c731c | ||
|
8c7498eeb5 | ||
|
30cb6be104 | ||
|
fbd60e30fc | ||
|
2908cb3ce2 | ||
|
b1c5013088 | ||
|
70e424b58f | ||
|
730186cfd4 | ||
|
d2ae2e2982 | ||
|
67770ffa6f | ||
|
15ab958a70 | ||
|
af6f63dc44 | ||
|
7c7994e2e2 | ||
|
f597303698 | ||
|
1222972b73 | ||
|
7df407056b | ||
|
79b6601d12 | ||
|
53d98f3d2e | ||
|
fe43c8d69a | ||
|
e490be9eb0 | ||
|
3af8b55985 | ||
|
aaed345a20 | ||
|
f42d578765 | ||
|
f5843dd3ad | ||
|
840580334f | ||
|
5a8b5b5696 | ||
|
dc5aa3d4bf | ||
|
b9befc8350 | ||
|
e3c3e370cb | ||
|
603a63a629 | ||
|
276d09bb54 | ||
|
5635c83bfb | ||
|
0ec7cdc3aa | ||
|
932963e71c | ||
|
322ac98c50 | ||
|
811e94e186 | ||
|
0c39300f4b | ||
|
33bd7582be | ||
|
b6979594a7 | ||
|
150ef30b73 | ||
|
1042759d60 | ||
|
866149902c | ||
|
136b13b4cc | ||
|
cc11e2e885 | ||
|
f9f1e33262 | ||
|
7a8f881b04 | ||
|
20c3c24a6d | ||
|
f80ba8451f | ||
|
b1fa2bbb80 | ||
|
406511496d | ||
|
24144a9474 | ||
|
3571a5fdc0 | ||
|
4afd681ca9 | ||
|
48816308f8 | ||
|
3e66eb2fdb | ||
|
d669fed5e9 | ||
|
8e915f808b | ||
|
46ace83106 | ||
|
da16bdbb96 | ||
|
c1b7b78929 | ||
|
b9de8baac4 | ||
|
b3718c3042 | ||
|
69cee3844e | ||
|
1db462e4ad | ||
|
23cfa5564a | ||
|
7879346ca1 | ||
|
ef5a49933f | ||
|
e0bd7e11d5 | ||
|
0c5bbdaabe | ||
|
d8e29a81aa | ||
|
9f15b69724 | ||
|
cd12718dcb | ||
|
94c3c47523 | ||
|
fde6181d3c | ||
|
a4c6d834ff | ||
|
c8e494ca83 | ||
|
f87c23c9a7 | ||
|
b2f21ab974 | ||
|
6749afe75e | ||
|
8849cb73bb | ||
|
ad2060e651 | ||
|
c76dae584e | ||
|
edb7c79acf | ||
|
76c830739c | ||
|
8e6f8fada8 | ||
|
ddd96271b0 | ||
|
e9bc98e74d | ||
|
af6e9217c7 | ||
|
c0d78449be | ||
|
d7f2837efe | ||
|
cf9b5fd980 | ||
|
b42cafafd6 | ||
|
136c9a2687 | ||
|
cf45572211 | ||
|
c9d80255ae | ||
|
393be3baa4 | ||
|
fd01213697 | ||
|
2f5eb1a0f9 | ||
|
ca31ec5fe3 | ||
|
2003dfd703 | ||
|
f3342722f5 | ||
|
b2f5f93603 | ||
|
830276d110 | ||
|
9342d03f4d | ||
|
fe588caebb | ||
|
b0026831d0 | ||
|
46d7804c98 | ||
|
accbf57776 | ||
|
62c0dd6e74 | ||
|
916bb5b0e6 | ||
|
45e1126f37 | ||
|
57cf8e9bd8 | ||
|
f609a9fe0e | ||
|
4795f01583 | ||
|
06f9f795aa | ||
|
2d7d8992c0 | ||
|
15007feea7 | ||
|
8095be9ab9 | ||
|
ea48b86310 | ||
|
6402d8a4de | ||
|
5ec30c5122 | ||
|
c4b83a60f1 | ||
|
0fec4c8592 | ||
|
a09e09b942 | ||
|
7e8296b36e | ||
|
322477638a | ||
|
e659b4b2b6 | ||
|
27fe6e4fcb | ||
|
7d8b0843a0 | ||
|
e44b427b7a | ||
|
2ff6f87842 | ||
|
84dfe18f39 | ||
|
918b375ece | ||
|
c82a4820f7 | ||
|
c6e62957ab | ||
|
8a14177219 | ||
|
24268072fc | ||
|
3c65f2dd19 | ||
|
3f14a92a3e | ||
|
adf2016f4e | ||
|
81bb8be7f3 | ||
|
744f9e9f5d | ||
|
e2de13e122 | ||
|
3939dfa024 | ||
|
8680a954f8 | ||
|
20001764bf | ||
|
61512ff01f | ||
|
2488c6295e | ||
|
100f560558 | ||
|
01678005f0 | ||
|
00dc72b6c4 | ||
|
ca21fb8202 | ||
|
5989c3fecd | ||
|
7376933c31 | ||
|
a573266cab | ||
|
8374f86fde | ||
|
4a18772d2c | ||
|
5d0ac94bfe | ||
|
a636ddfab4 | ||
|
5c2840ca27 | ||
|
44850a279d | ||
|
17f3258207 | ||
|
b95fed69b0 | ||
|
059935aedb | ||
|
c99e1880d3 | ||
|
faf7a3b500 | ||
|
41c5ac0ac7 | ||
|
f8ad9ef278 | ||
|
5146a30836 | ||
|
db59cd9578 | ||
|
4b38afdcd7 | ||
|
b87971247a | ||
|
dcf4838fda | ||
|
6f40365407 | ||
|
315fdb97d3 | ||
|
9a3e974063 | ||
|
6b3183cdfa | ||
|
5189a182b5 | ||
|
884a7b966f | ||
|
fa73c13800 | ||
|
593d593a62 | ||
|
c2c8906b7d | ||
|
71f68fc1ce | ||
|
add2bda2c1 | ||
|
beef2ad8cf | ||
|
554865f97f | ||
|
d3e7ed4a71 | ||
|
56e489b458 | ||
|
5f3bd91321 | ||
|
4655bf1df8 | ||
|
9052214e6d | ||
|
59405bbe7a | ||
|
260d119711 | ||
|
5abc0d9614 | ||
|
4ba6ff106c | ||
|
9e51df9116 | ||
|
64d51448b8 | ||
|
79d3bbcdfe | ||
|
c24d0def09 | ||
|
e08843dd5c | ||
|
ec35ef041a | ||
|
efe8dd98b5 | ||
|
3fb9b25284 | ||
|
06deb13826 | ||
|
7d189392d2 | ||
|
2a07b49cb7 | ||
|
0be145491d | ||
|
58dd4a2183 | ||
|
810477749b | ||
|
92b035bea8 | ||
|
9801a8cebd | ||
|
f5a22b3d4b | ||
|
abbcb36131 | ||
|
d4860af85f | ||
|
50a4cbdb80 | ||
|
dff9a74f35 | ||
|
a5c2b06493 | ||
|
7bb49f0b3c | ||
|
00b4b880e9 | ||
|
87d93def62 | ||
|
0315aa7d8f | ||
|
b9812ea11b | ||
|
207750774d | ||
|
176dbd5830 | ||
|
1c6711355e | ||
|
20e1bf9624 | ||
|
d1a438a287 | ||
|
0d467d9275 | ||
|
c402b7599f | ||
|
916d620012 | ||
|
0fd82d4f54 | ||
|
e425571b08 | ||
|
85f0023350 | ||
|
0eadf5f4e9 | ||
|
b09a7518f5 | ||
|
0235af770f | ||
|
e03e3f6130 | ||
|
f0a6ff4627 | ||
|
6b763e20d0 | ||
|
fcb1c5d316 | ||
|
953328903c | ||
|
afba90838f | ||
|
f1ed783776 | ||
|
59ec5bacde | ||
|
ca08c56df7 | ||
|
d1e8925fe0 | ||
|
68ba1c1af2 | ||
|
03ac119313 | ||
|
8f99b01fb5 | ||
|
4e7592de98 | ||
|
5db819738e | ||
|
ade5d923ab | ||
|
43b185a3b8 | ||
|
65ec4828a9 | ||
|
1f585d8bcb | ||
|
b861149e0b | ||
|
534b51bc73 | ||
|
430b3467cc | ||
|
2dc7107990 | ||
|
81edb535a4 | ||
|
f00ce8b4f6 | ||
|
696ae2da6b | ||
|
b7e5ce88ea | ||
|
8fc8cb6112 | ||
|
48fae782d7 | ||
|
f3e78cc82e | ||
|
45199a247b | ||
|
f0a8b47c06 | ||
|
6371cd6bfe | ||
|
d738f8674d | ||
|
abfda3113b | ||
|
a941b32dd5 | ||
|
1527fb55f5 | ||
|
ffc1cd7d8d | ||
|
7f27957164 | ||
|
f8c057b135 | ||
|
2166595e50 | ||
|
22033e1cfb | ||
|
fc334ec7b9 | ||
|
e7dc4e1eec | ||
|
6bd12b7f2c | ||
|
5d48a92d1d | ||
|
4bc87ca747 | ||
|
62135dc117 | ||
|
1e294b8fbe | ||
|
9258bb09b4 | ||
|
b31317720b | ||
|
211c571508 | ||
|
785eac1345 | ||
|
bb64c6fb71 | ||
|
782232fb1a | ||
|
0fec9915de | ||
|
efacff698d | ||
|
36d0628e4f | ||
|
46c65b919f | ||
|
0b9aad09cf | ||
|
717e74f01d | ||
|
ef4f8df5a7 | ||
|
dce1187750 | ||
|
5ee6beb4b8 | ||
|
3af8cc45ea | ||
|
89ff2dd3c5 | ||
|
e7101a1f39 | ||
|
2af7f2bedb | ||
|
ad70fac377 | ||
|
2885e6053c | ||
|
4661adc564 | ||
|
edc6da9e61 | ||
|
d49749e5a1 | ||
|
8544fb2f69 | ||
|
80e41d26e2 | ||
|
8d6bb3768b | ||
|
c54007d7a4 | ||
|
35bf3ef772 | ||
|
06e1459667 | ||
|
da97a18497 | ||
|
61e33e24e9 | ||
|
f49a581193 | ||
|
f30b9e4fb9 | ||
|
c3a8dc709f | ||
|
63d6f173d6 | ||
|
8d80b610d1 | ||
|
80a54914e2 | ||
|
ac613b5839 | ||
|
33412f9bd2 | ||
|
51304fdd8e | ||
|
e139c883a3 | ||
|
662c5c09a6 | ||
|
a99d33198f | ||
|
e6ac07e608 | ||
|
d476c7e999 |
7
.github/ISSUE_TEMPLATE/bug-report.md
vendored
7
.github/ISSUE_TEMPLATE/bug-report.md
vendored
@@ -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.
|
||||||
|
3
.github/ISSUE_TEMPLATE/config.yml
vendored
3
.github/ISSUE_TEMPLATE/config.yml
vendored
@@ -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
17
.github/ISSUE_TEMPLATE/document.md
vendored
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
---
|
||||||
|
name: Document improvement
|
||||||
|
about: Feedback on documentation, including errors and ideas
|
||||||
|
title: 'Docs: some description'
|
||||||
|
labels: documentation
|
||||||
|
assignees: ''
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
**描述问题或主题:**
|
||||||
|
|
||||||
|
|
||||||
|
**需做出的修改:**
|
||||||
|
|
||||||
|
* [ ] 一些修改
|
||||||
|
* [ ] 一些修改
|
||||||
|
* [ ] 一些修改
|
4
.github/release-drafter.yml
vendored
4
.github/release-drafter.yml
vendored
@@ -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:
|
||||||
|
25
.github/workflows/plugin_issue.yml
vendored
25
.github/workflows/plugin_issue.yml
vendored
@@ -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
27
.github/workflows/publish_bot.yml
vendored
Normal 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
2
.gitignore
vendored
@@ -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
9
.prettierrc
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
{
|
||||||
|
"tabWidth": 2,
|
||||||
|
"useTabs": false,
|
||||||
|
"endOfLine": "lf",
|
||||||
|
"arrowParens": "always",
|
||||||
|
"singleQuote": false,
|
||||||
|
"trailingComma": "es5",
|
||||||
|
"semi": true
|
||||||
|
}
|
49
README.md
49
README.md
@@ -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)
|
||||||
|
|
||||||
## 贡献
|
## 贡献
|
||||||
|
|
||||||
|
@@ -1,7 +0,0 @@
|
|||||||
# 深入
|
|
||||||
|
|
||||||
## 它如何工作?
|
|
||||||
|
|
||||||
<!-- TODO: how to work -->
|
|
||||||
|
|
||||||
~~未填坑~~
|
|
@@ -1 +0,0 @@
|
|||||||
# 权限控制
|
|
@@ -1 +0,0 @@
|
|||||||
# 钩子函数
|
|
@@ -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
|
|
||||||
---
|
|
@@ -1 +0,0 @@
|
|||||||
# 事件处理函数重载
|
|
@@ -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
|
|
||||||
```
|
|
@@ -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 信息
|
|
@@ -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 通信方式
|
|
||||||
- 支持多个机器人账号负载均衡
|
|
||||||
- 提供直观的交互式会话接口
|
|
||||||
- 提供可自定义的权限控制机制
|
|
||||||
- 多种方式渲染要发送的消息内容,使对话足够自然
|
|
@@ -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` 来调用 API,API 可以向协议端发送数据,也可以向协议端请求更多的数据。
|
`nonebot` 可以通过 `bot` 来调用 `API` ,`API` 可以向协议端发送数据,也可以向协议端请求更多的数据。
|
||||||
|
|
||||||
::: tip
|
::: tip
|
||||||
不同 `adapter` 规定了不同的 API,对应的 API 列表请参照协议规范。
|
不同 `adapter` 规定了不同的 API,对应的 API 列表请参照协议规范。
|
163
archive/2.0.0a13.post1/advanced/runtime-hook.md
Normal file
163
archive/2.0.0a13.post1/advanced/runtime-hook.md
Normal 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
|
||||||
|
```
|
@@ -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` 的导入方式即可完成迁移。
|
||||||
|
|
||||||
## 安装插件
|
## 安装插件
|
||||||
|
|
@@ -19,6 +19,9 @@
|
|||||||
* [nonebot.matcher](matcher.html)
|
* [nonebot.matcher](matcher.html)
|
||||||
|
|
||||||
|
|
||||||
|
* [nonebot.handler](handler.html)
|
||||||
|
|
||||||
|
|
||||||
* [nonebot.rule](rule.html)
|
* [nonebot.rule](rule.html)
|
||||||
|
|
||||||
|
|
@@ -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 数据
|
||||||
|
|
||||||
|
|
@@ -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`: 覆盖默认参数
|
||||||
|
|
||||||
|
|
@@ -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 默认值
|
||||||
|
|
||||||
|
|
||||||
|
|
111
archive/2.0.0a13.post1/api/handler.md
Normal file
111
archive/2.0.0a13.post1/api/handler.md
Normal 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 参数
|
@@ -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]`
|
||||||
|
|
||||||
|
|
||||||
|
|
@@ -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`
|
@@ -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`
|
||||||
|
|
||||||
|
|
@@ -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。
|
@@ -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地址后,用户可以向这个地址发起HTTP POST 请求,即可实现给该钉钉群发送消息。
|
||||||
|
|
||||||
|
对于这种通过 Webhook 推送的消息,钉钉需要开发者进行安全方面的设置(目前有3种安全设置方式,请根据需要选择一种),如下:
|
||||||
|
|
||||||
|
1. **自定义关键词:** 最多可以设置10个关键词,消息中至少包含其中1个关键词才可以发送成功。
|
||||||
|
例如添加了一个自定义关键词:监控报警,则这个机器人所发送的消息,必须包含监控报警这个词,才能发送成功。
|
||||||
|
2. **加签:** 发送请求时带上验签的值,可以在机器人设置里看到密钥。
|
||||||
|

|
||||||
|
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",
|
||||||
|
)
|
||||||
|
```
|
||||||
|
|
||||||
|
然后就可以发送成功了。
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
## 创建机器人并连接
|
## 创建机器人并连接
|
||||||
|
|
||||||
在钉钉官方文档 [「开发企业内部机器人 -> 步骤一:创建机器人应用」](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) 中有详细介绍,这里就省去创建的步骤,介绍一下如何连接上程序。
|
@@ -4,6 +4,5 @@
|
|||||||
|
|
||||||
- 请千万注意事件处理器的优先级设定
|
- 请千万注意事件处理器的优先级设定
|
||||||
- 在匹配规则中请勿使用耗时极长的函数
|
- 在匹配规则中请勿使用耗时极长的函数
|
||||||
- 同一个用户可以**跨群**(**私聊**)继续他的事件处理(除非做出权限限制,将在后续介绍)
|
|
||||||
|
|
||||||
如果「指南」还不能满足你,前往 [进阶](../advanced/README.md) 查看更多的功能信息。
|
如果「指南」还不能满足你,前往 [进阶](../advanced/README.md) 查看更多的功能信息。
|
Before Width: | Height: | Size: 124 KiB After Width: | Height: | Size: 124 KiB |
BIN
archive/2.0.0a13.post1/guide/images/ding/jiaqian.png
Normal file
BIN
archive/2.0.0a13.post1/guide/images/ding/jiaqian.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 100 KiB |
BIN
archive/2.0.0a13.post1/guide/images/ding/test_webhook.png
Normal file
BIN
archive/2.0.0a13.post1/guide/images/ding/test_webhook.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 75 KiB |
BIN
archive/2.0.0a13.post1/guide/images/ding/webhook.png
Normal file
BIN
archive/2.0.0a13.post1/guide/images/ding/webhook.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 100 KiB |
@@ -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) 服务器状态查看插件
|
||||||
|
|
@@ -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)中所读到的:
|
@@ -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"
|
@@ -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
|
||||||
---
|
---
|
177
archive/2.0.0a15/advanced/README.md
Normal file
177
archive/2.0.0a15/advanced/README.md
Normal 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**进行说明。
|
||||||
|
|
||||||
|
## 事件处理
|
||||||
|
|
||||||
|
我们可以先看事件处理的流程图:
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
在流程图里,我们可以看到,`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)` 方法,来向事件主体发送消息。
|
@@ -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`。
|
||||||
|
|
64
archive/2.0.0a15/advanced/overloaded-handlers.md
Normal file
64
archive/2.0.0a15/advanced/overloaded-handlers.md
Normal 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("私聊消息事件响应成功!")
|
||||||
|
```
|
||||||
|
|
||||||
|
只有触发事件符合的函数才会触发装饰器。
|
90
archive/2.0.0a15/advanced/permission.md
Normal file
90
archive/2.0.0a15/advanced/permission.md
Normal 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` 会自动包裹同步函数为异步函数。
|
163
archive/2.0.0a15/advanced/runtime-hook.md
Normal file
163
archive/2.0.0a15/advanced/runtime-hook.md
Normal 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
|
||||||
|
```
|
@@ -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
|
||||||
```
|
```
|
||||||
|
|
||||||
### 编写定时任务
|
### 编写定时任务
|
@@ -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)
|
@@ -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()`
|
||||||
|
|
@@ -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)
|
||||||
|
|
@@ -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)
|
||||||
|
|
246
archive/2.0.0a15/api/adapters/feishu.md
Normal file
246
archive/2.0.0a15/api/adapters/feishu.md
Normal 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]]`
|
1877
archive/2.0.0a15/api/adapters/mirai.md
Normal file
1877
archive/2.0.0a15/api/adapters/mirai.md
Normal file
File diff suppressed because it is too large
Load Diff
@@ -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`
|
||||||
|
|
||||||
|
|
529
archive/2.0.0a15/api/drivers/README.md
Normal file
529
archive/2.0.0a15/api/drivers/README.md
Normal 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 重连间隔
|
101
archive/2.0.0a15/api/drivers/aiohttp.md
Normal file
101
archive/2.0.0a15/api/drivers/aiohttp.md
Normal 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)
|
@@ -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)
|
@@ -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)
|
@@ -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`
|
111
archive/2.0.0a15/api/handler.md
Normal file
111
archive/2.0.0a15/api/handler.md
Normal 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 参数
|
@@ -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()`
|
||||||
|
|
||||||
|
|
||||||
|
* **说明**
|
||||||
|
|
||||||
|
阻止事件传播
|
@@ -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()`
|
||||||
|
|
||||||
|
|
@@ -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`
|
|
||||||
|
|
||||||
|
|
||||||
* **说明**: 匹配任意消息类型事件
|
|
@@ -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`
|
@@ -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)`
|
||||||
|
|
||||||
|
|
||||||
* **说明**
|
* **说明**
|
@@ -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 时被运行,用于更新会话对象权限。默认会更新为当前事件的触发对象。
|
@@ -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`
|
|
@@ -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 以上版本**
|
||||||
|
|
||||||
## 特色
|
## 特色
|
||||||
|
|
@@ -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 所在的控制台(如果正在运行的话)应该会输出类似下面的内容(两条访问日志):
|
@@ -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)
|
||||||
|
|
@@ -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 内置了一些规则:
|
@@ -8,7 +8,7 @@
|
|||||||
nb plugin new
|
nb plugin new
|
||||||
```
|
```
|
||||||
|
|
||||||
插件通常有两种形式,下面分别介绍
|
下面分别对两种通常的插件形式做具体介绍
|
||||||
|
|
||||||
## 单文件形式
|
## 单文件形式
|
||||||
|
|
@@ -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
Reference in New Issue
Block a user