通过 Puppeteer 在 Discord 上发送消息(无机器人,无应用程序)
Posted
技术标签:
【中文标题】通过 Puppeteer 在 Discord 上发送消息(无机器人,无应用程序)【英文标题】:Sending message on Discord via Puppeteer (no bot, no application) 【发布时间】:2021-09-10 05:45:10 【问题描述】:我正在编写一个 Puppeteer 脚本,该脚本打开 Discord Web,登录(验证码和授权的手动步骤),进入频道并将消息输入消息表单,但我正在努力发送它。
这与所有现有的问答不同,因为它不是通过 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,它会在您键入时构建一个嵌套的跨度树。我设法用一些文本编辑了正确的跨度,但我仍然无法触发它发送。
我已经问过创建者同样的问题,但还没有结果。
【问题讨论】:
您是否尝试使用键盘输入消息? @MaartenDev 好点。点击消息框聚焦,回车不发送消息,说明innerText策略不正确。 Div 没有像输入和文本区域这样的更改事件。你确定这是正确的元素吗? 【参考方案1】:我记得做过类似的事情,我认为文本包含在 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")
【讨论】:
太棒了,伙计!非常感谢,这是我项目中的最后一个障碍。以上是关于通过 Puppeteer 在 Discord 上发送消息(无机器人,无应用程序)的主要内容,如果未能解决你的问题,请参考以下文章
使用新生成的图像自动更新/编辑嵌入消息 - Discord.js