bringIntoView returned the last boundingBox() unconditionally after the scroll loop exhausted, so an element still outside the viewport would be clicked anyway. Validate the final box against the actual viewport bounds on both axes (innerWidth/innerHeight) and return null otherwise, so humanClick fails instead of clicking an off-screen coordinate.
stream-test
Operational scripts for manually verifying the selfbot Go-Live broadcast with a real browsing session captured from the X display.
Files
stream-hold.ts- joins the voice channel and keeps the Go-Live stream up until stopped. All params from.env(DISCORD_SELFBOT_TOKEN,DISCORD_GUILD_ID,DISCORD_VOICE_CHANNEL_ID,VNC_RESOLUTION,VNC_FRAMERATE,VNC_BITRATE_KBPS,STREAM_HW,VNC_DISPLAY).human.mjs- human-like interaction helpers. Input is injected into the X server withxdotool(synthetic X input, not a physical HID device, but the browser and the captured screen see genuine pointer/keyboard events with a visibly moving cursor); Playwright only locates elements. Every action is such input: address-bar navigation (Ctrl+L + typing), search typing, clicking the video / settings menu / autoplay toggle / play button, fullscreen via thefkey, and scrolling. Elements are brought into view with a real wheel scroll (no DOM scrollIntoView); if an element has no on-screen box the click fails rather than falling back to a synthetic click. The CDP/DOM API is used only to read state for verification, never to act.scenario.mjs- the browse scenario (YouTube -> IU live -> 1080p -> fullscreen -> Naver -> 나무위키), driven with the human helpers. Connects to a Chrome already running with--remote-debugging-port(CDP_PORT, default 9222) on the streamed display.
Run
# keep the broadcast up (separate process / service)
bun bot/scripts/stream-test/stream-hold.ts
# Chrome on the streamed display with remote debugging, then:
node bot/scripts/stream-test/scenario.mjs
A/B framerate/resolution
Lower settings to compare what Discord actually delivers to viewers, e.g.:
VNC_RESOLUTION=1280x720 VNC_FRAMERATE=30 bun bot/scripts/stream-test/stream-hold.ts
Notes
- Selfbot streaming violates Discord ToS; use a burner account.
- Requires
xdotool, an X display, and a systemffmpegwithx11grab/nvenc. - Prereqs (
playwright, system Chrome) are not bot dependencies; install separately where you run the scenario.