如何实现Discord机器人自动发送前端用户提交的消息?
解决前端提交内容自动发送到Discord频道的问题
当前你的代码逻辑是把前端提交的内容存在变量里,只有Discord用户发「ping」时才触发回复,要改成前端提交就自动发消息,核心是在后端收到前端请求时直接调用Discord机器人的消息发送方法,不需要依赖Discord的消息监听事件。
步骤1:提前获取目标Discord频道实例
首先要让机器人在启动时找到你要发送消息的目标频道,需要用到频道ID(开启Discord开发者模式后右键频道可复制):
// 在Discord机器人初始化代码中添加 let targetChannel; // 机器人就绪时获取频道 client.on('ready', () => { // 替换成你的目标频道ID const channelId = '123456789012345678'; targetChannel = client.channels.cache.get(channelId); if (!targetChannel) { console.error('错误:找不到目标频道,请检查频道ID是否正确'); } console.log('机器人已就绪,目标频道已获取'); });
步骤2:修改后端POST接口,直接触发消息发送
你的前端请求是发送到/post,但后端接口是/pass,先统一路径,然后在接口里调用机器人的send方法发送消息:
// 替换原来的app.post('/pass'...) app.post('/post', async (req, res) => { const postContent = req.body.post; // 校验内容和频道状态 if (!postContent.trim()) { return res.status(400).send('请输入有效内容'); } if (!targetChannel) { return res.status(500).send('机器人未连接到目标频道'); } try { // 直接发送到目标频道 await targetChannel.send(postContent); res.status(200).send('消息已成功发送到Discord'); } catch (error) { console.error('发送消息失败:', error); res.status(500).send('发送消息失败,请检查机器人权限'); } });
步骤3:移除无用的Discord消息监听逻辑
现在不需要通过「ping」触发消息了,可以删掉原来的messageCreate监听代码:
// 删掉这段代码,因为已经不需要了 // client.on('messageCreate', msg => { // if (msg.content === 'ping') { // msg.reply(`${post}`); // } // })
步骤4:优化前端体验(可选)
给前端加个提交状态反馈,让用户知道发送结果:
function App() { const [input, setInput] = useState('') const [sendStatus, setSendStatus] = useState('') const handleSubmit = async () => { if (!input.trim()) { setSendStatus('请输入内容'); return; } try { await axios.post('http://localhost:8080/post', { post: input }); setSendStatus('消息已发送!'); setInput(''); // 清空输入框 } catch (err) { setSendStatus('发送失败,请稍后重试'); console.error(err); } } return ( <> <input value={input} onChange={(e) => setInput(e.target.value)} placeholder="输入要发送到Discord的内容" /> <button onClick={handleSubmit}>push me</button> {sendStatus && <p>{sendStatus}</p>} </> ) }
注意事项
- 权限问题:确保你的Discord机器人在目标频道有「发送消息」的权限
- 跨域问题:如果前端和后端端口不同,需要在Node后端配置CORS,比如使用
cors包:const cors = require('cors'); app.use(cors()); // 允许所有源,生产环境建议配置特定域名 - 频道ID正确性:必须使用正确的频道ID,否则机器人找不到目标频道
内容的提问来源于stack exchange,提问作者Dimitriy Glefa
相关产品推荐
相关产品推荐

