// ==UserScript== // @name 快捷弹幕 // @namespace http://tampermonkey.net/ // @version 0.5.5 // @description B站直播间发送快捷弹幕 // @author mianju // @include /https?:\/\/live\.bilibili\.com\/(blanc\/)?\d+\??.*/ // @require https://cdn.staticfile.org/axios/0.27.2/axios.min.js // @grant none // @downloadURL https://update.greasyfork.icu/scripts/439088/%E5%BF%AB%E6%8D%B7%E5%BC%B9%E5%B9%95.user.js // @updateURL https://update.greasyfork.icu/scripts/439088/%E5%BF%AB%E6%8D%B7%E5%BC%B9%E5%B9%95.meta.js // ==/UserScript== (function () { function main() { initLib() initCss() waitForLoaded(() => { initUi() }) } function initLib() { let scriptElement = document.createElement('script') scriptElement.src = 'https://cdn.staticfile.org/vue/2.6.9/vue.min.js' document.head.appendChild(scriptElement) let linkElement = document.createElement('link') linkElement.rel = 'stylesheet' linkElement.href = 'https://cdn.bootcdn.net/ajax/libs/element-ui/2.15.14/theme-chalk/index.css' document.head.appendChild(linkElement) scriptElement = document.createElement('script') scriptElement.src = 'https://cdn.bootcdn.net/ajax/libs/element-ui/2.15.14/index.js' document.head.appendChild(scriptElement) } function initCss() { let css = ` .el-select .el-input { width: 80px; } .input-with-select .el-input-group__prepend { background-color: #fff; } ` let styleElement = document.createElement('style') styleElement.innerText = css document.head.appendChild(styleElement) } function waitForLoaded(callback, timeout = 10 * 1000) { let startTime = new Date() function poll() { if (isLoaded()) { callback() return } if (new Date() - startTime > timeout) { return } setTimeout(poll, 1000) } poll() } function isLoaded() { if (window.ELEMENT === undefined) { return false } if (document.querySelector('#control-panel-ctnr-box') === null) { return false } return true } function initUi() { var father = document.getElementsByClassName('icon-left-part')[0]; let quickDanmakuElement = document.createElement('div'); father.appendChild(quickDanmakuElement); new Vue({ el: quickDanmakuElement, template: ` `, data: { options: [ { label: '所有直播间', value: 'all', danmakus: [] }, { label: '当前直播间', value: 'cur', danmakus: [] } ], value: '', danmaku4add: '', select: 'cur', danmakus4del: [], roomId: 0, allRoomDanmakus: [], curRoomDanmakus: [], key4all: 'allRoomDanmukus', key4cur: '', value4switch: false, interval: null, freq: '正常', freqopts: {'高频':[30,6000],'正常':[15,12000],'低频':[10,18000]}, chatInput: null }, methods: { "delDanmakus": function () { function del(val,danmakus) { let index = danmakus.indexOf(val); danmakus.splice(index,1); }; for (let i=0;i{ if (res.data.code == 0) { switch (res.data.msg) { case '': this.$message.success('发送成功 - ' + danmaku4send); break; /*case 'f': this.$message.error('发送失败 - 包含B站屏蔽词: ' + danmaku4send); break; case 'k': this.$message.error('发送失败 - 包含直播间屏蔽词: ' + danmaku4send); break;*/ case 'same restriction': this.$message.error('发送失败,该弹幕已被限制,请选择其它弹幕!'); break; case 'max limit exceeded': this.$message.error('发送失败,弹幕池达到上限!'); break; default: this.$message.error('发送失败 - ' + res.data.message); } } else { this.$message.error('发送失败 - ' + res.data.message); } }).catch(()=>{ this.$message.error('发送失败 - ' + danmaku4send); }); }, "autoSend": function(flag) { if (flag) { this.$message.info('自动发送已开启'); let count = 0; let _this = this let opt = this.freqopts[this.freq] this.interval = setInterval( ()=>{ count++; if (count == opt[0]) { _this.value4switch = false; clearInterval(_this.interval) _this.$message.info('自动发送已关闭'); } _this.sendDanmaku(_this.value); },opt[1] ); } else { this.$message.info('自动发送已关闭'); clearInterval(this.interval); } }, "sendListener": function() { var _this = this; function keydown(event) { if (event.keyCode == 13) { if (_this.chatInput.chatInput != '') { _this.sendDanmaku(_this.chatInput.chatInput); } setTimeout(_this.chatInput.clearInput, 10); } }; this.chatInput.onKeyDown = keydown; } } , created: function () { this.getRoomId(); this.key4cur = this.roomId + '-danmukus'; this.curRoomDanmakus = this.getDanmakus(this.key4cur); this.allRoomDanmakus = this.getDanmakus(this.key4all); this.handleDanmakus(); this.chatInput = document.querySelector('#control-panel-ctnr-box').__vue__; this.sendListener(); }, computed: { flag4switch: function() { return (this.value == '') } } }); } function getCookie(cname){ var name = cname + "="; var ca = document.cookie.split(';'); for(var i=0; i