You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

通过Puppeteer在Discord发送消息(无需Bot、应用)的问题求助

你提到的Slate编辑器的状态和DOM是双向绑定的,只有通过原生输入行为触发它监听的输入事件,才会同步内部的内容状态,单纯修改DOM节点的文本内容不会被编辑器识别,这就是你之前修改innerText甚至span内容都无法触发发送的核心原因。

方案1:模拟真实键盘输入(最稳定)

该方案完全模拟普通用户的输入行为,会触发编辑器监听的所有输入事件,兼容性最好:

const selector = 'div[contenteditable=true]:nth-child(2)';
await page.goto('https://discord.com/channels/2358929835296835/39057203957203');
await page.waitForSelector(selector);
// 点击触发聚焦,比单纯调用focus方法更贴近真实操作,避免聚焦失效
await page.click(selector);
// 模拟键盘输入内容,可通过delay参数调整输入速度
await page.keyboard.type('Hello, world!', { delay: 30 });
// 触发回车发送
await page.keyboard.press('Enter');

方案2:模拟粘贴输入(适合长文本场景)

如果需要输入大量文本,不想等待键盘输入的耗时,可以通过剪贴板粘贴的方式实现,同样会触发编辑器的输入事件:

const selector = 'div[contenteditable=true]:nth-child(2)';
await page.goto('https://discord.com/channels/2358929835296835/39057203957203');
await page.waitForSelector(selector);
await page.click(selector);
// 将待输入内容写入剪贴板
await page.evaluate(text => navigator.clipboard.writeText(text), 'Hello, world!');
// 模拟Ctrl+V粘贴(如果目标运行环境是MacOS,将Control替换为Meta即可)
await page.keyboard.down('Control');
await page.keyboard.press('KeyV');
await page.keyboard.up('Control');
await page.keyboard.press('Enter');

补充兼容处理

如果执行上述方案后仍无法触发发送,可以在输入完成后主动派发一次input事件,强制同步编辑器状态:

await page.$eval(selector, el => {
  el.dispatchEvent(new Event('input', { bubbles: true }));
});

内容的提问来源于stack exchange,提问作者mlg

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.14 07:54:01