社区文档构建进行中,欢迎编辑。社区答疑群(非官方):717421103,点点小课堂(腾讯会议):5696651544
全站通知:
用户:123855714/Danmu.js
刷
历
编
跳到导航
跳到搜索
注意:在发布之后,您可能需要清除浏览器缓存才能看到所作出的变更的影响。
- Firefox或Safari:按住Shift的同时单击刷新,或按Ctrl-F5或Ctrl-R(Mac为⌘-R)
- Google Chrome:按Ctrl-Shift-R(Mac为⌘-Shift-R)
- Internet Explorer或Edge:按住Ctrl的同时单击刷新,或按Ctrl-F5
- Opera:按 Ctrl-F5。
/**
* Danmu
* Author:马小萌
* Bilibili:https://space.bilibili.com/123855714
*/
"use strict";
var danmu = {
about: {
ver: "v1.1.0",
info: function(){
console.log("%c Bwiki弹幕 %c%s\nhttps://wiki.biligame.com/tools/Danmu", "color: #fff; padding: 5px 0; background: #F785AB;", "padding: 5px 6px 5px 5px; background: #FFE0E0;", danmu.about.ver);
}
},
data:{
cssraw1: `
<style>
.danmu {
position: fixed;
top: 0px;
user-select: none;
z-index:999;
}
.danmu .post {
display:none;
position: absolute;
font-size: 18px;
text-wrap: nowrap;
align-items: center;
}
.danmu .post img {
width: 18px;
height: 18px;
border-radius: 50%;
border: 1px solid #aaa;
}
.danmu .post span {
margin-left:2px;
text-shadow: #0000007f 1px 0 0, #0000007f 0 1px 0, #ffffff7f -1px 0 0, #ffffff7f 0 -1px 0;
}
</style>
`,
count: {
loopcount:0,
loopnum:0,
total:0,
},
on:false,
pageid: "1",
setting: {
once: 20,
speed: 2,
maxtop: 0.7
},
url: "/api.php"
},
getflowthread: async function(csrftoken){
return await new Promise((resolve) => {
$.ajax({
url:danmu.data.url,
type:"post",
data:{
"action":"flowthread",
"type":"list",
"pageid":danmu.data.pageid,
"limit":99999,
"token":csrftoken,
"utf8":"1",
"format":"json"
},
success:function(result){
resolve(result);
},
error:function(e){
console.error("getflowthread:",e);
}
});
});
},
init: function(){
if($(".danmu").length)return;
try{
var swinput = $("<input>");
swinput.attr({
id:"danmu",
type:"checkbox"
});
swinput.css({
"margin-left":"20px",
"width":"16px"
});
var swspan = $("<span>");
swspan.text("弹幕");
swspan.css({"font-size":"16px"});
$(".comments-title").append(swinput,swspan);
var dDiv = $("<div>").addClass("danmu");
$("head").append(danmu.data.cssraw1);
$("body").append(dDiv);
}catch{}
danmu.data.url = mw.config.get("wgScript").replace("index","api");
danmu.data.pageid = mw.config.get("wgArticleId");
$("#danmu").on("click",function(){
if($(this)[0].checked){
danmu.data.on = true;
if(danmu.data.pageid > 0){
danmu.token(danmu.data.url).then(function(csrftoken){
danmu.getflowthread(csrftoken).then(function(result){
if(result.flowthread){
danmu.data.count.total = result.flowthread.posts.length;
danmu.data.count.loopnum = 0;
result.flowthread.posts.forEach((item)=>{
var pDiv = $("<div>").addClass("post");
var pImg = $("<img>").attr("src",item.avatar);
var pText = $("<span>").html(item.text);
pDiv.append(pImg,pText)
$(".danmu").append(pDiv);
});
for(var i=0;i<(danmu.data.count.total<danmu.data.setting.once?danmu.data.count.total:danmu.data.setting.once);i++){
danmu.load(i);
}
if(danmu.data.count.total>danmu.data.setting.once){
danmu.data.count.loopnum = danmu.data.setting.once;
}
}
});
});
danmu.about.info();
}
}else{
danmu.data.on = false;
$(".danmu").empty();
}
});
},
load: function(i){
var obj = $(".danmu .post")[i];
var screenHeight = document.documentElement.clientHeight;
var maxTop = screenHeight * danmu.data.setting.maxtop;
obj.style.display = "flex";
obj.style.top = maxTop * Math.random() + "px";
var screenWidth = document.documentElement.clientWidth;
obj.style.left = screenWidth + "px";
obj.style.color = `#${Math.floor(Math.random()*128).toString(16).padStart(2, '0')}${Math.floor(Math.random()*128).toString(16).padStart(2, '0')}${Math.floor(Math.random()*128).toString(16).padStart(2, '0')}`;
danmu.move(Math.random() * danmu.data.setting.speed + 1, i, screenWidth);
},
move: function(speed, i, maxLeft) {
if(!danmu.data.on)return;
var obj = $(".danmu .post")[i];
maxLeft -= speed;
if (maxLeft > -obj.offsetWidth) {
obj.style.left = maxLeft + "px";
requestAnimationFrame(function () {
danmu.move(speed, i, maxLeft);
});
} else {
obj.style.display = "none";
if(danmu.data.count.total>danmu.data.setting.once){
if(danmu.data.count.loopnum >= danmu.data.count.total-1){
danmu.data.count.loopnum = 0;
}else{
danmu.data.count.loopnum += 1;
}
danmu.load(danmu.data.count.loopnum);
}else{
danmu.load(i);
}
}
},
token: async function(url){
return await new Promise((resolve) => {
$.ajax({
url:url,
type:"post",
data:{
"action":"query",
"format":"json",
"meta":"tokens"
},
dataType:"json",
success:function(result){
resolve(result.query.tokens.csrftoken);
},
error:function(e, status){
console.error(status,"getToken:",e);
}
});
});
},
}
setTimeout(function() {
danmu.init();
}, 3000);