您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Игра поймай Толяна Хамстеркомбата
- // ==UserScript==
- // @name TolyanHammerKombat
- // @namespace http://tampermonkey.net/
- // @version 4.6
- // @description Игра поймай Толяна Хамстеркомбата
- // @author Marina Khamsterkombat
- // @match https://vk.com/*
- // @icon https://i.imgur.com/9hJJv6a.png
- // @grant none
- // @license MIT
- // @run-at document-idle
- // ==/UserScript==
- (function() {
- 'use strict';
- // Настройки скрипта
- const config = {
- targets: ["356761121", "252323336", "1035510061", "1032968837", "1042305865", "1023730354", "867502146", "744130756", "649621677", "1047382637", "894118832"],
- commentText: '🐹🐹🐹',
- notice: {
- text: '🚫🐹🔨 Попался, Хомяк! 🔨🐹🚫',
- textColor: '#71AAEB',
- threshold: 1.0
- },
- hammer: {
- image: {
- url: 'https://i.imgur.com/9hJJv6a.png',
- size: { widthPx: 50, heightPx: 50 },
- offset: { leftPx: 8, topPx: 40 }
- },
- sound: {
- url: 'https://myinstants.com/media/sounds/fnaf-12-3-freddys-nose-sound.mp3',
- volume: 0.1,
- timeoutMs: 500,
- },
- animation: { durationMs: 200 }
- },
- attribute: {
- name: 'data-hammerkombat',
- hidden: 'hidden'
- }
- };
- // Создает элемент уведомления
- const createNotice = () => {
- const notice = document.createElement('div');
- notice.className = 'hammerkombat-notice';
- const text = document.createElement('h2');
- text.className = 'hammerkombat-notice-text';
- text.textContent = config.notice.text;
- notice.append(text);
- return notice;
- }
- // Создает молоток в позиции клика
- const createHammer = (x, y) => {
- const { image } = config.hammer
- const hammer = document.createElement('img');
- hammer.className = 'hammerkombat-cursor';
- hammer.src = image.url;
- Object.assign(hammer.style, {
- left: `${x - image.offset.leftPx}px`,
- top: `${y - image.offset.topPx}px`,
- width: `${image.size.widthPx}px`,
- height: `${image.size.heightPx}px`
- });
- document.body.append(hammer);
- return hammer;
- }
- // Воспроизводит звук удара
- const playSound = () => {
- const { sound } = config.hammer
- const audio = new Audio(sound.url);
- audio.volume = sound.volume;
- audio.play().catch(() => {});
- setTimeout(() => audio.remove(), sound.timeoutMs);
- }
- // Настраивает обработчик клика на аватар
- const setupAvatarClick = (element) => {
- const avatar = element.querySelector('a.AvatarRich');
- if (!avatar) return;
- avatar.style.cursor = 'crosshair';
- avatar.style.userSelect = 'none';
- avatar.removeAttribute('href');
- avatar.addEventListener('click', (event) => {
- const hammer = createHammer(event.clientX, event.clientY);
- setTimeout(() => hammer.remove(), config.hammer.animation.durationMs);
- playSound();
- });
- }
- // Проверяет автора поста/коммента
- const handleAuthor = (element, field) => {
- const authorId = element?.dataset?.[field];
- if (!authorId) return false;
- if (!config.targets.includes(authorId)) return false;
- element.setAttribute(config.attribute.name, config.attribute.hidden);
- return true;
- };
- // Заменяет содержание поста
- const replacePostContent = (post) => {
- const content = post.querySelector('div.wall_text');
- if (!content) return;
- content.style.setProperty('display', 'none');
- content.before(createNotice());
- };
- // Проверяет и обрабатывает пост
- const processPost = (post) => {
- if (!handleAuthor(post, 'postAuthorId')) return;
- // Заменяем содержание поста
- replacePostContent(post);
- // Настраиваем молоточек на аватарке
- setupAvatarClick(post);
- };
- // Проверяет и обрабатывает комментарий
- const processComment = (comment) => {
- if (!handleAuthor(comment, 'answeringId')) return;
- // Заменяем содержание комментария
- const replyText = comment.querySelector('div.wall_reply_text');
- if (replyText) replyText.textContent = config.commentText;
- // Настраиваем молоточек на аватарке
- setupAvatarClick(comment);
- };
- // Проверяет все посты и комментарии на странице
- const checkContent = () => {
- document.querySelectorAll(`.post:not([${config.attribute.name}])`).forEach(processPost);
- document.querySelectorAll(`.replies_list div:not([${config.attribute.name}])`).forEach(processComment);
- };
- // Добавляет стили на страницу
- const addStyles = () => {
- const style = document.createElement('style');
- style.type = 'text/css';
- style.textContent = `
- .hammerkombat-notice {
- position: relative;
- text-align: center;
- padding: 16px;
- margin-top: 8px;
- }
- .hammerkombat-notice-text {
- color: ${config.notice.textColor};
- font-weight: bold;
- text-transform: uppercase;
- user-select: none;
- }
- .hammerkombat-cursor {
- position: fixed;
- pointer-events: none;
- transform-origin: bottom right;
- animation: hammer-hit ${config.hammer.animation.durationMs}ms ease-out;
- }
- @keyframes hammer-hit {
- 0% { transform: rotate(0deg); }
- 50% { transform: rotate(-30deg); }
- 100% { transform: rotate(0deg); }
- }
- `;
- document.head.append(style);
- }
- // Инициализация скрипта
- function init() {
- addStyles();
- window.addEventListener('load', checkContent);
- new MutationObserver(checkContent).observe(document.body, { childList: true, subtree: true });
- }
- // Запуск скрипта
- init();
- })();