// ==UserScript== // @name 動畫瘋-自動觀看廣告 // @namespace https://shinoharahare.github.io/ // @version 0.2 // @description 自動觀看動畫瘋廣告 // @author Hare // @match https://ani.gamer.com.tw/animeVideo.php?sn=* // @match https://imasdk.googleapis.com/js/core/bridge* // @grant none // @downloadURL none // ==/UserScript== (async () => { 'use strict'; if (location.href.includes('ani.gamer.com.tw')) { if (await checkAD()) { registerMessageHandlerTop() await trigger('#adult', 'click') document.querySelector('video[title=Advertisement]').addEventListener('play', ({ target }) => target.muted = true) await sleep(30000) await postMessage2Ima({ type: 'skip' }) const video = document.querySelector('#ani_video_html5_api') video.addEventListener('loadeddata', () => { const t = () => video.pause() || video.removeEventListener('play', t) video.addEventListener('play', t) }) } } else if (location.href.includes('imasdk.googleapis.com')) { if (window.self != window.top) { registerMessageHandlerIma() } } })(); function registerMessageHandlerTop() { window.resolves = {} window.addEventListener('message', ({ data }) => { const id = data._id if (id in window.resolves) { window.resolves[id]() delete window.resolves[id] } }) } function registerMessageHandlerIma() { window.addEventListener('message', ({ data, source }) => { if (data._id) { switch (data.type) { case 'skip': { document.querySelector('.videoAdUiSkipButton').click() break } } source.postMessage(data, 'https://ani.gamer.com.tw') } }) } function postMessage2Ima(msg) { const win = document.querySelector('iframe[src^="https://imasdk.googleapis.com/js/core/"]').contentWindow return new Promise(resolve => { const id = performance.now() window.resolves[id] = resolve win.postMessage({ _id: id, ...msg }, 'https://imasdk.googleapis.com') }) } async function checkAD() { const res = await fetch(`/ajax/token.php?sn=${animefun.videoSn}`) const json = await res.json() return json.time == 0 } function trigger(selector, action) { return new Promise(resolve => { let i = setInterval(() => { let el = document.querySelector(selector) if (el) { el[action]() clearInterval(i) resolve() } }, 500) }) } function sleep(ms) { return new Promise(resolve => setTimeout(resolve, ms)) }