Skip to content

Commit

Permalink
v2.0.0
Browse files Browse the repository at this point in the history
- Fixed "Not Working" Issue
- Faster Spamming
- Less Resource Intensive
- Fixed Random Names Generation
- Refactoring
- Updated README
  • Loading branch information
Roo7K1d committed Mar 2, 2024
1 parent e962e48 commit 9014b19
Show file tree
Hide file tree
Showing 6 changed files with 428 additions and 549 deletions.
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
/node_modules
/media/hacked.y4m
/media/black.y4m
31 changes: 13 additions & 18 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
<img src="https://cdn.discordapp.com/attachments/820416224005586945/886620544122908762/jitsi-meet-raider.png">
<img src="http://rootk1d.xyz/github/jitsi/screenshot.png">
<p align="center"><i>For raiding Jitsi Meet conferences with bots with features like earrape, chat spam and synced spoofed camera feed.</i></p>
<div align="center">
<a href="https://github.com/roo7k1d/jitsi-meet-raider/stargazers"><img src="https://img.shields.io/github/stars/roo7k1d/jitsi-meet-raider?color=yellow" alt="Stars Badge"/></a>
Expand Down Expand Up @@ -32,23 +32,20 @@ NOTE: THIS SCRIPT ONLY WORKS FOR <a href="https://meet.jit.si/">JITSI MEET</a> A
- In `config.json` you can adjust everything to your liking:
```
{
"url": "YourRoomURL", //Your Jitsi Meet URL
"numberofbots": "YourBotAmount", //The desired number of bots you want (WARNING: Currently the script is very computationally intensive, more bots will probably cause your pc to lag!)
"haspassword": false, //Whether the meeting uses a password or not
"password": "YourRoomPassword", //The password the meeting uses (if "haspassword" is true)
"message": "YourMessage", //The message you want the bots to send
"writemessage": true, //Whether or not you want every bot to repeatedly send your custom message
"raisehands": true, //Whether or not you want every bot to repeatedly raise their hands
"userandomnames": true, //Whether or not you want the bots to have randomly generated usernames
"customname": "YourCustomBotsName", //The name the bots will have if "userandomnames" is true
"mintimebetweenmsg": 500, //The minimum time between sent messages in ms
"maxtimebetweenmsg": 2000, //The maximum time between sent messages in ms
"muteeveryone": true, //Mute everyone in the call?
"disableallcameras": false, //Disable all active camera feeds in call?
"playaudio": true //Whether or not you want the bots siren sound to be repeatedly played
"url": "YourJitsiMeetURL", //Your Jitsi Meet URL (e.g. "https://meet.jit.si/Test123Max12")
"numberofbots": 5, //The number of bots you want to join
"haspassword": false, //If Jitsi meeting uses password
"password": "YourJitsiMeetPassword", //The meeting password if "haspassword" = true
"message": "YourCustomMessage", //The custom message you want the bots to send
"writemessage": true, //Should the bots send messages?
"raisehands": true, //Should the bots raise their hands on join?
"userandomnames": true, //Uses randomly generated bot usernames (if false - see "customname")
"customname": "YourCustomBotsName", //The name you want the bots to have
"playvideo": true, //Should the bots play the Welcome To The Game skull as spoofed cam?
"playaudio": true //Should the bots play the Purge siren as spoofed mic?
}
```
- (If you download the source code: Download `hacked.y4m` from [here](http://rootk1d.xyz/archive/GitHub-Jitsi-Meet-Raider/hacked.y4m) and move it into the `media` folder)
- (If you download the source code: Download `hacked.y4m` from [here](http://rootk1d.xyz/github/jitsi/hacked.y4m) & `black.y4m` from [here](http://rootk1d.xyz/github/jitsi/black.y4m) and move them into the `media` folder)
- Execute `node index.js` to run the script
- Done!

Expand Down Expand Up @@ -91,8 +88,6 @@ You are not allowed to remove any part of the footer. That includes all of the i
## Todo (See Issues with tag "help wanted")
- Ability to use proxies
- Direct message spam
- Ability to turn off fake cam
- Make script less resource intensive
- Better console logging

<hr>
Expand Down
9 changes: 3 additions & 6 deletions config.json
Original file line number Diff line number Diff line change
@@ -1,16 +1,13 @@
{
"url": "YourRoomURL",
"numberofbots": "YourBotAmount",
"url": "YourJitsiMeetURL",
"numberofbots": 5,
"haspassword": false,
"password": "YourRoomPassword",
"message": "YourCustomMessage",
"writemessage": true,
"raisehands": true,
"userandomnames": true,
"customname": "YourCustomBotsName",
"mintimebetweenmsg": 500,
"maxtimebetweenmsg": 5000,
"muteeveryone": true,
"disableallcameras": false,
"playvideo": true,
"playaudio": true
}
156 changes: 62 additions & 94 deletions index.js
Original file line number Diff line number Diff line change
Expand Up @@ -7,137 +7,105 @@ const config = require("./config.json");

(async () => {

const args = [
'--use-fake-ui-for-media-stream',
'--use-fake-device-for-media-stream',
'--no-sandbox',
'--allow-file-access-from-files',
'--allow-running-insecure-content',
'--disable-web-security',
'--ignore-certificate-errors',
'--ignore-certificate-errors-spki-list ',
'--auto-accept-camera-and-microphone-capture',
'--disable-notifications',
]

if (config.playvideo) {
args.push('--use-file-for-fake-video-capture=' + __dirname + '/media/hacked.y4m');
} else {
args.push('--use-file-for-fake-video-capture=' + __dirname + '/media/black.y4m');
}

if (config.playaudio) {
args.push('--use-file-for-fake-audio-capture=' + __dirname + '/media/siren.wav');
} else {
args.push('--use-file-for-fake-audio-capture=' + __dirname + '/media/blank.wav');
}

const browser = await puppeteer.launch({
args: [
'--use-fake-ui-for-media-stream',
'--use-file-for-fake-video-capture=' + __dirname + '/media/hacked.y4m',
'--use-fake-device-for-media-stream',
'--no-sandbox',
'--allow-file-access-from-files',
'--allow-running-insecure-content',
'--disable-web-security',
'--use-file-for-fake-audio-capture=' + __dirname + '/media/siren.wav',
'--ignore-certificate-errors',
'--ignore-certificate-errors-spki-list '
],
//headless: false,
//ignoreDefaultArgs: ['--mute-audio'],
args: args,
headless: true,
});

for (i = 0; i < config.numberofbots; i++) {

startUser(uniqueNamesGenerator, NumberDictionary, browser)
await startUser(browser);

}

async function startUser(uniqueNamesGenerator, NumberDictionary, browser) {

async function startUser(browser) {
//Generate Random user Names

let randomNumber = await NumberDictionary.generate({ min: 10, max: 9999 });
let randomName = await uniqueNamesGenerator({
dictionaries: [colors, adjectives, animals],
separator: "",
length: 2,
style: 'capital'
})
let generatedName = randomName + randomNumber;
randomName = uniqueNamesGenerator({
dictionaries: [colors, adjectives, animals],
separator: "",
length: 2,
style: 'capital'
}) + NumberDictionary.generate({ min: 10, max: 9999 });

// Open a new page for each bot

const page = await browser.newPage();

await browser.defaultBrowserContext().overridePermissions(config.url, ['camera', 'microphone', 'gyroscope', 'notifications', 'background-sync'])
await page.goto(config.url);

if (config.playaudio == false) {

const button = await page.$$('div.audio-preview > div.settings-button-container > div.toolbox-button', { waitUntil: "networkidle2" });

await button[0].click();

}

//Find User Name Textfield
let textfield = await page.waitForSelector('div.premeeting-screen > div > div> div > div > div > div > input');

if (config.userandomnames == true) {
await page.type(".field", generatedName);
} else {
await page.type(".field", config.customname);
}
await page.keyboard.press('Enter');
//Clear Textfield From Previous Name
await page.evaluate(() => {
const field = document.querySelector('div.premeeting-screen > div > div> div > div > div > div > input');
field.value = '';
});

//Type Bot Name
config.userandomnames == true ? await textfield.type(randomName) : await textfield.type(config.customname);

//Join Meeting
await page.click('div[data-testid="prejoin.joinMeeting"]', { waitUntil: "networkidle2" });

if (config.haspassword == true) {
//Is Room Password Protected?

await new Promise(resolve => setTimeout(resolve, 1000));
await page.waitForSelector('input');
await page.focus("input");
await page.type("input", config.password, { waitUntil: "domcontentloaded"});
await page.type("input", config.password, { waitUntil: "domcontentloaded" });
page.keyboard.press('Enter');
}

if (config.disableallcameras == true) {
await new Promise(resolve => setTimeout(resolve, 200));
await page.click('div.toolbox-content-wrapper > div.toolbox-content-items > div.toolbox-button-wth-dialog', { waitUntil: "networkidle" });
const button = await page.$$('ul.overflow-menu > li.overflow-menu-item', { waitUntil: "networkidle2" });

await button[6].click();

await new Promise(resolve => setTimeout(resolve, 500));

await page.click('#modal-dialog-ok-button', { waitUntil: "networkidle" });
if (config.raisehands == true) {
await new Promise(resolve => setTimeout(resolve, 3000));
//Raise Hands
await page.click('div.toolbox-content-items > div.reactions-menu-popup-container > div.settings-button-container > div.toolbox-button', { waitUntil: "networkidle2" });
}

if (config.muteeveryone == true) {
await new Promise(resolve => setTimeout(resolve, 200));
await page.click('div.toolbox-content-wrapper > div.toolbox-content-items > div.toolbox-button-wth-dialog', { waitUntil: "networkidle" });
const button = await page.$$('ul.overflow-menu > li.overflow-menu-item', { waitUntil: "networkidle2" });

await button[5].click();

await new Promise(resolve => setTimeout(resolve, 500));

await page.click('#modal-dialog-ok-button', { waitUntil: "networkidle" });

}

if (config.raisehands == true && config.writemessage == false) {

var time = Math.floor(Math.random() * config.maxtimebetweenmsg) + config.mintimebetweenmsg;
console.log(time)
await new Promise(resolve => setTimeout(resolve, time));

for (i = 1; i > 0; i + 1) {
const button = await page.$$('div.toolbox-content-items > div.toolbox-button', { waitUntil: "networkidle2" });

await button[1].click();
var time = Math.floor(Math.random() * (config.maxtimebetweenmsg - config.mintimebetweenmsg)) + config.mintimebetweenmsg;
await new Promise(resolve => setTimeout(resolve, time));
}
}
if (config.writemessage == true) {

//Let Every Bot Write A Random Message

if (config.writemessage == true) {
await new Promise(resolve => setTimeout(resolve, 1000));
await page.click('div.toolbox-content-items > div.toolbar-button-with-badge > div.toolbox-button', { waitUntil: "networkidle" });
await page.waitForSelector('textarea', {waitUntil: "networkidle"}); // <-- wait until it exists
await page.focus("textarea", {waitUntil: "networkidle"});

var time = Math.floor(Math.random() * config.maxtimebetweenmsg) + config.mintimebetweenmsg;
await new Promise(resolve => setTimeout(resolve, time));
await page.waitForSelector('textarea', { waitUntil: "networkidle" }); // <-- wait until it exists

for (i = 1; i > 0; i + 1) {
if (config.raisehands == true) {
const button = await page.$$('div.toolbox-content-items > div.toolbox-button', { waitUntil: "networkidle2" });
//Focus Textarea
await page.focus("textarea", { waitUntil: "networkidle" });

await button[1].click();
var time = Math.floor(Math.random() * (config.maxtimebetweenmsg + 1000 - config.mintimebetweenmsg)) + config.mintimebetweenmsg;
await new Promise(resolve => setTimeout(resolve, time));
}
await new Promise(resolve => setTimeout(resolve, 200));
setInterval(async () => {
await page.type("textarea", config.message);
page.keyboard.press('Enter');
var time = Math.floor(Math.random() * (config.maxtimebetweenmsg - config.mintimebetweenmsg)) + config.mintimebetweenmsg;
await new Promise(resolve => setTimeout(resolve, time));
}
}, 2000)
}
}
})();
Binary file added media/blank.wav
Binary file not shown.
Loading

0 comments on commit 9014b19

Please sign in to comment.