// ==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