Skip to content

Bot 核心对象与 API 源码手册 ​

在 developTools 中,WebSocketBot 是整个机器人的动力引擎与通讯中枢!所有消息下发、群禁言、戳一戳、发语音和文件上传,全都是通过它提供的方法实现的。

与其看抽象的参数说明,不如直接来看源码!今天 Yucca 把 WebSocketBot 最核心的方法实现直接切片贴给你,让你清楚每个 API 在底层发了什么请求、支持什么参数、以及怎么优雅调用!


一、Bot 类的实例化与构造函数源码 ​

python
# 位于 developTools/adapters/websocket_adapter.py

class WebSocketBot:
    def __init__(
        self,
        uri: str,                             # WebSocket 连接地址,例如 "ws://127.0.0.1:3001"
        access_token: str = None,             # 鉴权 Token(若协议端设置了 access_token 则传入,否则为 None)
        all_str_id: bool = False,             # 是否将所有 QQ 号和群号强制转为字符串处理
        handler_timeout_warning: float = 10.0,# 事件处理器执行超时警告阈值(秒)
        enable_monitoring: bool = True        # 是否启用 Handler 耗时监控与防阻塞检测
    ):
        self.uri = uri
        self.access_token = access_token
        self.all_str_id = all_str_id
        self.event_bus = EventBus(handler_timeout_warning, enable_monitoring)
        self.on = self.event_bus.on           # 快捷事件订阅装饰器
        self.logger = get_logger()

快速初始化与启动标准范式: ​

python
from developTools.adapters.websocket_adapter import WebSocketBot

# 创建机器人实例
bot = WebSocketBot("ws://127.0.0.1:3001")

# 启动并保持常驻监听
bot.run()

二、消息发送 API 源码与实战 ​

1. 智能自适应发送:send() ​

这是你写插件最常用的消息发送方法!它会自动判断事件是来自于群聊还是私聊,不需要你手动写 if-else 分流;并且支持一键引用原消息回复!

底层源码实现: ​

python
async def send(
    self, 
    event: EventBase, 
    components: list[Union[MessageComponent, str]], 
    Quote: bool = False
):
    """
    智能根据传入的事件类型,将消息分发到群聊或私聊
    :param event: 触发当前消息的 Event 对象(GroupMessageEvent 或 PrivateMessageEvent)
    :param components: 发送内容列表(可以是纯字符串,也可以是 Text, Image, At, Record 等组件列表)
    :param Quote: 是否引用被回复的消息(True 时会自动在消息头部拼装 Reply 组件)
    """
    if isinstance(components, str):
        components = [Text(components)]
    if Quote:
        components.insert(0, Reply(event.message_id))
        
    if event.message_type == "group":
        await self.send_group_message(event.group_id, components)
    elif event.message_type == "private":
        await self.send_friend_message(event.user_id, components)

调用实战: ​

python
# 1. 简写直接发送纯文本
await bot.send(event, "收到啦主人~")

# 2. 混合发送艾特与多张图片
from developTools.message.message_components import At, Text, Image
await bot.send(event, [At(event.user_id), Text(" 给你看张美图:"), Image(file="output.jpg")])

# 3. 引用原消息回复 (Quote=True)
await bot.send(event, "你刚才说的那句话我记在小本本上啦!", Quote=True)

2. 精确发送群消息与好友私聊源码 ​

如果你是在定时任务或者后台轮询中想要主动推送消息(此时手里没有 event),直接使用以下两个底层方法:

python
async def send_group_message(self, group_id: int, components: list[Union[MessageComponent, str]]):
    """主动向指定群发送消息"""
    if isinstance(components, str):
        components = [Text(components)]
    data = {"group_id": group_id, "message": self.to_json(components)}
    return await self._call_api("send_group_msg", data)

async def send_friend_message(self, user_id: int, components: list[Union[MessageComponent, str]]):
    """主动向指定好友发送私聊消息"""
    if isinstance(components, str):
        components = [Text(components)]
    data = {"user_id": user_id, "message": self.to_json(components)}
    return await self._call_api("send_private_msg", data)

调用实战: ​

python
# 在早安早报定时任务里主动推送到测试群:
await bot.send_group_message(879886836, [Text("☀️ 早上好!今日早报已送达~")])

# 私聊通知管理员:
await bot.send_friend_message(1840094972, [Text("⚠️ 检测到服务器 CPU 占用过高!")])

3. 合并转发消息源码:send_group_forward_msg() ​

想把多条长文本或日志折叠成聊天记录样式的合并转发卡片?

python
async def send_group_forward_msg(self, group_id: int, components: Union[str, list[Union[MessageComponent, str]]]):
    """发送群合并转发节点消息"""
    data = {"group_id": group_id, "messages": self.to_json(components)}
    return await self._call_api("send_group_forward_msg", data)

调用实战(配合 Node 节点组件): ​

python
from developTools.message.message_components import Node, Text

nodes = [
    Node(user_id=bot.id, nickname="Yucca", content=[Text("这是第一条合并消息内容~")]),
    Node(user_id=bot.id, nickname="Yucca", content=[Text("这是第二条合并消息内容哦!")])
]
await bot.send_group_forward_msg(event.group_id, nodes)

三、消息撤回与社交互动 API 源码 ​

python
async def recall(self, message_id: int):
    """撤回指定消息 ID"""
    data = {"message_id": message_id}
    return await self._call_api("delete_msg", data)

async def send_like(self, user_id: int):
    """给指定用户 QQ 名片点赞(默认一次点 10 赞)"""
    data = {"user_id": user_id, "times": 10}
    return await self._call_api("send_like", data)

async def group_poke(self, group_id: int, user_id: int):
    """在群内发送戳一戳"""
    data = {"group_id": group_id, "user_id": user_id}
    return await self._call_api("group_poke", data)

async def friend_poke(self, user_id: int):
    """私聊中给好友发送戳一戳"""
    data = {"user_id": user_id}
    return await self._call_api("friend_poke", data)

调用实战(发送临时消息并在 10 秒后自动撤回): ​

python
import asyncio

# 发送提示
sent_res = await bot.send(event, "这条消息会在 10 秒后自动销毁哦~")
msg_id = sent_res["data"]["message_id"]

await asyncio.sleep(10)
# 调用 recall 撤回
await bot.recall(msg_id)

四、群管理与群成员控制 API 源码 ​

编写群管小帮手时,这些函数可全都是你的得力法宝哦!

1. 禁言与全员禁言源码: ​

python
async def mute(self, group_id: int, user_id: int, duration: int):
    """
    群禁言指定成员
    :param duration: 禁言秒数,设置为 0 时表示解除禁言
    """
    data = {"group_id": group_id, "user_id": user_id, "duration": duration}
    return await self._call_api("set_group_ban", data)

async def set_group_whole_ban(self, group_id: int, enable: bool):
    """开启或关闭全员禁言"""
    data = {"group_id": group_id, "enable": enable}
    return await self._call_api("set_group_whole_ban", data)

2. 踢出成员、改群名片与专属头衔源码: ​

python
async def set_group_kick(self, group_id: int, user_id: int, reject_add_request: bool = True):
    """
    移出群成员
    :param reject_add_request: 是否拉黑该用户,拒绝其后续再次申请加群
    """
    data = {"group_id": group_id, "user_id": user_id, "reject_add_request": reject_add_request}
    return await self._call_api("set_group_kick", data)

async def set_group_card(self, group_id: int, user_id: int, card: str):
    """修改群成员群名片(留空则还原为原昵称)"""
    data = {"group_id": group_id, "user_id": user_id, "card": card}
    return await self._call_api("set_group_card", data)

async def set_group_admin(self, group_id: int, user_id: int, enable: bool):
    """设置或取消群管理员"""
    data = {"group_id": group_id, "user_id": user_id, "enable": enable}
    return await self._call_api("set_group_admin", data)

async def set_group_special_title(self, group_id: int, user_id: int, special_title: str):
    """设置群员专属头衔(仅群主拥有此权限)"""
    data = {"group_id": group_id, "user_id": user_id, "special_title": special_title, "duration": -1}
    return await self._call_api("set_group_special_title", data)

调用实战(违禁词禁言套餐): ​

python
# 禁言违规成员 10 分钟 (600秒)
await bot.mute(event.group_id, event.user_id, duration=600)
await bot.send(event, f"检测到违规发言,已请 [CQ:at,qq={event.user_id}] 喝茶 10 分钟!")

五、请求审批与群文件/精华消息 API 源码 ​

python
async def handle_friend_request(self, flag: str, approve: bool, remark: str = ""):
    """
    审批加好友请求
    :param flag: FriendRequestEvent 中的 flag 标识
    :param approve: True 为同意,False 为拒绝
    :param remark: 同意后的好友备注
    """
    data = {"flag": flag, "approve": approve, "remark": remark}
    return await self._call_api("set_friend_add_request", data)

async def set_group_add_request(self, flag: str, approve: bool, reason: str = ""):
    """
    审批加群/邀请进群请求
    :param flag: GroupRequestEvent 中的 flag 标识
    :param approve: True 为同意,False 为拒绝
    :param reason: 拒绝理由(若 approve=False 则有效)
    """
    data = {"flag": flag, "approve": approve, "reason": reason}
    return await self._call_api("set_group_add_request", data)

async def upload_group_file(self, group_id: int, file: str, name: str = None):
    """
    上传本地文件到群文件
    :param file: 本地文件绝对路径
    :param name: 上传后显示的文件名(若留空则自动提取原文件名)
    """
    if name is None:
        name = os.path.basename(file)
    data = {"group_id": group_id, "file": file, "name": name}
    return await self._call_api("upload_group_file", data)

async def set_essence_msg(self, message_id: int | str):
    """将指定消息设为群精华消息"""
    data = {"message_id": int(message_id)}
    return await self._call_api("set_essence_msg", data)

六、信息查询 API 源码 ​

想要在发消息前先查查对方是不是群管理、或者群里一共有多少人?看这里:

python
async def get_group_member_info(self, group_id: int, user_id: int):
    """获取单个群成员详细信息(返回字典包含 role, join_time, last_sent_time 等)"""
    data = {"group_id": group_id, "user_id": user_id, "no_cache": True}
    return await self._call_api("get_group_member_info", data)

async def get_group_member_list(self, group_id: int):
    """获取群成员完整列表"""
    data = {"group_id": group_id, "no_cache": True}
    return await self._call_api("get_group_member_list", data)

async def get_stranger_info(self, user_id: int):
    """获取陌生人/好友的基本个人信息"""
    data = {"user_id": user_id, "no_cache": True}
    return await self._call_api("get_stranger_info", data)

async def get_msg(self, message_id: int):
    """根据 message_id 反查消息详细内容"""
    data = {"message_id": message_id}
    return await self._call_api("get_msg", data)

调用实战(检查是否拥有管理员权限): ​

python
member_info = await bot.get_group_member_info(event.group_id, event.user_id)
role = member_info.get("data", {}).get("role")  # "owner" / "admin" / "member"

if role in ["owner", "admin"]:
    await bot.send(event, "管理员大人好!有什么吩咐吗?")
else:
    await bot.send(event, "普通群员不可以执行这个危险操作哦~")