通过 Puppeteer 在 Discord 上发送消息(没有机器人,没有应用程序)

Sending message on Discord via Puppeteer (no bot, no application)

我正在编写一个打开 Discord Web 的 Puppeteer 脚本,登录(验证码和授权的手动步骤),进入一个频道并在消息表单中输入一条消息,我正在努力发送它。

这与所有现有的问答不同,因为它不是通过 Discord Webhook 或应用程序。

问题似乎在于输入消息的元素是可编辑的 div。

另一种可能性是模拟 Enter 键有效,但它没有发送任何内容,因为在 div 上设置 innerText 不会使其注册为要发送的消息。我注意到占位符文本没有消失。

查看屏幕截图以查看确切的元素。

发送消息的代码如下所示:

const selector = 'div[contenteditable=true]:nth-child(2)';
page.goto('https://discord.com/channels/2358929835296835/39057203957203');
await page.waitForSelector(selector);
await page.focus(selector);
await page.$eval(selector, el => el.innerText = 'Hello, world!');
await page.keyboard.press((String.fromCharCode(13) as any));

您能给我一些想法来尝试发送该消息吗?该代码可以将 'Hello, world' 放到消息表单中。

更新:看起来 Discord 正在使用这个名为 Slate 的库来处理消息形式:https://github.com/ianstormtaylor/slate,它会在您键入时构建一个嵌套的 span 树。我设法用一些文本编辑了正确的跨度,但我仍然无法触发它发送。

我问过创作者同样的问题,但还没有结果。

我记得做过类似的东西,我认为文本包含在 DIV ure 引用下的一个深度范围内。 更改 innerText 也可能不可靠,因此请尝试点击并键入

const selector = '#app-mount > div.app-1q1i1E > div > div.layers-3iHuyZ.layers-3q14ss > div > div > div > div.content-98HsJk > div.chat-3bRxxu > div.content-yTz4x3 > main > form > div:nth-child(1) > div > div > div.scrollableContainer-2NUZem.webkit-HjD9Er > div > div.textArea-12jD-V.textAreaSlate-1ZzRVj.slateContainer-3Qkn2x > div.markup-2BOw-j.slateTextArea-1Mkdgw.fontSize16Padding-3Wk7zP'
page.goto('https://discord.com/channels/2358929835296835/39057203957203') 
await page.waitForSelector(selector, {timeout: 0})
var text = await page.$(selector)
await text.click()
await text.type("hello world")
await page.keyboard.press("Enter")