使用discord.js开发Discord Bot如何获取用户当前游玩游戏的缩略图
Discord.js 游戏时长统计Bot游戏缩略图获取方案
你不需要自行维护游戏图标数据库,Discord官方CDN已提供所有平台登记过的游戏、应用的图标资源,直接通过Activity对象的applicationId和assets属性拼接即可获取。
图标拼接规则
- 优先取
activity.assets.largeImage字段:该字段为Discord为对应游戏预匹配的高清缩略图标识- 若标识前缀为
mp:,裁剪掉前缀后拼接:https://cdn.discordapp.com/app-assets/${activity.applicationId}/${裁剪后的标识}.png - 无前缀直接拼接:
https://cdn.discordapp.com/app-assets/${activity.applicationId}/${activity.assets.largeImage}.png
- 若标识前缀为
- 无
largeImage时用应用官方图标兜底:https://cdn.discordapp.com/app-icons/${activity.applicationId}/${activity.application?.icon || '0'}.png - 若上述资源都不存在,可自行设置通用游戏占位图兜底
修正后代码示例
const { EmbedBuilder } = require('discord.js'); const user = newPresence.user; // 修正原代码拼写错误 oldPresnece -> oldPresence const activities = activityDiff(oldPresence, newPresence); activities.forEach(activity => { // 仅处理游戏类活动,过滤直播、听歌等其他状态 if (activity.type !== 0) return; const playTime = getPlayTime(activity); let gameIcon = null; if (activity.applicationId) { if (activity.assets?.largeImage) { let imgKey = activity.assets.largeImage; if (imgKey.startsWith('mp:')) imgKey = imgKey.slice(3); gameIcon = `https://cdn.discordapp.com/app-assets/${activity.applicationId}/${imgKey}.png`; } else { gameIcon = `https://cdn.discordapp.com/app-icons/${activity.applicationId}/${activity.application?.icon || '0'}.png`; } } // 构建嵌入式消息 const playTimeEmbed = new EmbedBuilder() .setTitle(`${user.username} 已结束游戏`) .setDescription(`游戏名称:${activity.name}\n本次游玩时长:${playTime}`) .setColor('#5865F2') .setThumbnail(gameIcon || '你的自定义兜底占位图地址') .setTimestamp(); // 发送消息加错误捕获,避免无频道发消息权限时崩溃 newPresence.guild.channels.cache.filter(c => c.isText()).each(channel => { channel.send({ embeds: [playTimeEmbed] }).catch(err => console.log('频道无发送权限,已跳过', err)); }) })
注意事项
- 部分小众未登记的独立游戏可能无法获取到官方图标,会自动使用兜底占位图,不影响功能运行
- 建议仅向指定的统计频道发送消息,避免在全服所有文本频道刷屏触发用户反感
内容的提问来源于stack exchange,提问作者clzola
相关产品推荐
相关产品推荐

