Discord CDN旧资源不删除导致机器人头像无法更新的技术问询
解决Discord机器人列表网站头像无法更新的问题
直接可行的解决思路
- 靠Discord用户对象里的
avatar哈希值判断头像是否更新,别再去检测CDN资源有效性 - 搭配本地缓存和合理的API调用策略,避开速率限制
问题根源复盘
- Discord CDN特性:旧头像资源不会被主动删除,即便用户更换新头像,旧CDN链接依然可访问
- 错误检测逻辑的坑:用带
?size=...的HEAD请求检测时,Discord CDN会自动生成对应尺寸的旧资源,导致后续检测永远返回200,无法识别头像已更新 - API速率限制:频繁调用Discord用户接口会触发限流,不能直接无限制轮询
具体实现步骤
缓存头像哈希值
- 首次获取机器人用户信息时,将
avatar字段的哈希值存储到本地数据库或缓存中 - 后续校验头像更新时,先对比本地缓存的哈希值与最新接口返回的哈希值
- 只有当哈希值不一致时,才判定头像已更新,此时同步更新本地存储的CDN链接和哈希值
- 首次获取机器人用户信息时,将
优化API调用策略
- 给每个机器人设置合理的调用间隔,比如1-2小时调用一次用户接口,避免触发限流
- 利用Discord API的
If-Modified-Since请求头:如果用户信息未修改,接口会返回304 Not Modified,不消耗请求额度
正确处理CDN链接
- 头像哈希值更新后,直接拼接新CDN链接:
https://cdn.discordapp.com/avatars/{user_id}/{new_avatar_hash}.png?size=256(size参数可按需调整) - 无需再检测CDN资源有效性,哈希值变化意味着头像已更换,新链接必然指向有效资源
- 头像哈希值更新后,直接拼接新CDN链接:
额外注意事项
- 若机器人使用默认头像(无
avatar字段或哈希值为null),直接使用Discord默认头像链接即可 - 本地缓存的哈希值要与接口返回值完全一致,避免因大小写或格式问题导致误判
内容的提问来源于stack exchange,提问作者toplay 4free
相关产品推荐
相关产品推荐

