如何在DiscordJS机器人中实现随机事实指令?
解决Discord机器人
;fact指令随机事实Embed回复及API替代方案 替代无密钥API推荐
以下是无需API密钥、可直接调用的随机事实API:
- 通用随机事实API:返回各类冷知识,响应格式为
{"fact": "具体事实内容"},无调用限制 - 无用冷知识API:专注于趣味无用事实,支持纯文本或JSON格式返回
- 猫主题事实API:如果允许特定领域内容,返回关于猫的随机趣味事实,适合轻松场景
api ninjas调用失败排查
你尝试api ninjas未成功,大概率是以下原因:
- 未在请求头中添加
X-Api-Key字段,免费版需先在平台获取密钥后配置 - 请求端点错误,正确路径为
https://api.api-ninjas.com/v1/facts,需附带limit=1参数获取单条事实 - 免费版配额耗尽,api ninjas免费版每月限制请求次数,可登录后台查看剩余额度
Discord机器人代码实现(Discord.js v14)
依赖安装
npm install discord.js node-fetch
核心代码
const { Client, EmbedBuilder, GatewayIntentBits } = require('discord.js'); const fetch = require('node-fetch'); const client = new Client({ intents: [ GatewayIntentBits.Guilds, GatewayIntentBits.GuildMessages, GatewayIntentBits.MessageContent ] }); // 替换为你选择的API地址 const FACT_API = 'https://api.example-facts.com/random'; client.on('messageCreate', async (message) => { if (message.content !== ';fact') return; try { const res = await fetch(FACT_API); const data = await res.json(); const fact = data.fact || '无法获取事实内容,请稍后重试'; const factEmbed = new EmbedBuilder() .setColor('#2ecc71') .setTitle('随机冷知识') .setDescription(fact) .setFooter({ text: '来源:随机事实API' }); await message.channel.send({ embeds: [factEmbed] }); } catch (err) { console.error('API请求失败:', err); await message.channel.send('获取随机事实时出错,请检查API配置'); } }); client.login('你的机器人令牌');
注意事项
- 必须在Discord开发者后台开启
Message Content Intent权限,否则机器人无法读取消息内容 - 不同API的返回结构可能不同,需根据实际响应调整
data.fact的取值逻辑 - 部分免费API有请求频率限制,避免短时间内重复调用导致被限流
内容的提问来源于stack exchange,提问作者7x-Ash5
相关产品推荐
相关产品推荐

