Skip to content

Instantly share code, notes, and snippets.

@melianmiko
Created January 15, 2022 13:15
Show Gist options
  • Save melianmiko/4a487eb3506336cde98f8aec563db728 to your computer and use it in GitHub Desktop.
Save melianmiko/4a487eb3506336cde98f8aec563db728 to your computer and use it in GitHub Desktop.
// ==UserScript==
// @name Наебатор для webinar.ru
// @namespace http://melianmiko.ru/
// @version 0.1
// @description С этим скриптом можно ливнуть с лекции и никто это не спалит
// @author melianmiko
// @match https://events.webinar.ru/
// @icon https://melianmiko.ru/favicon.ico
// @grant none
// ==/UserScript==
(function() {
// -------------------- НАСТРОЙКИ --------------------
// Кло-во лайков, начиная с которого мы тоже начнём
// их ставить. Лучше не ставить значение меньше 10-ти
const AUTO_LIKE_COUNT = 20;
// ---------------------------------------------------
// Константы, не менять
const INVOKEMENT_BODY = "isFocused=true&isSoundEnabled=true&isVideoEnabled=true";
// Переменные для всякого говна
let reactionCountBlock = null,
reactionButton = null,
infoViewBlock = null,
uiScanIntervalId = null;
// Обновляет экран и гадит в консоль
function notice(message) {
if(infoViewBlock) {
infoViewBlock.innerHTML = message;
}
console.info(...arguments);
}
// Создаём ссылку на оригинальную функцию fetch
// так как мы будем её подменять
window.__fetch = window.fetch;
// ...и собственно подменяем
window.fetch = function() {
if(arguments.length < 2)
return window.__fetch(...arguments);
if(arguments[1].method && arguments[1].method.toLowerCase() !== "post")
return window.__fetch(...arguments);
// Ковыряем запрос на обновление статуса вовлечённости
if(arguments[0].indexOf("setUserInvolvementStatus") > 0) {
// Не важно что было в теле запроса, теперь там будет
// написано что всё заебись
notice("Статус активности поменён", "было:",
arguments[1].body, "стало: ", INVOKEMENT_BODY);
arguments[1].body = INVOKEMENT_BODY;
}
// Все остальные запросы оставляем без нашего внимания
return window.__fetch(...arguments);
};
// Функция для сканирования страницы.
// Она найдёт кнопку и счётчик лайков
const uiScan = function() {
const divs = document.querySelectorAll("div");
for(let i in divs) {
if(!divs[i]) continue;
if(!divs[i].className) continue;
if(divs[i].className.indexOf("Reaction__reactionCount") > -1) {
reactionCountBlock = divs[i];
console.info("нашли счётчик лайков (реакций)", divs[i]);
} else if(divs[i].className.indexOf("Reaction__rippleContainer") > -1) {
reactionButton = divs[i];
console.info("нашли кнопку для отправки лайка", divs[i]);
}
}
if(document.getElementById("logoContainer")) {
const logoRoot = document.getElementById("logoContainer");
infoViewBlock = logoRoot.querySelector("span");
console.info("нашли экран", infoViewBlock);
}
// Если всё нашли, удаляем таймер.
if(reactionButton && reactionCountBlock && infoViewBlock)
clearInterval(uiScanIntervalId);
};
// Функция для авто-отправки лайков
function likeHandler() {
if(!reactionButton || !reactionCountBlock) return;
count = parseInt(reactionCountBlock.innerHTML);
if(count >= AUTO_LIKE_COUNT) {
// Кто-то ебошит лайк, го и мы за компанию
// Делаем случайную задержку менее 1с, шоб не спалили
const offset = Math.round(Math.random() * 1000);
setTimeout(() => {
notice("Лайк отправлен (задержка " + offset + ")");
reactionButton.click();
}, offset);
}
}
// Очищает блок с инфой
function wipeDisplay() {
if(!infoViewBlock) return;
infoViewBlock.innerHTML = "Сайт наёбан | melianmiko.ru";
}
// Активировать все таймеры
uiScanIntervalId = setInterval(uiScan, 5000);
setInterval(likeHandler, 1000);
setInterval(wipeDisplay, 10000);
})();
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment