您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Adds a “➕” on Kick.com to view multiple streams at once on MultiKick.com
当前为
- // ==UserScript==
- // @name Kick ↔ MultiKick Enhancer
- // @namespace http://tampermonkey.net/
- // @version 1.1
- // @description Adds a “➕” on Kick.com to view multiple streams at once on MultiKick.com
- // @match https://kick.com/*
- // @match https://www.kick.com/*
- // @match https://multikick.com/*
- // @match https://www.multikick.com/*
- // @grant none
- // @run-at document-end
- // @license MIT
- // ==/UserScript==
- (function() {
- 'use strict';
- const host = location.hostname.replace(/^www\./, '');
- const WINDOW_NAME = 'multikick-window';
- // ─── Kick.com side ─────────────────────────────────────────────────────
- if (host === 'kick.com') {
- function addButtons() {
- document
- .querySelectorAll('a[data-state][href^="/"] > img.rounded-full')
- .forEach(img => {
- const a = img.parentElement;
- if (a.dataset.mkDone) return;
- a.dataset.mkDone = '1';
- const slug = a.getAttribute('href').slice(1);
- const btn = document.createElement('a');
- btn.textContent = '➕';
- btn.href = '#';
- btn.title = 'Add to MultiKick';
- Object.assign(btn.style, {
- marginLeft: '4px',
- cursor: 'pointer',
- fontSize: '1em',
- textDecoration: 'none',
- color: 'inherit',
- });
- btn.addEventListener('click', e => {
- e.preventDefault();
- // open (or reuse) the MultiKick tab at its root
- const mkWin = window.open('https://multikick.com', WINDOW_NAME);
- if (!mkWin) return;
- mkWin.focus();
- // tell it to append our slug
- const msg = { type: 'MK_APPEND', slug };
- mkWin.postMessage(msg, 'https://multikick.com');
- // in case it's still loading, send again
- setTimeout(() => mkWin.postMessage(msg, 'https://multikick.com'), 500);
- });
- a.parentElement.insertBefore(btn, a.nextSibling);
- });
- }
- addButtons();
- new MutationObserver(addButtons)
- .observe(document.body, { childList: true, subtree: true });
- }
- // ─── MultiKick.com side ────────────────────────────────────────────────
- else if (host === 'multikick.com') {
- // 0) Name the window immediately so future window.open() calls reuse it
- if (window.name !== WINDOW_NAME) {
- window.name = WINDOW_NAME;
- }
- // 1) Prevent their router from wiping out deep URLs
- const desired = location.pathname;
- function wrap(orig) {
- return function(state, _title, url) {
- if ((url === '/' || url === '') && desired !== '/') {
- url = desired;
- }
- return orig.call(this, state, '', url);
- };
- }
- history.pushState = wrap(history.pushState);
- history.replaceState = wrap(history.replaceState);
- window.addEventListener('popstate', () => {
- if (location.pathname === '/' && desired !== '/') {
- history.replaceState(null, '', desired);
- }
- });
- // 2) Listen for “MK_APPEND” messages and do the append+reload here
- window.addEventListener('message', e => {
- if (!/^https?:\/\/(?:www\.)?kick\.com$/.test(e.origin)) return;
- const msg = e.data || {};
- if (msg.type !== 'MK_APPEND' || typeof msg.slug !== 'string') return;
- const parts = location.pathname
- .replace(/^\/|\/$/g, '')
- .split('/')
- .filter(Boolean);
- if (!parts.includes(msg.slug)) {
- parts.push(msg.slug);
- const newPath = '/' + parts.join('/');
- history.replaceState(null, '', newPath);
- location.reload();
- }
- });
- }
- })();