后端即时通讯API网关【免费下载链接】go-cqhttpcqhttp的golang实现轻量、原生跨平台.项目地址https://gitcode.com/gh_mirrors/go/go-cqhttp点击查看免费下载本篇技术指南以 go-cqhttp 开源仓库为主体系统讲解其项目定位、OneBot-v11 兼容性、四大通信接口、拓展 CQ 码 / API / 事件体系以及基于config.yml与device.json的完整配置与部署方式并结合仓库源码说明各功能模块的底层实现原理。读者读完可完整掌握 go-cqhttp 的能力边界、配置方法、命令行参数与消息 / 事件模型具备基于其搭建 QQ 机器人与上层应用的实际能力。项目定位与技术背景go-cqhttp 是一个基于 Mirai项目描述为cqhttp 的 golang 实现轻量、原生跨平台。其核心价值在于将 QQ 客户端协议能力封装为标准的 OneBot 接口使上层 Bot 应用可以通过统一的 HTTP / WebSocket 协议收发消息而无需关心底层协议实现。从源码结构看整个项目分为以下几大模块与文章后续章节一一对应coolq/核心业务层负责 CQ 码编解码、消息转换与全部 API 的具体实现cqcode.go、api.goserver/与modules/servers/通信服务层实现 HTTP、正向 / 反向 WebSocket、pprof 等服务器的注册与启动http.go、websocket.go、servers.gomodules/config/配置文件解析与默认配置生成config.go、default_config.ymldb/消息数据库实现支持 LevelDB、SQLite3、MongoDB 三种后端cmd/gocq/程序入口负责参数解析、登录流程、重连与签名服务器逻辑main.go。需要特别说明的是README 在重要信息一节明确提示由于 QQ 官方不断更新加密方案该项目的协议维护已停止README 建议 Bot 开发者迁移至无头 NTQQ 方案。因此本文内容以当前仓库实际能力为准读者在选型时应结合这一背景做出判断。兼容性与通信接口go-cqhttp 兼容 OneBot-v11接口类型说明HTTP API由 Bot 应用主动调用 go-cqhttp 暴露的 HTTP 接口默认监听0.0.0.0:5700反向 HTTP POSTgo-cqhttp 将事件主动 POST 到应用配置的地址支持多点上报正向 WebSocket应用作为客户端主动连接 go-cqhttp 的 WebSocket 服务默认监听0.0.0.0:6700反向 WebSocketgo-cqhttp 作为客户端连接应用提供的 WebSocket 服务支持 Universal / API / Event 三通道源码层的服务注册机制这四类服务在启动时由统一的注册机制加载。在 servers.go 中servers包维护两个注册表svr需要配置节点的服务与nocfgsvr无需配置的服务并提供Register与RegisterCustom两个注册函数func Register(name string, proc func(*coolq.CQBot, yaml.Node)) { ... svr[name] proc } func Run(bot *coolq.CQBot) { for _, l : range base.Servers { for name, conf : range l { if fn, ok : svr[name]; ok { go fn(bot, conf) } } } ... }也就是说config.yml中servers列表里出现的每个服务名都会在登录成功后见 cmd/gocq/main.go 中servers.Run(coolq.NewQQBot(cli))调用以 goroutine 形式并发启动这也是 go-cqhttp 支持同一连接方式可添加多个的底层原因。HTTP 服务、反向 HTTP 多点上报、WebSocket 服务的具体监听与转发逻辑位于 server/http.go 与 server/websocket.go。拓展支持一览在 OneBot-v11 标准之上go-cqhttp 增加了以下能力完整说明见 docs/cqhttp.mdHTTP POST 多点上报servers的http.post列表可配置多个上报地址反向 WS 多点连接ws-reverse支持同时配置多个地址修改群名/set_group_name消息撤回事件群消息撤回group_recall、好友消息撤回friend_recall解析 / 发送回复消息[CQ:reply]解析 / 发送合并转发[CQ:forward]、[CQ:node]使用代理请求网络图片message.proxy-rewrite配置项。已实现的 CQ 码体系CQ 码是 OneBot 协议中描述消息内容的核心语法形如[CQ:face,id178]。go-cqhttp 既完整实现了 OneBot 标准的 CQ 码也扩展了标准之外的类型。符合 OneBot 标准的 CQ 码CQ 码功能[CQ:face]QQ 表情[CQ:record]语音[CQ:video]短视频[CQ:at]某人[CQ:share]链接分享[CQ:music]音乐分享 / 音乐自定义分享[CQ:reply]回复[CQ:forward]合并转发[CQ:node]合并转发节点[CQ:xml]XML 消息[CQ:json]JSON 消息拓展 CQ 码及与标准略有差异的 CQ 码拓展 CQ 码功能[CQ:image]图片支持 flash 闪照、show 秀图[CQ:redbag]红包仅接收[CQ:poke]戳一戳仅群聊发送[CQ:node]合并转发消息节点[CQ:cardimage]一种 xml 的图片消息装逼大图[CQ:tts]文本转语音仅群聊音源与登录账号性别有关其中[CQ:image]是使用最频繁的拓展码详细参数见 docs/cqhttp.md包括file文件名支持本地路径、HTTP URL、base64://前缀、typeflash闪照 /show秀图、subType群聊图片子类型0~13 分别表示正常图片、表情包、热图、斗图、贴图、自拍、热搜图等、url、cache是否使用缓存、id秀图特效 ID默认 40000与c下载线程数。秀图特效 ID 对应关系为40000 普通、40001 幻影、40002 抖动、40003 生日、40004 爱你、40005 征友。示例[CQ:image,filehttp://baidu.com/1.jpg,typeshow,id40004]。注意图片总大小不能超过 30MBgif 总帧数不能超过 300 帧。源码中的 CQ 码转换链路CQ 码的编解码核心在 coolq/cqcode.go。上行方向应用 → QQConvertElement将解析出的msg.Element转换为 MiraiGo 消息元素例如image类型依据file前缀http/file/base64/base16384/ 缓存文件分别走网络下载、本地读取、解码流等路径makeImageOrVideoElem中通过md5.Sum([]byte(f))生成缓存文件名并限制图片 30MB、视频 100MB 的上限常量maxImageSize、maxVideoSize定义于文件头部reply类型reply()函数支持两种用法id存在时从数据库查询原消息构造ReplyElement否则使用text/qq/time/seq字段构造自定义回复music类型qqQQ 音乐与163网易云音乐走各自平台的歌曲信息接口custom类型则拼接 XML 卡片tts类型调用bot.Client.GetTts()获取语音数据并ResampleSilk重采样。下行方向QQ → 应用toElements函数将 MiraiGo 元素数组转换为 OneBot 消息元素群图、好友图、频道图分别映射为image类型并自动附加typeflash或typeshow字段。已实现的 API 体系go-cqhttp 实现了 OneBot 标准的绝大部分 API并额外提供了大量拓展 API。标准 API 与拓展 API 的完整定义分别见 README.md 与 docs/cqhttp.md。符合 OneBot 标准的 API涵盖消息、群管理、好友管理、信息查询四大类主要包括消息类/send_private_msg、/send_group_msg、/send_msg、/delete_msg撤回信息群管理类/set_group_kick群组踢人、/set_group_ban单人禁言、/set_group_whole_ban全员禁言、/set_group_admin设置管理员、/set_group_card设置群名片、/set_group_name设置群名、/set_group_leave退出群组、/set_group_special_title设置专属头衔请求处理类/set_friend_add_request处理加好友请求、/set_group_add_request处理加群请求/邀请信息查询类/get_login_info、/get_stranger_info、/get_friend_list、/get_group_info、/get_group_list、/get_group_member_info、/get_group_member_list、/get_group_honor_info、/can_send_image、/can_send_record、/get_version_info运维类/set_restart重启 go-cqhttp、/.handle_quick_operation对事件执行快速操作。拓展 API 及与标准略有差异的 API拓展 API功能/set_group_portrait设置群头像/get_image获取图片信息size、filename、url/get_msg获取消息message_id、real_id、sender、time、message/get_forward_msg获取合并转发内容/send_group_forward_msg发送合并转发群/.get_word_slices获取中文分词/.ocr_image图片 OCR仅支持已接收的图片/get_group_system_msg获取群系统消息邀请 / 进群请求列表/get_group_file_system_info获取群文件系统信息/get_group_root_files获取群根目录文件列表/get_group_files_by_folder获取群子目录文件列表/get_group_file_url获取群文件资源链接/get_status获取状态运行统计此外docs/cqhttp.md 还记录了更丰富的拓展 API包括/get_group_at_all_remain全体成员剩余次数、/download_file下载文件到缓存目录返回绝对路径可配合 CQ 码直接发送、/get_group_msg_history群消息历史、/get_online_clients在线客户端列表、/check_url_safely链接安全性检查1 安全 / 2 未知 / 3 危险、/_get_vip_info用户 VIP 信息、/_send_group_notice//_get_group_notice//_del_group_notice群公告管理、/set_essence_msg//delete_essence_msg//get_essence_msg_list精华消息管理、/upload_group_file//upload_private_file上传文件仅支持本地路径HTTP 文件需先经/download_file下载、/set_qq_profile设置个人资料、/get_unidirectional_friend_list//delete_unidirectional_friend//delete_friend、/qidian_get_account_info企点协议专用、/mark_msg_as_read、/reload_event_filter重载事件过滤器等。以/get_status为例其响应中的stat统计对象包含packet_received、packet_sent、packet_lost、message_received、message_sent、disconnect_times、lost_times等字段所有统计信息在重启后重置可用于监控 Bot 运行健康度。已实现的事件体系go-cqhttp 的事件上报同样分为 OneBot 标准事件与拓展事件两类。符合 OneBot 标准的事件消息事件私聊信息、群消息通知事件群文件上传、群管理员变动、群成员减少、群成员增加、群禁言、好友添加、群消息撤回、好友消息撤回、群内戳一戳、群红包运气王、群成员荣誉变更请求事件加好友请求、加群请求/邀请。拓展事件事件类型拓展 Event通知事件好友戳一戳通知事件群内戳一戳通知事件群成员名片更新通知事件接收到离线文件详细的字段定义见 docs/cqhttp.md 的事件章节例如群消息撤回post_typenotice、notice_typegroup_recall携带group_id、user_id消息发送者、operator_id操作者、message_id群内戳一戳notice_typenotify、sub_typepoke携带group_id、user_id、target_id。注意此事件无法在平板和手表协议上触发群成员名片更新notice_typegroup_card携带card_new、card_old名片为空时为空字符串而非昵称不保证时效性仅在收到消息时校验群成员头衔更新事件notice_typenotify携带user_id与title接收到离线文件notice_typeoffline_filefile对象含name、size、url其他客户端在线状态变更notice_typeclient_status携带clientDevice 对象与online精华消息notice_typeessencesub_type为add/delete携带sender_id、operator_id、message_id。事件过滤器机制可参考 docs/EventFilter.md 与 modules/filter/通过在default-middlewares.filter配置过滤器文件路径可按条件筛选需要上报的事件并通过/reload_event_filterAPI 热重载。配置体系config.yml 与 device.jsongo-cqhttp 运行时依赖config.yml运行配置与device.json虚拟设备信息两个文件。配置文件使用 YAML 语法首次启动时若未找到配置文件程序会自动生成config.yml默认内容来自 default_config.yml通过//go:embed嵌入二进制见 config.go并交互式询问需要启用的通信方式生成完成后退出等待用户修改。账号配置accountaccount: # 账号相关 uin: 1233456 # QQ账号 password: # 密码为空时使用扫码登录 encrypt: false # 是否开启密码加密 status: 0 # 在线状态 relogin: # 重连设置 delay: 3 # 首次重连延迟, 单位秒 interval: 3 # 重连间隔 max-times: 0 # 最大重连次数, 0为无限制 use-sso-address: true # 是否使用服务器下发的新地址进行重连 allow-temp-session: false # 是否允许发送临时会话消息encrypt: true时程序每次启动要求输入解密密钥密钥错误会导致登录时提示密码错误。解密后的密码哈希存储于内存中用于自动重连因此该加密并不能防止内存读取见 docs/config.md 注 1。实现上密码哈希经 PBKDF2迭代 114514 次 AES 加密后写入password.encrypt文件相关函数PasswordHashEncrypt/PasswordHashDecrypt位于 cmd/gocq/main.gostatus在线状态取值 0~21分别对应在线、离开、隐身、忙、听歌中、星座运势、今日天气、遇见春天、Timi 中、吃鸡中、恋爱中、汪汪汪、干饭中、学习中、熬夜中、打球中、信号弱、在线学习、游戏中、度假中、追剧中、健身中。源码中allowStatus数组cmd/gocq/main.go对应了这些状态且登录时会做越界保护if uint(base.Account.Status) uint(len(allowStatus)) { base.Account.Status 0 }relogin重连逻辑断开后首先等待delay秒随后按interval间隔重试max-times为最大重连次数0 表示无限制relogin.disabled: true可关闭自动重连对应源码中if base.Reconnect.Disabled { os.Exit(1) }。签名服务器配置sign-servers这是 go-cqhttp 后期版本的核心配置块用于规避登录 45 错误码与发送消息风控sign-servers: - url: - # 主签名服务器地址 必填 key: 114514 # 签名服务器所需要的apikey版本 1.1.0 及以下此项无效 authorization: - # authorization 内容, 依服务端设置如 Bearer xxxx - url: - # 备用 key: 114514 authorization: - rule-change-sign-server: 1 # 判断签名服务不可用的额外规则 max-check-count: 0 # 连续寻找可用签名服务器最大尝试次数 sign-server-timeout: 60 # 签名服务请求超时时间(s) is-below-110: false # 签名服务器版本 1.1.0 时设为 true auto-register: false # 是否在实例丢失时自动重新注册 auto-refresh-token: false # token 过期后是否立即自动刷新 refresh-interval: 40 # 定时刷新 token 间隔(分钟)建议 30~40不可超过 60rule-change-sign-server取值0 不设置仅在请求无返回时判定不可用1 在获取到的 sign 为空时切换建议配合关闭auto-register2 在 sign 或 token 为空时切换建议配合关闭auto-refresh-token。签名服务器的处理逻辑位于 cmd/gocq/main.go 的getAvaliableSignServer与定时刷新逻辑signStartRefreshToken。若未配置可用签名服务器程序会输出警告未配置签名服务器或签名服务器不可用, 这可能会导致登录 45 错误码或发送消息被风控。消息与上报配置messagemessage: post-format: string # 上报数据类型: string,array ignore-invalid-cqcode: false # 是否忽略无效的CQ码, 为假将原样发送 force-fragment: false # 是否强制分片发送消息 fix-url: false # 是否将url分片发送 proxy-rewrite: # 下载图片等请求网络代理 report-self-message: false # 是否上报自身消息 remove-reply-at: false # 移除服务端的Reply附带的At extra-reply-data: false # 为Reply附加更多信息 skip-mime-scan: false # 跳过 Mime 扫描, 忽略错误数据 convert-webp-image: false # 是否自动转换 WebP 图片 http-timeout: 15 # download 超时时间(s)post-format决定上报消息体是字符串形式string含 CQ 码还是数组形式array分段元素源码在 base/flag.go 的Init()中对非法的post-format值会警告并回退为stringforce-fragment为原酷 Q 发送长消息的老方案分片发送速度更优、兼容性更好但在有发言频率限制的群里可能无法发送关闭后优先使用新方案能发送更长消息但速度更慢部分老客户端无法解析docs/config.md 注 3fix-url对应源码中SplitURL在ConvertElement的text分支中通过param.SplitURL将 URL 拆分发送remove-reply-at/extra-reply-data对应toElements中对ReplyElement的处理前者移除 reply 后紧跟的 元素后者为 reply 附加seq、qq、time、text字段。日志与数据库配置output / databaseoutput: log-level: warn # trace,debug,info,warn,error log-aging: 15 # 日志时效 单位天, 0 为永久保留 log-force-new: true # 是否每次启动强制创建全新日志文件 log-colorful: true # 是否启用日志颜色 debug: false # 开启调试模式 database: leveldb: enable: true # 启用内置leveldb数据库 sqlite3: enable: false cachettl: 3600000000000 # 1h日志按天轮转写入logs/%Y-%m-%d.log轮转与清理逻辑见 cmd/gocq/main.go 的PrepareData()使用file-rotatelogs数据库启用 leveldb 会增加 10~20MB 内存占用关闭后将无法使用撤回、回复、get_msg等上下文相关功能。数据库抽象层位于 db/database.go 与 db/multidb.goLevelDB / SQLite3 / MongoDB 实现分别在 db/leveldb/、db/sqlite3/、db/mongodb/。中间件与连接服务default-middlewares / serversdefault-middlewares: default access-token: # 访问密钥, 强烈推荐在公网的服务器设置 filter: # 事件过滤器文件目录 rate-limit: # API限速设置(令牌桶算法, 全局生效) enabled: false frequency: 1 # 令牌回复频率, 单位秒 bucket: 1 # 令牌桶大小 servers: - http: address: 0.0.0.0:5700 timeout: 5 # 反向HTTP超时时间, 最小值为5 middlewares: : *default post: # 反向HTTP POST地址列表 #- url: # 地址 # secret: # 密钥 - ws: address: 0.0.0.0:6700 middlewares: : *default - ws-reverse: universal: ws://your_websocket_universal.server # api: ws://your_websocket_api.server # event: ws://your_websocket_event.server reconnect-interval: 3000 middlewares: : *default - pprof: host: 127.0.0.1 port: 7700HTTP / WS 地址支持tcp4://前缀指定 IPv4 监听address: tcp4://0.0.0.0:5700IPv6 同理ws-reverse中设置universal后api与event将被忽略同时配置多个反向 WS 地址可实现多点连接pprof性能分析服务器不支持中间件、不支持鉴权请勿开放到公网对于不需要的通信方式可以注释停用推荐或添加配置disabled: true关闭。环境变量占位符配置文件支持${VAR}占位符读取环境变量实现于 config.go 的expand函数使用正则\${([a-zA-Z_][a-zA-Z0-9_:/.]*)}匹配account: uin: ${CQ_UIN} # 读取环境变量 CQ_UIN password: ${CQ_PWD:123456} # 当 CQ_PWD 为空时使用默认值 123456设备信息device.json与协议device.json保存虚拟设备信息首次启动自动生成随机设备。关键字段为protocol| 值 | 类型 | 限制 | | -- | ---- | ---- | | 0 | iPad | 无 | | 1 | Android Phone | 无 | | 2 | Android Watch | 无法接收notify事件、无法接收口令红包、无法接收撤回消息 | | 3 | MacOS | 无 | | 4 | 企点 | 只能登录企点账号或企点子账号 |协议不同对各类消息有所限制扫码登录password为空仅部分协议支持源码中isQRCodeLogin cli.Device().Protocol ! 2时会提示当前协议不支持二维码登录。另外可创建address.txt文件位于工作目录每行IP:PORT自定义服务器 IP用于解决海外服务器的链路问题该逻辑见 cmd/gocq/main.go 的newClient()c.SetCustomServer(addr)。命令行参数与启动流程通过-h可查看全部命令行参数源码定义于 internal/base/flag.go参数说明-c filename指定配置文件路径默认config.yml-d以 daemon守护进程方式运行-h打印帮助-w dir覆盖工作目录-D开启 debug 模式-faststart跳过启动等待 5 秒的流程-update-protocol启动时更新协议版本启动流程见 cmd/gocq/main.go分为四个阶段InitBase()解析参数、处理双击运行 /-h/-d读取配置PrepareData()初始化日志rotatelogs 按天轮转、创建图片 / 语音 / 视频缓存目录、打开数据库LoginInteract()处理密码加密、加载 / 生成device.json、获取签名服务器、选择扫码 / 密码 / token 登录登录成功后会保存session.token以便快速重连、加载好友与群列表、设置在线状态、启动各通信服务WaitSignal()后台检查更新与网络诊断等待退出信号。登录后程序会在断开时自动重连DisconnectedEvent.Subscribe回调优先使用session.token快速恢复会话失败后回退为普通登录若relogin.disabled则直接退出。性能参考README 中给出的官方性能数据为在关闭数据库的情况下加载 25 个好友、128 个群运行 24 小时后内存使用约 15MB开启数据库后内存使用将根据消息量增加 10~20MB。如果系统内存小于 128M建议关闭数据库使用。该数据为项目自述实际占用会随好友数、群数、消息量与协议版本变化。云函数部署与跨平台运行go-cqhttp 支持通过云函数CustomRuntime部署scripts/bootstrap已给出 bootstrap 文件。部署步骤为在本地完成登录将config.yml、device.json、bootstrap和go-cqhttp二进制一起打包在触发器中创建 API 网关触发器并启用集成响应即可通过 API 网关访问 go-cqhttp建议配置 AccessToken。注意scripts/bootstrap中使用的工作路径为/tmp该目录最大容量约 500M如需长期使用应挂载文件存储CFS。详细说明见 docs/config.md。其他周边文档还包括快速开始、CQ 码与 API 详解、配置文件详解、事件过滤器、频道guild支持、滑动验证码处理、MIME 文件识别、管理 APIadminApi 以及 常见问题QA可作为深入使用的参考。总结go-cqhttp 以 Go 原生实现、跨平台、轻量著称通过完整兼容 OneBot-v11 标准并在此基础上扩展大量 CQ 码、API 与事件为 QQ 机器人开发提供了统一、清晰的协议入口。本文从接口兼容、消息模型、事件体系、配置与启动流程、底层源码实现五个维度对其进行了系统梳理——理解coolq/的 CQ 码转换链路、modules/config/的配置解析机制、modules/servers/的服务注册机制以及cmd/gocq/的登录与签名流程是深入掌握 go-cqhttp 并进行二次开发的关键。需要注意的是项目 README 已声明协议维护停止生产环境选型时应关注其维护状态与替代方案。赞分享后端即时通讯API网关【免费下载链接】go-cqhttpcqhttp的golang实现轻量、原生跨平台.项目地址https://gitcode.com/gh_mirrors/go/go-cqhttp点击查看免费下载相关推荐Go-CQHTTP基于Golang的高性能QQ机器人框架Go CQHTTP基于Golang的高性能QQ机器人框架 Go CQHTTP是一个基于Golang编写的QQ机器人框架它实现了OneBot协议的标准为开发后端即时通讯API网关go-cqhttp API完整指南30接口让你的QQ机器人功能全面解锁go cqhttp API完整指南30接口让你的QQ机器人功能全面解锁 go cqhttp 是 CQHTTP 的 Golang 原生实现提供 30 个后端即时通讯API网关RC2 分组密码的 Go 实现深度解析基于 crypto/cipher.Block 接口的兼容封装RC2 分组密码的 Go 实现深度解析基于 crypto/cipher.Block 接口的兼容封装 导读 本文以 scan4all 仓库 vendored 的网络安全漏洞扫描渗透测试应用安全上一篇Chrome 串口 API 实战用 Chrome App 与 Arduino 控制舵机Servo Serial Sample 全解析下一篇【亲测免费】 SHADERed轻量级跨平台着色器集成开发环境创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考