emm
This commit is contained in:
commit
7b6fa53913
11 changed files with 239 additions and 0 deletions
59
README.md
Normal file
59
README.md
Normal file
|
@ -0,0 +1,59 @@
|
||||||
|
# XZZ
|
||||||
|
小智障,一个拓展 CoolQ HttpApi,快速构建命令式 QQ 机器人的框架.
|
||||||
|
|
||||||
|
## 如何使用
|
||||||
|
|
||||||
|
### 安装配置
|
||||||
|
|
||||||
|
#### 0.自己安装配置好 CoolQ 及其 HttpApi 插件.
|
||||||
|
|
||||||
|
包括上报过滤!
|
||||||
|
|
||||||
|
#### 1.clone 本仓库, 填写 `config.py`
|
||||||
|
|
||||||
|
其中 `APIURL` 为 CoolQ HttpApi 的 URL, `AUTHORIZATION` 为 CoolQ HttpApi 的 `access_token`, `PORT` 和 CoolQ HttpApi `post_url` 中的端口保持一致.
|
||||||
|
|
||||||
|
#### 2.安装依赖, 启动服务
|
||||||
|
|
||||||
|
```shell
|
||||||
|
pip install -r req.txt
|
||||||
|
python main.py
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
### 拓展功能
|
||||||
|
|
||||||
|
在 `worker` 文件夹中添加 python 模块.文件名即受该文件响应的命令.
|
||||||
|
|
||||||
|
如果要响应 `/ping` 命令的话, 文件名应为 `ping.py`
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
在该模块实现一个 `Ans` 类, 此类继承自 `zzcore`里的 `StdAns` 类.
|
||||||
|
|
||||||
|
在这个类中你可选的重写以下属性和方法:
|
||||||
|
|
||||||
|
`AllowGroup` , int 类型的 list, 在此 list 中的群组可以执行此命令.默认为 [], 全部允许.
|
||||||
|
|
||||||
|
`AllowUser` , int 类型的 list, 在此 list 中的QQ号可以执行此命令.默认为 [], 全部允许.
|
||||||
|
|
||||||
|
`AllowRole` , string 类型的 list, 在此 list 中的角色可以执行此命令.默认为 [], 全部允许, 可选值为 owner、admin、member , 对应 群主、管理员、群员 三种角色.
|
||||||
|
|
||||||
|
`GroupNotAllow`、`UserNotAllow`、`RoleNotAllow` 三个字符串, 分别为当用户因为以上三个原因被拒绝使用本命令时的回复, 自己去看默认值吧..
|
||||||
|
|
||||||
|
`GETMSG()` 方法, 该方法应当返回一个字符串, 在此方法中你可以借助以下变量:
|
||||||
|
|
||||||
|
`self.uid `发起命令的用户的 QQ , int 类型
|
||||||
|
|
||||||
|
`self.gid` 发起命令的群组的群号, int 类型
|
||||||
|
|
||||||
|
`self.role` 发起命令的用户的角色,可能值 'owner'、'admin'、'member'
|
||||||
|
|
||||||
|
`self.parms` 命令详情, string 类型的 list. 看例子
|
||||||
|
|
||||||
|
如果用户发送了 /ping xxx 12
|
||||||
|
|
||||||
|
那么 self.parms 为 ['ping', 'xxx', '12']
|
||||||
|
|
||||||
|
self.raw_msg 详见 example.json
|
7
config.py
Normal file
7
config.py
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
ALLWORKERS = ['ping','yiyan','mc',]
|
||||||
|
|
||||||
|
APIURL = 'http://127.0.0.1:5700/'
|
||||||
|
|
||||||
|
AUTHORIZATION = ''
|
||||||
|
|
||||||
|
PORT = 5580
|
25
exmple.json
Normal file
25
exmple.json
Normal file
|
@ -0,0 +1,25 @@
|
||||||
|
{
|
||||||
|
"anonymous": "None",
|
||||||
|
"font": 1501544,
|
||||||
|
"group_id": 959613000,
|
||||||
|
"message": "/ping",
|
||||||
|
"message_id": 2071,
|
||||||
|
"message_type": "group",
|
||||||
|
"post_type": "message",
|
||||||
|
"raw_message": "/ping",
|
||||||
|
"self_id": 161795000,
|
||||||
|
"sender": {
|
||||||
|
"age": 18,
|
||||||
|
"area": "济宁",
|
||||||
|
"card": "",
|
||||||
|
"level": "活跃",
|
||||||
|
"nickname": "SiHuan",
|
||||||
|
"role": "owner",
|
||||||
|
"sex": "unknown",
|
||||||
|
"title": "",
|
||||||
|
"user_id": 1318000000
|
||||||
|
},
|
||||||
|
"sub_type": "normal",
|
||||||
|
"time": 1582805370,
|
||||||
|
"user_id": 1318000000
|
||||||
|
}
|
14
main.py
Normal file
14
main.py
Normal file
|
@ -0,0 +1,14 @@
|
||||||
|
from flask import Flask, request
|
||||||
|
from config import PORT
|
||||||
|
from route import ZZRouter
|
||||||
|
|
||||||
|
app = Flask(__name__)
|
||||||
|
|
||||||
|
@app.route('/', methods=['POST'])
|
||||||
|
def whenmsg():
|
||||||
|
ZZRouter(request.get_json())
|
||||||
|
return ''
|
||||||
|
|
||||||
|
app.run(host='0.0.0.0', port=PORT)
|
||||||
|
if __name__ == '__main__':
|
||||||
|
app.run()
|
19
req.txt
Normal file
19
req.txt
Normal file
|
@ -0,0 +1,19 @@
|
||||||
|
astroid==2.3.3
|
||||||
|
certifi==2019.11.28
|
||||||
|
chardet==3.0.4
|
||||||
|
Click==7.0
|
||||||
|
Flask==1.1.1
|
||||||
|
idna==2.9
|
||||||
|
isort==4.3.21
|
||||||
|
itsdangerous==1.1.0
|
||||||
|
Jinja2==2.11.1
|
||||||
|
lazy-object-proxy==1.4.3
|
||||||
|
MarkupSafe==1.1.1
|
||||||
|
mccabe==0.6.1
|
||||||
|
pylint==2.4.4
|
||||||
|
requests==2.23.0
|
||||||
|
six==1.14.0
|
||||||
|
typed-ast==1.4.1
|
||||||
|
urllib3==1.25.8
|
||||||
|
Werkzeug==1.0.0
|
||||||
|
wrapt==1.11.2
|
20
route.py
Normal file
20
route.py
Normal file
|
@ -0,0 +1,20 @@
|
||||||
|
from worker import emmm
|
||||||
|
|
||||||
|
def ZZRouter(data):
|
||||||
|
uid = data['user_id']
|
||||||
|
gid = data['group_id']
|
||||||
|
role = data['sender']['role']
|
||||||
|
parms = str.split(data['message'][1:])
|
||||||
|
worker = parms[0]
|
||||||
|
|
||||||
|
try:
|
||||||
|
package = __import__(name='worker.'+ worker, fromlist=worker)
|
||||||
|
Ans_ = getattr(package,'Ans')
|
||||||
|
except:
|
||||||
|
Ans_ = emmm.Ans
|
||||||
|
|
||||||
|
Ans = Ans_(parms,uid,gid,role,data)
|
||||||
|
Message = Ans.CheckPermission()
|
||||||
|
if Message == 0:
|
||||||
|
Message = Ans.GETMSG()
|
||||||
|
Ans.sendmsg(Message)
|
8
worker/emmm.py
Normal file
8
worker/emmm.py
Normal file
|
@ -0,0 +1,8 @@
|
||||||
|
from zzcore import StdAns
|
||||||
|
|
||||||
|
class Ans(StdAns):
|
||||||
|
def GETMSG(self):
|
||||||
|
if self.parms:
|
||||||
|
return '咱也不知道' + self.parms[0] + '是啥呢~'
|
||||||
|
else:
|
||||||
|
return '汝再调戏咱,咱可就生气了!!'
|
14
worker/mc.py
Normal file
14
worker/mc.py
Normal file
|
@ -0,0 +1,14 @@
|
||||||
|
from zzcore import StdAns
|
||||||
|
from subprocess import getoutput
|
||||||
|
|
||||||
|
class Ans(StdAns):
|
||||||
|
def GETMSG(self):
|
||||||
|
if self.parms[1] == 'status':
|
||||||
|
return getoutput('spigot status')
|
||||||
|
AllowCmd = ['list','tps']
|
||||||
|
if self.parms[1] in AllowCmd:
|
||||||
|
cmd = 'spigot command '
|
||||||
|
cmd = cmd + self.parms[1]
|
||||||
|
return getoutput(cmd)
|
||||||
|
else:
|
||||||
|
return self.parms[1] + ' 是暂时不被允许的命令!'
|
5
worker/ping.py
Normal file
5
worker/ping.py
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
from zzcore import StdAns
|
||||||
|
|
||||||
|
class Ans(StdAns):
|
||||||
|
def GETMSG(self):
|
||||||
|
return 'Pong!'
|
22
worker/yiyan.py
Normal file
22
worker/yiyan.py
Normal file
|
@ -0,0 +1,22 @@
|
||||||
|
from zzcore import StdAns
|
||||||
|
import requests
|
||||||
|
|
||||||
|
class Ans(StdAns):
|
||||||
|
def GETMSG(self):
|
||||||
|
url = 'https://v1.hitokoto.cn/?encode=text&'
|
||||||
|
cmdlst = {'动画': 'a', '漫画': 'b', '游戏': 'c', '文学': 'd', '原创': 'e', '来自网络': 'f',
|
||||||
|
'其他': 'g', '影视': 'h', '诗词': 'i', '网易云': 'j', '哲学': 'k', '抖机灵': 'l'}
|
||||||
|
try:
|
||||||
|
cmd = self.parms[1]
|
||||||
|
except :
|
||||||
|
cmd = ''
|
||||||
|
if cmd == '帮助':
|
||||||
|
msg = '您可以使用以下参数:\n 动画,漫画,游戏,文学,原创,来自网络,其他,影视,诗词,网易云,哲学,抖机灵'
|
||||||
|
else:
|
||||||
|
if cmd == '':
|
||||||
|
msg = requests.get(url).text
|
||||||
|
elif cmd in cmdlst:
|
||||||
|
msg = requests.get(url+cmdlst[cmd]).text
|
||||||
|
else:
|
||||||
|
msg = '我不知道 ' + cmd + ' 这个参数,你可以使用"/yiyan 帮助"来获取帮助'
|
||||||
|
return msg
|
46
zzcore.py
Normal file
46
zzcore.py
Normal file
|
@ -0,0 +1,46 @@
|
||||||
|
import requests
|
||||||
|
import json
|
||||||
|
from config import APIURL, ALLWORKERS, AUTHORIZATION
|
||||||
|
from worker import emmm
|
||||||
|
|
||||||
|
class StdAns():
|
||||||
|
AllowGroup = []
|
||||||
|
AllowUser = []
|
||||||
|
AllowRole = []
|
||||||
|
GroupNotAllow = '汝所在的群组不被允许这样命令咱呢.'
|
||||||
|
UserNotAllow = '汝不被允许呢.'
|
||||||
|
RoleNotAllow = '汝的角色不被允许哦.'
|
||||||
|
|
||||||
|
def __init__(self,parms,uid,gid,role,raw_msg):
|
||||||
|
self.parms = parms
|
||||||
|
self.uid = uid
|
||||||
|
self.gid = gid
|
||||||
|
self.role = role
|
||||||
|
self.raw_msg = raw_msg
|
||||||
|
|
||||||
|
|
||||||
|
def CheckPermission(self):
|
||||||
|
if self.AllowGroup and self.gid not in self.AllowGroup:
|
||||||
|
return self.GroupNotAllow
|
||||||
|
if self.AllowUser and self.uid not in self.AllowUser:
|
||||||
|
return self.UserNotAllow
|
||||||
|
if self.AllowRole and self.role not in self.AllowRole:
|
||||||
|
return self.RoleNotAllow
|
||||||
|
return 0
|
||||||
|
|
||||||
|
def GETMSG(self):
|
||||||
|
return self.__module__ +'的话,咱已经知道了,但是还在学习呢!'
|
||||||
|
|
||||||
|
def sendmsg(self,msg):
|
||||||
|
url = APIURL + "send_msg"
|
||||||
|
Headers = {
|
||||||
|
'content-type': 'application/json',
|
||||||
|
'Authorization':'Bearer ' + AUTHORIZATION
|
||||||
|
}
|
||||||
|
|
||||||
|
data = {
|
||||||
|
'message_type' : 'group',
|
||||||
|
'group_id' : self.gid,
|
||||||
|
'message': msg
|
||||||
|
}
|
||||||
|
requests.post(url = url, data = json.dumps(data),headers = Headers)
|
Loading…
Reference in a new issue