javascript - Skicka meddelande på Discord via Puppeteer (ingen bot, ingen applikation)


Jag skriver ett Puppeteer-skript som öppnar Discord Web, loggar in (mansteg för captcha & godkännande), går till en kanal och skriver ett meddelande i meddelandeformuläret, och jag har problem med att skicka det.

Detta är annorlunda jämfört med alla befintliga Q&A, eftersom det inte är via en Discord-webbhook eller applikation.

Komplikationen verkar vara att elementet där meddelandet skrivs in är en contenteditable-div.

En annan möjlighet är att simuleringen av Enter-tangenten fungerar, men att den inte skickar något eftersom att sätta innerText på div:en inte gör att den registrerar att det är meddelandet som ska skickas. Jag märkte att platshållartexten inte försvinner.

Kolla skärmbilden för att se det exakta elementet.

Koden som skickar meddelandet ser ut så här:

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));

Skulle du ge mig idéer på saker att försöka för att skicka det meddelandet? Koden fungerar fram till att sätta 'Hello, world' på meddelandeformuläret.

UPPDATERING: det verkar som att Discord använder detta bibliotek som kallas Slate för meddelandeformuläret: https://github.com/ianstormtaylor/slate, vilket bygger ett nästlat träd av spans medan du skriver. Jag lyckades redigera rätt span med lite text, men jag kan fortfarande inte trigga det att skicka.

Jag har ställt samma fråga till skaparen men har ännu inte fått något svar.

Svar #1

Jag minns att jag gjorde något liknande, och jag tror att texten finns i ett span djupt under den DIV du refererar till. Att ändra innerText kan också vara opålitligt, så försök istället att klicka och skriva.

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")

Relaterade artiklar