怎么用 QQ 机器人

可以先看看 Manual

概念定义

list 是什么?

list 是整个机器人系统的基础数据结构,内部实现是 key-value Map。 key 可以是 QQ 号、关键词(组)、任意字符串。 value 可以是任意类型的数据,但是一般是字符串。

namespace 是什么?

namespace 是整个机器人系统的抽象管理层,用于管理 list、group。 创建 list、绑定 group 都离不开 namespace。 可以任命一些 QQ 为 namespace 的管理员,管理员同样可以管理 namespace 内的 list、group。 namespace

额外功能

机厅计数

先将群绑定到 机厅 namespace

1
/group bind 机厅

查询有哪些地区机厅

1
/namespace 机厅

如果没有当地的机厅,可以添加地区机厅 list

1
/list add <地区机厅> 机厅

添加地区机厅 list 到 group keyword reply

1
/group keyword add reply 重庆机厅

这里举例 重庆机厅

添加机厅

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
/list join <哪里的机厅> <机厅名字> webhook:post<{
    "message": {message},
    "remain": {remain},
    "open_at": "9:30",
    "close_at": "22:30",
    "reset_at": "5:00",
    "full_name": "机厅全称",
    "note": "机厅备注",
    "nickname": {nickname},
    "user_id": {userId},
    "group_id": {groupId},
    "count_limit": 18,
    "cost_per": 2,
    "cost_minute": 16
}>://http://127.0.0.1:20065/count/

参数解释

下面的参数写不写都无所谓,可以直接删掉。

  • open_at: 机厅开门时间
  • close_at: 机厅关门时间
  • reset_at: 机厅计数重置时间(不写就不会重置)
  • full_name: 机厅全称
  • note: 机厅备注
  • count_limit: 机厅计数上限
  • cost_per: 每次上机几个人
  • cost_minute: 上一次机需要花费多少分钟

以下是最少必要参数的例子

1
2
3
4
5
6
7
/list join <哪里的机厅> <机厅名字> webhook:post<{
    "message": {message},
    "remain": {remain},
    "nickname": {nickname},
    "user_id": {userId},
    "group_id": {groupId}
}>://http://127.0.0.1:20065/count/

添加机厅别名

1
/list join <哪里的机厅> <机厅别名> rewrite://<机厅名字>{remain}

删除机厅(别名)

1
/list leave <哪里的机厅> <机厅名字(别名)>

使用

1
2
3
4
5
6
7
<机厅名字(别名)>几
<机厅名字(别名)>几个
<机厅名字(别名)>++
<机厅名字(别名)>--
<机厅名字(别名)>+2
<机厅名字(别名)>-2
<机厅名字(别名)>3

还可以尾随 ,<备注>,以共享备注

FAQ

下面的回答一般是命令序列,详细的解释在 Manual

我要用自动审核加群申请功能!

别忘了给机器人管理员权限。

用白名单的方式?

1
/list add <什么的白名单> <添加到哪个 namespace>
1
/list join <白名单> <QQ 号>
1
/list set <白名单> <json>

这个 json 是一个 key-value Map,key 是 QQ 号,value 是 null。

1
2
3
4
{
  "1234": null,
  "QQ 号": null
}
1
/group bind <相同的 namespace>
1
/group approval enable whitelist
1
/group approval add whitelist <白名单>

用 Minecraft 正版验证的方式?

1
/group approval enable mc

我要开录!

记录加群申请?

1
/list add <什么的加群申请日志> <添加到哪个 namespace>
1
/group log set approval <加群申请日志>
你还要看现在还在群里面的成员的加群申请?
1
/list add <在世成员> <添加到哪个 namespace>
1
/list add <在世成员的加群申请日志> <添加到哪个 namespace>
1
/list reset <在世成员的加群申请日志>
1
/group export member <在世成员>
1
/list op <加群申请日志> I <在世成员> <在世成员的加群申请日志>

这个 I 是 Intersect 的意思,也就是求交集。

1
/list query <在世成员的加群申请日志>

记录离群信息?

1
/list add <什么的离群日志> <添加到哪个 namespace>
1
/group log set leave <离群日志>

我要撤回!撤回!撤回!

撤回含有关键字的消息?

1
/list add <检查什么的关键字表> <添加到哪个 namespace>
1
/list join <关键字表> <关键字>
1
/group keyword enable blacklist
1
/group keyword add blacklist <关键字表>

反撤回?

1
/group message enable anti-recall
仅反撤回群成员的消息?
1
/group message set only-anti-recall-member

我要开导!

导出群成员信息?

1
/group export member <要导到哪个表啊?>

导出 list?

1
/list export <要导出哪个表啊?>

我要设置通知群!

通知自动审核的结果?

1
/group approval set notification <通知群的群号>

通知关键字撤回、反撤回?

1
/group message set notification <通知群的群号>

我会编程!!!

那我给个 Python 的调用示例?

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
import requests
import hmac
import hashlib
import base64
import time

# config
token = "找 yijiong 要"
token_name = "找 yijiong 要"
# url
url = "找 yijiong 要"


def send_command(group_id: int, command: str, message_sync_bool: str = "false", async_bool: str = "false"):
    timestamp = int(time.time())

    # Create the signature
    message = f"{token}{command}{group_id}{timestamp}{message_sync_bool}{async_bool}"
    digest = hmac.new(token_name.encode(), message.encode(), digestmod=hashlib.sha1).digest()
    signature = base64.b64encode(digest).decode()

    # headers
    headers = {
        "Content-Type": "application/json"
    }

    # payload
    payload = {
        "token": token,
        "command": command,
        "group_id": group_id,
        "message_sync": message_sync_bool,
        "async": async_bool,
        "timestamp": timestamp,
        "signature": signature
    }

    # Make the request
    response = requests.post(url, headers=headers, json=payload)

    # Print the response
    print(response.json())
    # calm down
    time.sleep(1)


def main():
    send_command(0, "/list query xxx", "true")


if __name__ == '__main__':
    main()
Licensed under CC BY-NC-SA 4.0