通过 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")
我正在编写一个打开 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")