# napcat ↔ snowluma 接口差异对比 > 结论先行:**可以直接替换**。现有 napcat 机器人项目只需改一行导入(加别名), > 103 个 API 方法里 100 个零改动可用、2 个已在本包内做动作名适配、1 个 SnowLuma 未实现。 ## 一、协议层:完全一致 | 维度 | napcat(NapCatQQ) | snowluma(SnowLuma) | | --- | --- | --- | | 协议 | OneBot v11 + NapCat 兼容 | OneBot v11 + NapCat 兼容 | | HTTP API | `POST /{action}`,`Authorization: Bearer` | 同 | | WebSocket | 正向/反向,echo 配对 | 同 | | HTTP 上报 | X-Signature (HMAC-SHA1) 快速操作 | 同 | | 应答信封 | `{status,retcode,data,echo,message,wording}` | 同 | | 事件 | message/message_sent/notice/request/meta_event | 同 | 因此两包的 Client/Context/Session/消息段/CQ 码/事件结构完全可互换——本包 `snowluma` 就是按 napcat 的公开 API 逐一对齐移植的,方法名、签名、返回类型、`On*` 注册、消息段构造函数全部同名。 ## 二、迁移方式 napcat 项目原来: ```go import "gitea.doicat.com/bot/napcat" ``` 改成: ```go import napcat "gitea.doicat.com/bot/snowluma" ``` 导入别名 `napcat` 覆盖包声明名 `snowluma`,因此代码里所有 `napcat.XXX` 引用保持不变, `napcat.New()`、`napcat.Text(...)`、`*napcat.Context`、`napcat.ErrNotConnected` 等照常编译。 这正是你设想的「方法名写一样 + import rename」。 ## 三、napcat 103 个方法 → SnowLuma 的映射 ### 3.1 直接可用(100 个) 以下方法对应的 wire 动作名在 SnowLuma 中完全相同,零改动即可用(示例,非全量): 消息收发 `SendPrivateMsg/SendGroupMsg/SendMsg/SendPrivateMsgCQ/SendGroupMsgCQ/DeleteMsg/GetMessage/GetForwardMsg/SendLike/Mark*AsRead/SetMsgEmojiLike`; 合并转发 `SendGroupForwardMsg/SendPrivateForwardMsg/SendForwardMsg/Forward*SingleMsg`; 历史 `GetFriendMsgHistory/GetGroupMsgHistory`; 信息 `GetLoginInfo/GetStrangerInfo/GetFriendList/GetFriendsWithCategory/DeleteFriend/GetGroupInfo/GetGroupInfoEx/GetGroupList/GetGroupMemberInfo/GetGroupMemberList/GetGroupHonorInfo`; 群管理 `SetGroupKick/SetGroupBan/SetGroupWholeBan/SetGroupAdmin/SetGroupCard/SetGroupName/SetGroupLeave/SetGroupSpecialTitle/SetGroupPortrait/SetGroupSign/SendGroupSign/GetGroupAtAllRemain/GetGroupShutList`; 戳一戳/状态 `SendPoke/FriendPoke/GroupPoke/SetInputStatus/SetOnlineStatus/SetSelfLongNick/GetUserStatus/GetPacketStatus/GetProfileLike`; 请求 `SetFriendAddRequest/SetGroupAddRequest`; 文件 `UploadGroupFile/UploadPrivateFile/DeleteGroupFile/DeleteGroupFolder/CreateGroupFileFolder/GetGroupFileSystemInfo/GetGroupRootFiles/GetGroupFilesByFolder/GetGroupFileURL/DownloadFile/GetFile/CheckURLSafely/OCRImage`; 媒体 `GetImage/GetRecord/CanSendImage/CanSendRecord/FetchCustomFace/FetchEmojiLike/GetAICharacters/SendGroupAIRecord/GetMiniAppArk/TranslateEn2Zh/GetRKey`; 系统 `GetStatus/GetVersionInfo/CleanCache/SetRestart/GetCookies/GetCSRFToken/GetCredentials/GetOnlineClients/SetQQProfile/SetQQAvatar/GetModelShow/SetModelShow/GetRecentContact`; 精华/公告/系统消息 `GetEssenceMsgList/SetEssenceMsg/DeleteEssenceMsg/SendGroupNotice/GetGroupNotice/DelGroupNotice/GetGroupSystemMsg`。 ### 3.2 已做动作名适配(2 个) napcat 里这两个动作用了 **NapCat 私有的大小写混合名**,SnowLuma 改用 NapCat 标准名。 本包保持方法名不变,内部改发 SnowLuma 的标准动作名,因此调用方无感知: | napcat 方法 | napcat 动作名 | SnowLuma 动作名(本包已适配) | | --- | --- | --- | | `ArkShareGroup(groupID)` | `ArkShareGroup` | `send_group_ark_share` | | `ArkSharePeer(userID)` | `ArkSharePeer` | `send_ark_share` | ### 3.3 SnowLuma 未实现(1 个) | napcat 方法 | 动作名 | SnowLuma 状态 | | --- | --- | --- | | `GetRobotUinRange()` | `get_robot_uin_range` | 未实现(调用返回 retcode 错误) | 该方法是 NapCat 特有扩展(获取官方机器人号段),SnowLuma 动作注册表中不存在。 方法签名仍保留(保证代码能编译),运行时才会报错——若你的机器人在用这个接口,需要去掉或改为等价方案。 ## 四、SnowLuma 独有(napcat 没有)的能力 SnowLuma 动作注册表共 **200 个动作**,比 napcat 覆盖的 103 个多出约 96 个。 本包在 `api_ext.go` 中为其中主要动作提供了类型化方法,其余可用 `Call` 裸调: | 类别 | 动作数(约) | 本包封装示例 | | --- | --- | --- | | 闪传(flash) | 11 | `CreateFlashTask/GetFilesetInfo/ListFilesets/SendFlashMsg/GetFlashFileURL/...` | | Ark 卡片 | 6 | `SendGroupArkShare/SendArkShare/SharePeer/ShareGroupEx/SendTuwenArk/ClickInlineKeyboardButton` | | 群待办 | 4 | `GetGroupTodoList/SetGroupTodo/CompleteGroupTodo/CancelGroupTodo` | | 群分类标签 | 4 | `GetGroupTags/AddGroupTag/DeleteGroupTag/GetGroupAdminSettings` | | 群相册 | 9 | `GetGroupAlbumList/UploadImageToQunAlbum/DoGroupAlbumComment/...` | | QQ 空间 | 10 | `GetQzoneMsgList/SendQzoneMsg/LikeQzone/CommentQzone/SetQzoneBan/...` | | 系统表情 | 4 | `FetchSysFaces/FetchFaceEntity/SearchSysFaces/FetchSuperFaceID` | | 流式接口 | 6 | `UploadFileStream/DownloadFileStream/DownloadFileImageStream/...` | | 群管理扩展 | 10+ | `SetGroupKickMembers/SetGroupAddOption/SetGroupSearch/SetGroupMemberPermissions/...` | | 其他扩展 | 30+ | `SetFriendRemark/SetGroupRemark/SetGroupReaction/FetchPttText/GetGroupDetailInfo/TransGroupFile/BotExit/GetAIRecord/SendPacket/GetCollectionList/...` | 未收录到类型化方法的动作(如 `get_group_ignored_notifies`、`send_packet` 的细节参数、 `create_collection` 等占位/未实现动作)一律通过: ```go var out map[string]any err := bot.Call(nil, "action_name", snowluma.H{"k": "v"}, &out) // 或事件内:c.Call(nil, "action_name", snowluma.H{...}, &out) ``` ## 五、替换结论 1. **编译层**:100% 兼容——改导入(加别名)即可,全部 103 个方法名都存在。 2. **运行层**:100/103 方法行为一致;2 个 Ark 方法已适配为 SnowLuma 标准名;1 个(`GetRobotUinRange`)SnowLuma 未实现。 3. **能力层**:SnowLuma 比 NapCat 多出约 96 个动作(闪传/Ark/待办/相册/空间/系统表情/流式等), 这些是 NapCat SDK 没有的增量能力,迁移后可按需使用。 因此:**「直接替换包名」这个思路成立**,且因为本包连公开 API 名都对齐了 napcat, 连「写一个中间适配层」都不需要,一行 `import napcat "gitea.doicat.com/bot/snowluma"` 即可。 唯一需要你留意的运行时差异就是 `GetRobotUinRange`(未实现)与两个 Ark 方法(已适配,无需你改)。