Greasy Fork is available in English.
视频自动点赞,网页自动宽屏播放
// ==UserScript==// @name 哔哩哔哩小助手// @namespace https://greasyfork.org/zh-CN/scripts/424638// @homepage https://greasyfork.org/zh-CN/scripts/424638// @version 0.9.2// @description 视频自动点赞,网页自动宽屏播放// @author 木羊羽// @match https://www.bilibili.com/video/*// @match https://www.bilibili.com/bangumi/play/*// @run-at document-end// @grant none// @require https://cdnjs.cloudflare.com/ajax/libs/jquery/3.6.0/jquery.js// @license GPL-3.0 License// ==/UserScript==// 更新日志// v0.9.2 修复自动调整页面位置功能// v0.9.1 修复屏幕滚动bug,增加是否开启Enter键全屏功能// v0.9 修复失效功能,优化功能逻辑// v0.8 适配新版播放界面,不兼容老版播放界面,添加根据观看时长定时点赞功能// v0.7 修复按下Enter键无法搜索的bug,增加视频窗口居中功能// v0.6 增加按下Enter键全屏功能// v0.5 优化逻辑,新增点赞按钮// v0.4 修复bug// v0.3 增加番剧、综艺宽屏,优化逻辑// v0.2 新增自动调节页面至合适位置// v0.1 自动点击宽屏、点赞按钮,点赞默认为关闭(function () {// 是否开启按下Enter键全屏功能,默认开启const enter_is_able = true; // 开启// const enter_is_able = false; // 关闭// 自动宽屏function tool_1() {// widescreenFunction = true 打开自动宽屏 widescreenFunction = false 关闭自动宽屏// likeFunction = true 打开自动点赞 likeFunction = false 关闭自动点赞const widescreenFunction = trueconst likeFunction = trueif (widescreenFunction) {let widescreen_id = setInterval(function () {// 宽屏按钮classNamelet widescreen = document.querySelector('.bpx-player-ctrl-wide')// 自动点击宽屏按钮函数if (widescreen) {// 宽屏状态存在bpx-state-Enteredif (widescreen.className.includes('bpx-state-Entered') === false) {widescreen.click()clearInterval(widescreen_id)}}}, 3000)}// 延时计数let count = 0if (likeFunction) {let like_id = setInterval(function () {// 定位点赞按钮let toolbar_left = document.querySelector('.toolbar-left-item-wrap')// video-like 定位到点赞按钮let like = toolbar_left.querySelector(".video-like")if (like === null) {console.log('未找到点赞button!')} else if (like.className.includes('on') === false && count === 0) {// count==1 为20s count==2 为30s 以此类推like.click()// like.className = 'like on'// 同时修改屏幕左侧按钮let like_button = document.querySelector('.diy_tool')let img = like_button.children[0]img.style.color = '#479fd1'clearInterval(like_id)console.log('当前视频点赞成功')} else {console.log('当前视频已经点赞')clearInterval(like_id)}count = count + 1}, 10000)}}// 点赞按钮function tool_2() {let body = document.getElementsByTagName('body')[0]// toolbar-left-item-wrap 定位类名let ops = document.querySelector('.toolbar-left-item-wrap')let color = '#757575'if ($(ops.children[0]).attr('class') === 'on') {color = '#479fd1'}$(body).after(`<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css" /><div class="diy_tool"><i class="fa fa-thumbs-up fa-3x" aria-hidden="true"></i></div><style>.diy_tool{position: fixed;display: flex;top: 200px;left: -25px;width: 40px;height: 30px;z-index: 99999;font-size: 15px;cursor: pointer;align-items: cEnter;transition: .3s;color: ${color};}.diy_tool i{position: absolute;margin-left: 10px;right: 0;}.like_button{margin-left: 5px;}.diy_tool:hover{left: 0;}</style>`)let like_button = document.querySelector('.diy_tool')let img = like_button.children[0]like_button.onclick = function () {if ($(ops.children[0]).attr('class') === 'video-like video-toolbar-left-item on') {img.style.color = '#757575'$(ops.children[0]).click()} else {img.style.color = '#479fd1'$(ops.children[0]).click()}}// 监听点赞按钮,同步点赞按钮状态// 选择需要观察变动的节点const targetNode = document.querySelector('div.video-like');// 观察器的配置(需要观察什么变动)const config = {attributes: true, childList: true, subtree: true};// 当观察到变动时执行的回调函数const callback = function (mutationsList, observer) {for (const mutation of mutationsList) {if (mutation.type === 'attributes' && mutation.target.classList.contains('video-like')) {if (mutation.type === 'attributes'&& mutation.target.classList.contains('video-like')&& mutation.target.classList.contains('video-toolbar-left-item')&& mutation.target.classList.contains('on')) {img.style.color = '#479fd1'console.log('修改左侧点赞按钮为蓝色,点赞')}if (mutation.type === 'attributes'&& mutation.target.classList.contains('video-like')&& mutation.target.classList.contains('video-toolbar-left-item')&& !mutation.target.classList.contains('on')) {img.style.color = '#757575'console.log('修改左侧点赞按钮为灰色,取消点赞')}}}};// 创建一个观察器实例并传入回调函数const observer = new MutationObserver(callback);// 以上述配置开始观察目标节点observer.observe(targetNode, config);}// 按下Enter键进出全屏function tool_3() {if (enter_is_able) {window.addEventListener('keydown', (e) => {let get_focus = document.activeElementif (e.key === "Enter") {// 判断是否是在搜索框// nav-search-content 为搜索框类if (get_focus.className.includes('nav-search-content') === false) {let fullscreen_btn = document.querySelector('.bpx-player-ctrl-full')fullscreen_btn.click()}}})}}// 指定位置按钮function tool_4() {let body = document.getElementsByTagName('body')[0]let ops = document.querySelector('.left-container')$(body).after(`<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css" /><div class="diy_tool_4"><i class="fa fa-sort fa-3x" aria-hidden="true"></i></div><style>.diy_tool_4{position: fixed;display: flex;top: 150px;left: -26px;width: 40px;height: 30px;z-index: 99999;font-size: 15px;cursor: pointer;align-items: cEnter;transition: .3s;color: #757575;}.diy_tool_4 i{position: absolute;margin-left: 10px;right: 0;}.diy_tool_4:hover{left: 0;}</style>`)let fixed_button = document.querySelector('.diy_tool_4')fixed_button.onclick = function () {specify_location()}}// 从当前页面跳转到其他页面也能使点赞功能生效function tool_5() {const _wr = function (type) {const orig = history[type];return function () {const rv = orig.apply(this, arguments);const e = new Event(type);e.arguments = argumentswindow.dispatchEvent(e)return rv}};history.pushState = _wr('pushState')window.addEventListener('pushState', function (e) {tool_1()})}// 移动屏幕到指定位置function specify_location() {if (window.screen.height === 864) {scrollTo(0, 60)} else if(window.screen.height === 1080) {scrollTo(0, 90)} else {scrollTo(0, 90)}console.log("移动屏幕到指定位置")}tool_1() // 自动宽屏tool_2() // 点赞按钮tool_3() // 按下Enter键进出全屏specify_location() // 自动调整页面位置tool_4() // 指定位置按钮tool_5() // 从当前页面跳转到其他页面也能使点赞功能生效})()