M站_哔咪动漫脚本

哔咪动漫|E站弹幕网|饭团动漫|噼哩噼哩|克拉TV,播放页自动网页全屏,快捷键(F)切换。

安裝腳本?
作者推薦腳本

您可能也會喜歡 关闭影视动漫网站的公告弹窗

安裝腳本
  1. // ==UserScript==
  2. // @license MIT
  3. // @author Feny
  4. // @version 1.1.4
  5. // @name M站_哔咪动漫脚本
  6. // @description 哔咪动漫|E站弹幕网|饭团动漫|噼哩噼哩|克拉TV,播放页自动网页全屏,快捷键(F)切换。
  7. // @namespace http://tampermonkey.net/
  8. // @run-at document-body
  9. // @match *://*bimiacg*.net/
  10. // @match *://ppoft.com/play*
  11. // @match *://acgfta.com/play*
  12. // @match *://svip.ffzyplay.com/*
  13. // @match *://jiexi.modujx*.com/*
  14. // @match *://*bimiacg*.net/*/play*
  15. // @match *://player.ezdmw.com/danmuku/*
  16. // @match *://www.ezdmw.site/Index/video/*
  17. // @match *://*.pilipili*.*/index.php/vod/play/id/*
  18. // @match *://www.kelatv.com/api/haliapi.php*
  19. // @match *://www.kelatv.com/play/*
  20. // @grant GM_addStyle
  21. // @grant GM_openInTab
  22. // @grant GM_registerMenuCommand
  23. // @icon data:image/x-icon;base64,AAABAAEAICAAAAEAIACoEAAAFgAAACgAAAAgAAAAQAAAAAEAIAAAAAAAABAAABMLAAATCwAAAAAAAAAAAAAAAAAAAAAAAAICAgACAgIAAwMDAAoKCgAAAABZAAAAwgAAAIsAAAAWAAAAAAAAAAAAAAAAAAAAAAICAgABAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAABnAAAAxQAAAH8AAAAOAQEBAAEBAQAGBgYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQUFBQICAicDAwM6AQEBSQAAANIAAAD+AAAA7gAAAHgAAAA8AAAAPAAAADwAAAA8AgICPAEBATwAAAA8AAAAPAAAADwAAAA8AAAATwAAAN4AAAD+AAAA6gEBAWgBAQE7AQEBLAoKCgsAAAAAAAAAAAAAAAAAAAAAAQEBAAAAABEAAAByAAAAwQAAAN8AAADmAAAA+wAAAP8AAAD+AAAA7QAAAOIAAADiAAAA4gAAAOIBAQHiAAAA4gAAAOIAAADiAAAA4gAAAOIAAADmAAAA/QAAAP8AAAD+AAAA6gAAAOEAAADKAQEBhAAAAB8AAAAAAAAAAAAAAAABAQEIAAAAgwAAAPIICAj/ISEh/zo6Ov9AQED/PDw8/zw8PP88PDz/Ozs7/zs7O/87Ozv/PDw8/0BAQP88PDz/Ozs7/zs7O/88PDz/PDw8/zw8PP88PDz/PDw8/zw8PP8+Pj7/KSkp/wgICP8BAQH4AAAAmwAAABgHBwcAAAAAAAICAkYAAADjEBAQ/3BwcP/Ozs7/3Nzc/9/f3//d3d3/3d3d/93d3f/d3d3/3d3d/93d3f/d3d3/3t7e/97e3v/d3d3/3d3d/93d3f/d3d3/3d3d/93d3f/d3d3/3Nzc/97e3v/T09P/k5OT/yIiIv8AAAD0AQEBXQQEBAMAAAAAAgICkgkJCfxiYmL/7u7u////////////////////////////////////////////////////////////+fn5///////////////////////////////////////////////////////5+fn/i4uL/woKCv8AAACsAAAADwAAAAAICAi2FBQU/6ysrP/////////////////////////////////+/v7//v7+//7+/v/+/v7///////v7+/+wsLD/1dXV/////////////////////////////v7+//7+/v/+/v7//v7+///////AwMD/Kioq/wAAANYAAAAcAAAAAAAAAL8WFhb/vb29//z8/P///////////////////////v7+//39/f/+/v7//v7+//7+/v//////9PT0/0tLS/+enp7//v7+/////////////v7+//7+/v/+/v7//v7+//7+/v/+/v7//////8/Pz/81NTX/AAAA4AAAACIAAAAAAgICvxUVFf/AwMD//f39///////////////////////8/Pz/+/v7//39/f///////f39//39/f/q6ur/Pj4+/7Kysv/+/v7////////////9/f3//f39//39/f/8/Pz//v7+//7+/v//////y8vL/zAwMP8AAADgAAAAIgAAAAAEBAS/FBQU/8LCwv////////////////////////////7+/v/+/v7/+/v7//r6+v/9/f3//f39/+Dg4P86Ojr/w8PD//////////////////n5+f/7+/v//f39//z8/P/+/v7//v7+///////Ly8v/Ly8v/wAAAOAAAAAiAAAAAAMDA78UFBT/wsLC//////////////////39/f/u7u7/9/f3///////+/v7/9/f3/97e3v/19fX/zs7O/zk5Of/S0tL//v7+//7+/v/8/Pz/wcHB/729vf/+/v7//f39//7+/v/+/v7//////8zMzP8vLy//AAAA4AAAACIAAAAAAwMDvxQUFP/CwsL/////////////////6Ojo/25ubv/Dw8P///////39/f/c3Nz/WVlZ/8HBwf/BwcH/SkpK/97e3v/+/v7//f39//r6+v9oaGj/bW1t//39/f/+/v7/////////////////zMzM/zAwMP8AAADgAAAAIgAAAAADAwO/FBQU/8LCwv/////////////////j4+P/Pj4+/56env///////v7+/+zs7P+jo6P/3t7e/+Dg4P+srKz/7+/v///////+/v7/+/v7/2dnZ/9VVVX/+Pj4///////////////////////MzMz/MTEx/wAAAOAAAAAiAAAAAAMDA78UFBT/wsLC/////////////////93d3f8fHx//fn5+//z8/P/////////////////+/v7//Pz8//7+/v/8/Pz///////39/f/x8fH/RkZG/zExMf/g4OD//////////////////////83Nzf8yMjL/AAAA4AAAACIAAAAAAwMDvxQUFP/CwsL//v7+///////39/f/r6+v/wwMDP8+Pj7/w8PD//39/f/8/Pz///////7+/v/8/Pz//f39//39/f/8/Pz/+/v7/7W1tf8rKyv/Ly8v/4aGhv/29vb/////////////////zMzM/zAwMP8AAADgAAAAIgAAAAADAwO/FBQU/8LCwv/6+vr/7u7u/7W1tf9KSkr/ZmZm/3l5ef9AQED/kZGR/+zs7P/8/Pz/////////////////+/v7/+Xl5f+qqqr/RERE/3x8fP+kpKT/ODg4/3p6ev/e3t7/+/v7///////MzMz/MDAw/wAAAOAAAAAiAAAAAAQEBL8UFBT/xsbG/8vLy/9SUlL/Ghoa/0xMTP/g4OD/6enp/2NjY/8eHh7/tLS0//z8/P/+/v7////////////n5+f/WVlZ/xQUFP9vb2//7e3t//j4+P+ampr/Hh4e/1ZWVv/t7e3//////87Ozv81NTX/AAAA4AEBASIAAAAAAwMDvxQUFP/ExMT/4ODg/5WVlf9eXl7/Ozs7/6+vr/+1tbX/Q0ND/3Jycv/Y2Nj/+/v7//////////////////Dw8P+SkpL/RkZG/1ZWVv/V1dX/xsbG/05OTv9GRkb/qamp//j4+P//////zc3N/zMzM/8AAADgAQEBIgAAAAABAQG/FxcX/8HBwf////////////Pz8/+Ojo7/NDQ0/0ZGRv+EhIT/9/f3///////////////////////////////////////c3Nz/WFhY/1hYWP9ISEj/Z2dn/97e3v/////////////////MzMz/MTEx/wAAAOAAAAAiAAAAAAAAAL4UFBT/vb29//z8/P/9/f3//////+Hh4f8qKir/Nzc3/9PT0////////////////////////////////////////f39//////+wsLD/Ghoa/0lJSf/k5OT//////////////////////8vLy/8wMDD/AQEB3wMDAyEAAAAAAAAAsAsLC/+VlZX/+/v7//7+/v//////6urq/0lJSf9paWn/8fHx///////////////////////////////////////+/v7//f39/8fHx/8tLS3/lpaW////////////////////////////ra2t/xoaGv8CAgLPBQUFGAAAAAAAAAB/BgYG+D09Pf/R0dH/9/f3//v7+//7+/v/4eHh/+jo6P//////////////////////////////////////////////////////8vLy/7i4uP/r6+v//////////////////v7+/93d3f9XV1f/AgIC/wEBAZgBAQELAAAAAAAAAC4EBATRCwsL/z8/P/+cnJz/tbW1/7Kysv+3t7f/t7e3/7e3t/+3t7f/t7e3/7e3t/+3t7f/t7e3/7e3t/+3t7f/t7e3/7e3t/+3t7f/tbW1/7e3t/+3t7f/tra2/7W1tf+np6f/UFBQ/wMDA/8AAADkAQEBRAAAAAEAAAAAAAAAAwMDA1wHBwfaBwcH/wgICP8NDQ3/Dw8P/w4ODv8ODg7/Dg4O/w4ODv8ODg7/Dg4O/w4ODv8ODg7/Dg4O/w4ODv8ODg7/Dg4O/w4ODv8ODg7/Dg4O/w4ODv8MDAz/CgoK/wsLC/8AAAD/AAAA5wAAAHIAAAAMAAAAAAAAAAAAAAAAAAAABQEBAUYDAwORAgICsgEBAbUBAQG1AAAAtQAAALUAAAC2AAAA6AAAAP8AAADzAAAAxAAAALQAAAC0AAAAuwAAAOcAAAD/AAAA9QAAAMAAAAC0AAAAtQEBAbUCAgK1AAAAswAAAJsAAABVAAAADQAAAAAAAAAAAAAAAAAAAAABAQEABAQEAAEBAQwBAQEcBQUFHgMDAx4BAQEeAQEBIQAAAHYAAADrAAAA9AAAAJABAQEnAQEBHgEBAR4BAQEhAQEBZwAAAOMAAAD6AAAAnAEBASsCAgIeBQUFHgkJCR4CAgIdAAAAEQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgICAAEBAQAEBAQAAwMDAAAAAAIAAABRAAAA2AAAAPYAAACTAAAAFgEBAQABAQEAAQEBAAEBAQAAAAAHAAAAaQAAAOYAAADuAAAAegAAAAoEBAQABwcHAAICAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANAAAANoAAAD2AAAAlwAAABYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAbQAAAOgAAADvAAAAaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4AAAAxgAAAJIAAAAaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAbQAAAMoAAABsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAArAAAAFQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHAAAALwAAABEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/D/wf8AAAA+AAAAHAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAADgAAAB+AAAB/+B4H//g/A//4P4P/+P/H///////////8=
  24. // ==/UserScript==
  25.  
  26. (function () {
  27. 'use strict';
  28.  
  29. function getTitle() {
  30. let title = document.querySelector("meta[name='keywords']").content;
  31. title = title.substring(0, title.indexOf(","))
  32. if (title.includes("第")) title = title.substring(0, title.indexOf("第"));
  33. return title;
  34. }
  35.  
  36. GM_addStyle(".MacPlayer{border-radius:0!important;}.webFullScreen{top:0!important;left:0!important;width:100vw!important;height:100vh!important;position:fixed!important;z-index:2147483646!important;margin:0!important;padding:0!important}#zhuXian a{font-size:12px!important;margin:0!important;}");
  37. const MSG_SOURCE = "FENY_SCRIPTS_ANIME";
  38. const App = {
  39. init() {
  40. this.videoSetting();
  41. this.setupMutationObserver();
  42. this.setupKeydownListener();
  43. },
  44. setupMutationObserver() {
  45. const observer = new MutationObserver(() => {
  46. this.purifyHomePage();
  47. const ok = this.webFullScreen();
  48. if (ok) observer.disconnect();
  49. });
  50. observer.observe(document.body, { childList: true, subtree: true });
  51. setTimeout(() => observer.disconnect(), 10000);
  52. },
  53. query: (selector, context) => (context || document).querySelector(selector),
  54. querys: (selector, context) => (context || document).querySelectorAll(selector),
  55. isPili: () => location.host.includes("pili"),
  56. isFanTuan: () => location.host.includes("ft"),
  57. isEzSite: () => location.host.includes("ezdmw"),
  58. isBimi: () => location.host.includes("bimiacg"),
  59. isKelatv: () => location.host.includes("kelatv"),
  60. getFrame() { return this.query("iframe:not([src=''])") },
  61. purifyHomePage() {
  62. if (!this.isBimi() || location.pathname !== "/") return;
  63. this.query(".newhd")?.remove();
  64. this.query(".login-box")?.remove();
  65. this.query(".nav-area").style.marginBottom = "20px";
  66. },
  67. webFullScreen() {
  68. if (location.pathname === "/") return true;
  69. this.query("#bkcl")?.remove();
  70. this.query(".tuiguang")?.remove();
  71. this.query(".play-full")?.remove();
  72. this.query(".line_button2")?.remove();
  73. try { if (window.top !== window) this.query(".ABP-Text").remove(); } catch (e) { return false; }
  74. const frame = this.getFrame();
  75. if (!frame) return false;
  76. frame.setAttribute("allow", "autoplay");
  77. frame.addEventListener("load", () => {
  78. frame.classList.add("webFullScreen");
  79. this.query(".MacPlayer")?.classList.add("webFullScreen");
  80. });
  81. return true;
  82. },
  83. videoSetting() {
  84. const settings = {
  85. volume: 1,
  86. opacity: 0.88,
  87. autoPlay: true,
  88. defaultWide: true,
  89. theme: this.isBimi() ? "bilibili" : "YouTube",
  90. };
  91. const storage = JSON.parse(localStorage.getItem("html5Settings"));
  92. localStorage.setItem("html5Settings", JSON.stringify(Object.assign({}, storage, settings)));
  93. },
  94. setupKeydownListener() {
  95. window.addEventListener("keydown", (event) => {
  96. let hotKey = event.key.toUpperCase();
  97. const activeTagName = document.activeElement.tagName;
  98. if (["INPUT", "TEXTAREA"].includes(activeTagName)) return;
  99. if (window.top !== window) return parent.postMessage({ source: MSG_SOURCE, hotKey }, "*")
  100. this.execHotKeyActions(hotKey);
  101. });
  102. window.addEventListener("message", (event) => {
  103. const { data } = event;
  104. if (!data?.source) return;
  105. if (!data.source.includes(MSG_SOURCE)) return;
  106. if (data?.hotKey) this.execHotKeyActions(data.hotKey);
  107. });
  108. },
  109. execHotKeyActions(key) {
  110. const actions = {
  111. F: () => { // 切换网页全屏
  112. this.switchClass(this.getFrame(), "webFullScreen");
  113. this.switchClass(this.query(".MacPlayer"), "webFullScreen");
  114. window.scrollTo({ top: this.query(":is(.player, .ty-play)")?.getBoundingClientRect().top || 0 });
  115. },
  116. "[": () => { // 上集
  117. if (this.isBimi()) return this.query(".pre")?.click();
  118. if (this.isKelatv()) return this.query(".but-ji").click();
  119. const episode = this.query(`a[href="${location.pathname}"]`);
  120. if (this.isEzSite()) return episode?.nextElementSibling.click();
  121. episode?.previousElementSibling.click();
  122. },
  123. "]": () => { // 下集
  124. if (this.isBimi()) return this.query(".next")?.click();
  125. if (this.isKelatv()) return this.query(".but-ji:last-child").click();
  126. const episode = this.query(`a[href="${location.pathname}"]`);
  127. if (this.isEzSite()) return episode?.previousElementSibling.click();
  128. episode?.nextElementSibling.click();
  129. },
  130. T: () => { // 切换路线
  131. // E站
  132. if (this.isEzSite()) {
  133. const routes = Array.from(this.querys("div[class*='line_button']"));
  134. const currRoute = this.query("div[class*='line_button'][style*='rgb']");
  135. routes.find(route => route !== currRoute)?.click();
  136. }
  137. // P站
  138. if (this.isPili()) {
  139. const routes = Array.from(this.querys(".c-player-episode ul"));
  140. const currEpisode = this.query(`a[class*="current"][href="${location.pathname}"]`);
  141. const currRouteIndex = routes.findIndex(route => route === currEpisode.parentElement);
  142. let nextRouteIndex = currRouteIndex + 1;
  143. if (nextRouteIndex >= routes.length) nextRouteIndex = 0;
  144. const currEpisodeIndex = this.index(currEpisode);
  145. const episodes = routes[nextRouteIndex]?.querySelectorAll("a");
  146. episodes[currEpisodeIndex]?.click();
  147. }
  148. // 饭团动漫
  149. if (this.isFanTuan()) {
  150. try {
  151. const currRoute = this.query(".anime-episode.active");
  152. let nextRoute = currRoute?.nextElementSibling;
  153. if (!nextRoute) nextRoute = currRoute.parentElement.firstElementChild;
  154. const index = this.index(this.query("a[class*='btn-episode active']"));
  155. nextRoute.children[index].click();
  156. } catch (e) { }
  157. }
  158. // 哔咪动漫
  159. if (this.isBimi()) {
  160. try {
  161. const routes = Array.from(this.querys(".play_box"));
  162. const currRouteIndex = routes.findIndex(route => route.classList.contains("show"))
  163. let nextRouteIndex = currRouteIndex + 1;
  164. if (nextRouteIndex >= routes.length) nextRouteIndex = 0;
  165. const currEpisode = this.query(`a[href="${location.pathname}"]`)?.parentElement;
  166. const currEpisodeIndex = this.index(currEpisode);
  167. const episodes = routes[nextRouteIndex]?.querySelectorAll("li");
  168. episodes[currEpisodeIndex]?.firstElementChild?.click();
  169. } catch (e) { }
  170. }
  171. },
  172. V: () => { // 使用E站搜索视频
  173. if (!this.isBimi()) return;
  174. GM_openInTab(`https://www.ezdmw.site/Index/search.html?searchText=${getTitle()}`);
  175. }
  176. };
  177. if (actions[key]) actions[key]();
  178. },
  179. index(element) {
  180. if (!element) return;
  181. const parent = element.parentNode;
  182. if (!parent) return -1;
  183. const children = Array.from(parent.children);
  184. return children.indexOf(element);
  185. },
  186. switchClass(element, selector) {
  187. if (!element) return;
  188. const classList = element.classList;
  189. const contains = classList.contains(selector);
  190. contains ? classList.remove(selector) : classList.add(selector);
  191. },
  192. }
  193.  
  194. App.init();
  195. })();

QingJ © 2025

镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址