Skip to content

feat(qq-official): 成员头像按机器人 AppID + openid 显示 - #1232

Merged
SuInk merged 1 commit into
mainfrom
claude/qq-official-member-avatars
Oct 27, 2026
Merged

SuInk merged 1 commit into
mainfrom
claude/qq-official-member-avatars

Conversation

@SuInk

@SuInk SuInk commented Oct 27, 2026

Copy link
Copy Markdown
Owner

QQ 官方机器人的成员现在能显示头像了:控制台事件页等用成员头像的地方,按「这台机器人的 AppID + openid」从 qlogo 取真头像,不再一律显示首字母占位;Agent 查看被 @ 成员和取成员头像时也能拿到同一个地址。

Why

QQ 官方机器人收到的发送者只有 openid,没有 QQ 号。原来的头像地址只按数字 QQ 号拼 q1.qlogo.cn/g?nk=<QQ号>,官方机器人的 openid 拼不出来,remoteAvatarURL 和 MemberAvatarURL 对非 OneBot 平台直接返回空,界面只能退回首字母占位。

改了什么

  • assistant.QQOfficialMemberAvatarURL(appID, openID):拼 https://q.qlogo.cn/qqapp/<AppID>/<openid>/640,AppID 必须是数字、openid 必须是 32 位十六进制,否则返回空。
  • WebUI remoteAvatarURL:成员头像先看是不是 QQ 官方机器人,是就用它的 QQAppID 拼地址,走现有的头像缓存和条件请求。单机器人部署的事件里 profile_id 为空时,只有一台官方机器人才算它的;数字 QQ 号拼不出地址时照旧走 OneBot。
  • 运行时 avatarSourceURL 和「被@成员」那一行:官方机器人按事件所属机器人的 AppID 给地址。
  • 群头像没有找到可用的公开地址,本次不动。

用户或开发者影响

  • 用 QQ 官方机器人的部署,事件页发送者等处能看到成员真头像。
  • OneBot、Telegram 等其他平台的头像逻辑不变。

验证

  • 实测:用生产里一个真实 openid 和对应 AppID 请求该地址,返回 76 KB 的真头像;编造的 openid 返回 1.5 KB 的统一默认图,说明地址按人区分。
  • 新增 TestQQOfficialMemberAvatarURL(地址形状与非法输入)和 TestRemoteAvatarURLForQQOfficialMembers(指定机器人、空 profile 兜底、数字 QQ 号仍走 OneBot、群头像不给地址),测试用合成号码。
  • scripts/test-serial.sh ./webui ./model/assistant:-race 和 TZ=UTC 均通过;gofmt、git diff --check、公开仓库审计通过。
  • demo 模式用的是模拟数据,不经过这条后端路径,所以没有在浏览器里目视验证。

QQ 官方机器人只给 openid,之前头像只按数字 QQ 号拼 qlogo 地址,官方机器人的成员
在事件页等处一律退回首字母占位。qlogo 提供 qqapp/<AppID>/<openid> 地址,按这台
机器人的 AppID 拼出来即可取到真头像;Agent 看被 @ 成员和取头像时同样补上。
@SuInk
SuInk force-pushed the claude/qq-official-member-avatars branch from 075b18a to e82938b Compare October 27, 2026 16:20
@SuInk
SuInk merged commit b496126 into main Oct 27, 2026
14 checks passed
@SuInk
SuInk deleted the claude/qq-official-member-avatars branch October 27, 2026 16:26
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant