bilibili_live_modify

目前只能车

// ==UserScript==
// @name         bilibili_live_modify
// @namespace    http://tampermonkey.net/
// @match         *://live.bilibili.com/*
// @version      0.2
// @description  目前只能车
// @author       Yi MIT
// @icon         data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==
// @require      https://cdn.bootcdn.net/ajax/libs/jquery/3.5.1/jquery.min.js
// @require      https://cdn.bootcdn.net/ajax/libs/qrcodejs/1.0.0/qrcode.min.js
// @grant        GM_xmlhttpRequest
// @license      MIT
// ==/UserScript==
(function () {
	let website;//站点:0(斗鱼),1(虎牙),2(bilibili),3(抖音)
	let url = window.location.host;//当前网址
	let cookie = document.cookie;//获取所有cookie
	let csrf = '';//csrf码
	let room_info = '';//房间信息
	let room_id = '';//房间号
	let data = '';//表单数据
	let sessdata = '';//B站登录状态
	let sleepTime = -1;
	let start = 0;//按钮状态:0启动 1停止
	let periodic = ''//周期状态
	let strI = 0;
	let strMax = 20;
	
	setTimeout(() => {
		initDLC();
	}, 7000);
	
    //初始化
	async function initDLC() {
		if (url === 'www.douyu.com') {
			website = 0;
		} else if (url === 'www.huya.com') {
			website = 1;
		} else if (url === 'live.bilibili.com') {
			website = 2;
			let temp = window.location.href.split("/")[3].split("?")[0];
			if (isNaN(parseFloat(temp))) {
				return;
			}
			room_info = await (await fetch("https://api.live.bilibili.com/room/v1/Room/get_info?room_id=" + temp)).json();
			room_id = room_info.data.room_id;
			let cookie_list = cookie.split(";");
			let flag = false;
		    for (let i = 0; i < cookie_list.length; i++) {
		    	let temp = cookie_list[i].trim().split("=");
		    	if (temp[0] === 'bili_jct') {
		    		csrf = temp[1];
		    	} else if (temp[0] === 'yimit_live_sessdata') {
					flag = true;
					cookie = cookie + ";SESSDATA=" + temp[1];
				}
		    }
			if (flag === false) {
				let returnGenerate = await run_unicycle_request_GET("https://passport.bilibili.com/x/passport-login/web/qrcode/generate");
				
				let login_live = document.createElement("div");
				login_live.setAttribute("style", "z-index: 999;position: fixed; top: 35%; left: 40%;background: #ffffff;padding: 0.3%;height: 16%; width: 7%;border-radius: 12px;display: block;");
				let main_live = document.querySelectorAll(".app-content.p-relative.z-app-content");
				main_live[0].appendChild(login_live);
				let login_live_text = document.createElement("div");
				login_live_text.innerHTML = "使用脚本前,请先用bilibili手机客户端扫码登陆";
				login_live_text.setAttribute("style", "color: #f69; text-align: center;");
				login_live.appendChild(login_live_text);
				let qrcode = document.createElement("div");
				qrcode.setAttribute("id", "qrcode");
				let img = new QRCode(qrcode, {
					text: returnGenerate[0].data.url,
					width: 180,
					height: 180,
					colorDark : "#000000",
					colorLight : "#ffffff"
				});
				login_live.appendChild(qrcode);
				
				let code = 1;
				while (code !== 0) {
					let login_in = await run_unicycle_request_GET("https://passport.bilibili.com/x/passport-login/web/qrcode/poll?qrcode_key=" + returnGenerate[0].data.qrcode_key);
					code = login_in[0].data.code;
					if (code === 86090) {
						alert("二维码已扫未确认");
					} else if (code === 86038) {
						alert("二维码已失效");
					} else if (code === 0) {
						alert("账号已登录");
						let sessdata = login_in[1].split('\n');
						for (let i = 0; i < sessdata.length; i++) {
							let set_cookie = sessdata[i].split(';');
							if (set_cookie.length > 1) {
								for (let j = 0, k = 0; j < set_cookie.length; j++) {
									let set_temp = set_cookie[j].split("=");
									if (set_temp[0].indexOf("SESSDATA") !== -1) {
										sessdata = set_temp[1];
									} else if (set_temp[0].trim() === 'Expires' && k === 0) {
										document.cookie = "yimit_live_sessdata=" + sessdata + "; expires=" + set_temp[1];
										cookie = cookie + ";SESSDATA=" + sessdata;
										k++;
									}
								}
							}
						}
						login_live.setAttribute("style", "z-index: 999;position: fixed; top: 35%; left: 40%;background: #ffffff;padding: 0.3%;height: 16%; width: 7%;border-radius: 12px;display: none;");
					}
					sleep(10);
				}
			}
		}
		
		let ul_tab_list = document.querySelectorAll(".tab-list.dp-flex");
		let tab_content = document.querySelectorAll(".tab-content.ts-dot-2.tab-content-pilot");
		let unicycle_test1_height = document.querySelectorAll(".tabs");
		
		if (document.getElementsByTagName("iframe").length > 2) {
			ul_tab_list = document.getElementsByTagName("iframe")[1].contentWindow.document.querySelectorAll(".tab-list.dp-flex");
			tab_content = document.getElementsByTagName("iframe")[1].contentWindow.document.querySelectorAll(".tab-content.ts-dot-2.tab-content-pilot");
			unicycle_test1_height = document.getElementsByTagName("iframe")[1].contentWindow.document.querySelectorAll(".tabs");
		}
		
		// let ul_tab_list = document.querySelectorAll(".tab-list.dp-flex");
		// alert(document.getElementsByTagName("iframe")[1].contentWindow.document.querySelectorAll(".tab-list.dp-flex").length);
		let li_tab_list = document.createElement("li");
		li_tab_list.setAttribute("id", "li-tab-list");
		li_tab_list.setAttribute('data-v-9a8f688c', '');
		li_tab_list.setAttribute('data-v-9d1b85a4', '');
		li_tab_list.setAttribute('class', 'item live-skin-normal-text dp-i-block live-skin-separate-border border-box t-center pointer opacity6');
		li_tab_list.setAttribute('height', '14px');
		li_tab_list.setAttribute('line-height', '14px');
		li_tab_list.setAttribute('border-right', '1px solid #e3e5e7;');
		li_tab_list.setAttribute('flex', '1');
		li_tab_list.innerHTML = "独轮车";
		ul_tab_list[0].appendChild(li_tab_list);
		let ul_tab_children = ul_tab_list[0].querySelectorAll('li');
		
		let unicycle_test1 = document.createElement("div");
		unicycle_test1.className = "unicycle-test1";
		unicycle_test1.setAttribute('data-v-018ef60e', '');
		unicycle_test1.setAttribute('data-v-30dc9297', '');
		unicycle_test1.setAttribute('style', 'z-index: 999;position: absolute;background: rgba(255, 255, 255, 0);');
		unicycle_test1.setAttribute('class', 'gift-rank-cntr live-skin-coloration-area rank-list-content a-move-in-top');
		unicycle_test1.style.width = tab_content[0].offsetWidth + 'px';
		unicycle_test1.style.top = unicycle_test1_height[0].offsetHeight + 'px';
		// unicycle_test1.style.height = 400 + 'px';
		unicycle_test1.style.height = "80%";
		unicycle_test1.style.display = 'none';
		tab_content[0].appendChild(unicycle_test1);
		
		let mode = document.createElement("div");
		mode.style.padding = "1%";
		mode.style.height = "100%";
		unicycle_test1.appendChild(mode);
		
		let mode_top = document.createElement("div");
		mode_top.style.width = "98%";
		mode_top.style.height = "7%";
		mode_top.style.padding = "0% 1% 2% 1%";
		mode.appendChild(mode_top);
		
		let mode_top_select = document.createElement("div");
		mode_top_select.style.height = "100%";
		mode_top_select.style.width = "50%";
		mode_top_select.style.display = "inline-flex";
		mode_top_select.innerHTML = "模式选择:"
		mode_top_select.style.alignItems = "center";
		let mode_top_select_1 = document.createElement("select");
		mode_top_select_1.style.height = "100%";
		mode_top_select_1.style.borderRadius = "4px";
		mode_top_select_1.style.border = "1px solid rgba(255,102,153,0.8)";
		mode_top.appendChild(mode_top_select);
		mode_top_select.appendChild(mode_top_select_1);
		
		let mode_top_select_option_0 = document.createElement("option");
		mode_top_select_option_0.value = "0";
		mode_top_select_option_0.innerHTML = "单句模式";
		mode_top_select_option_0.style.border = "0";
		mode_top_select_option_0.style.padding = "0";
		mode_top_select_option_0.style.borderRadius = "4px";
		mode_top_select_1.appendChild(mode_top_select_option_0);
		
		let mode_top_select_option_1 = document.createElement("option");
		mode_top_select_option_1.value = "1";
		mode_top_select_option_1.innerHTML = "说书模式";
		mode_top_select_option_1.style.border = "0";
		mode_top_select_option_1.style.padding = "0";
		mode_top_select_option_1.style.borderRadius = "4px";
		mode_top_select_1.appendChild(mode_top_select_option_1);
		
		let mode_top_select_option_2 = document.createElement("option");
		mode_top_select_option_2.value = "2";
		mode_top_select_option_2.innerHTML = "编程模式";
		mode_top_select_option_2.style.border = "0";
		mode_top_select_option_2.style.padding = "0";
		mode_top_select_option_2.style.borderRadius = "4px";
		mode_top_select_1.appendChild(mode_top_select_option_2);
		
		let mode_top_select_option_3 = document.createElement("option");
		mode_top_select_option_3.value = "3";
		mode_top_select_option_3.innerHTML = "随机模式";
		mode_top_select_option_3.style.border = "0";
		mode_top_select_option_3.style.padding = "0";
		mode_top_select_option_3.style.borderRadius = "4px";
		mode_top_select_1.appendChild(mode_top_select_option_3);
		
		let mode_top_select_right = document.createElement("div");
		mode_top_select_right.style.height = "100%";
		mode_top_select_right.style.width = "50%";
		mode_top_select_right.style.display = "inline-flex";
		mode_top.appendChild(mode_top_select_right);
		
		let mode_top_select_right_text = document.createElement("input");
		mode_top_select_right_text.setAttribute("id", "input_time");
		mode_top_select_right_text.type = "text";
		mode_top_select_right_text.style.width = "80%";
		mode_top_select_right_text.style.float = "right";
		mode_top_select_right_text.placeholder = "间隔时间(ms)";
		mode_top_select_right_text.style.borderRadius = "4px 0 0 4px";
		mode_top_select_right_text.style.padding = "0% 2%";
		mode_top_select_right_text.style.border = "1px solid rgba(255,102,153,0.8)";
		mode_top_select_right.appendChild(mode_top_select_right_text);
		let text_time = mode_top_select_right_text.value;
		
		let mode_top_select_right_span = document.createElement("span");
		mode_top_select_right_span.innerHTML = "ms";
		mode_top_select_right_span.style.display = "block";
		mode_top_select_right_span.style.justifyContent = "center";
		mode_top_select_right_span.style.alignContent = "center";
		mode_top_select_right_span.style.textAlign = "center";
		mode_top_select_right_span.style.width = "20%";
		mode_top_select_right_span.style.borderRadius = "0 4px 4px 0";
		mode_top_select_right_span.style.border = "1px solid rgba(255,102,153,0.8)";
		mode_top_select_right.appendChild(mode_top_select_right_span);
		
		let mode_text = document.createElement("textarea");
		mode_text.rows = "10";
		mode_text.cols = "20";
		mode_text.placeholder = "有活的整活,没活的复制,直播间不养闲人!";
		mode_text.style.width = "96%";
		mode_text.style.height = "75%";
		mode_text.style.padding = "2%";
		mode_text.style.borderRadius = "4px";
		mode_text.style.border = "1px solid rgba(255,102,153,0.8)";
		mode_text.setAttribute("id", "mode-text");
		mode.appendChild(mode_text);
		let text_str = mode_text.value;
		
		let mode_button = document.createElement("div");
		mode_button.style.padding = "2% 0%";
		mode_button.style.width = "100%";
		mode_button.style.height = "8%";
		mode_button.style.display = "inline-flex";
		mode.appendChild(mode_button);
		
		let mode_button_left = document.createElement("div");
		mode_button_left.style.height = "100%";
		mode_button_left.style.width = "50%";
		mode_button_left.style.display = "inline-flex";
		mode_button.appendChild(mode_button_left);
		
		let mode_button_right = document.createElement("div");
		mode_button_right.style.height = "100%";
		mode_button_right.style.width = "50%";
		mode_button_right.style.display = "inline-flex";
		mode_button.appendChild(mode_button_right);
		
		let mode_button_button = document.createElement("button");
		mode_button_button.setAttribute("id", "mode_button_button");
		mode_button_button.innerHTML = "独轮车,启动!";
		mode_button_button.style.padding = "0% 3%";
		mode_button_button.style.width = "94%";
		mode_button_button.style.background = "rgba(255,102,153,0.8)";
		mode_button_button.style.color = "#ffffff";
		mode_button_button.style.border = "0";
		mode_button_button.style.borderRadius = "4px";
		mode_button_right.appendChild(mode_button_button);
		
		for (let j = 0; j < ul_tab_children.length; j++) {
			ul_tab_children[j].addEventListener('click', (function(children, num, unicycle_test1_1) {
				return function(e) {
					for (let i = 0; i < children.length; i++) {
						children[i].setAttribute('class', 'item live-skin-normal-text dp-i-block live-skin-separate-border border-box t-center pointer opacity6');
					}
						// let tab_content = document.querySelectorAll(".tab-content.ts-dot-2.tab-content-pilot");
						let tab_content = document.getElementsByTagName("iframe").length > 2 ? document.getElementsByTagName("iframe")[1].contentWindow.document.querySelectorAll(".tab-content.ts-dot-2.tab-content-pilot") : document.querySelectorAll(".tab-content.ts-dot-2.tab-content-pilot");
					if (children[num].id === 'li-tab-list') {
						unicycle_test1_1.style.display = 'block';
						tab_content[0].querySelectorAll("div")[0].style.display = "none";
						// let switch_btn = document.querySelectorAll(".switch-btn-bg.live-skin-highlight-bg");
						let switch_btn = document.getElementsByTagName("iframe").length > 2 ? document.getElementsByTagName("iframe")[1].contentWindow.document.querySelectorAll(".switch-btn-bg.live-skin-highlight-bg") : document.querySelectorAll(".switch-btn-bg.live-skin-highlight-bg");
						switch_btn[0].click();
					} else {
						unicycle_test1_1.style.display = 'none';
						tab_content[0].querySelectorAll("div")[0].style.display = "block";
					}
					children[num].setAttribute('class', 'item live-skin-normal-text dp-i-block live-skin-separate-border border-box t-center pointer active');
				}
			})(ul_tab_children, j, unicycle_test1));
		}
		
		mode_top_select_1.addEventListener("change", (function(mode_top_select_1_1, text) {
			return function(e) {
				let change_num = mode_top_select_1_1.value;
				// let temp = document.getElementById("input_time");
				let temp = document.getElementsByTagName("iframe").length > 2 ? document.getElementsByTagName("iframe")[1].contentWindow.document.getElementById("input_time") : document.getElementById("input_time");
				if (change_num === '0') {
					temp.removeAttribute("disabled");
					text.placeholder = "按照指定时间间隔逐行发送弹幕" + '\n' + "1.使用回车换行。" + '\n' + "2.每行字符数建议不超过弹幕字符上限(超过部分会裁掉)。" + '\n' + "3.间隔时间建议不小于网站规定。";
				} else if (change_num === '1') {
					temp.removeAttribute("disabled");
					text.placeholder = "按照指定时间间隔逐行发送弹幕" + '\n' + "1.以符号为分段依据,过长会拆分发送。" + "\n" + "2.间隔时间建议不小于网站规定。";
				} else if (change_num === '2') {
					temp.setAttribute("disabled", "");
					text.placeholder = "待发送弹幕间可自定义发送间隔" + "\n" + "1.请以一行待发送弹幕一行间隔时间的格式来编写。" + "\n" + "2.每行字符数建议不超过弹幕字符上限(超过部分会裁掉)。" + '\n' + "3.间隔时间建议不小于网站规定。" + "\n\n例如:\n" + "谁不在改变呀!\n6000\n我也在改变呀!\n7000\n改变就应该改变!\n8000\n而不是不改变!\n9000";
				} else if (change_num === '3') {
					temp.setAttribute("disabled", "");
					text.placeholder = "随机时间间隔逐行发送弹幕" + '\n' + "1.使用回车换行。" + '\n' + "2.每行字符数建议不超过弹幕字符上限(超过部分会裁掉)。" + '\n' + "3.间隔时间建议不小于网站规定。";
				}
			}
		})(mode_top_select_1, mode_text));
		
		
		
		
		
		mode_button_button.addEventListener("click", (function(mode_top_select_1_1, room_id_1, csrf_1, cookie_1, data_1) {
			return function(e) {
				
				let change_num = mode_top_select_1_1.value;
				// let str = document.getElementById("mode-text").value;
				let str = document.getElementsByTagName("iframe").length > 2 ? document.getElementsByTagName("iframe")[1].contentWindow.document.getElementById("mode-text").value : document.getElementById("mode-text").value;
				// let time = document.getElementById("input_time").value;
				let time = document.getElementsByTagName("iframe").length > 2 ? document.getElementsByTagName("iframe")[1].contentWindow.document.getElementById("input_time").value : document.getElementById("input_time").value;
				let text = document.getElementsByTagName("iframe").length > 2 ? document.getElementsByTagName("iframe")[1].contentWindow.document.querySelectorAll(".chat-input.border-box") : document.querySelectorAll(".chat-input.border-box");
				// let button = document.getElementById("mode_button_button");
				let button = document.getElementsByTagName("iframe").length > 2 ? document.getElementsByTagName("iframe")[1].contentWindow.document.getElementById("mode_button_button") : document.getElementById("mode_button_button");
				
				if (start === 0) {
					if (str.trim() === "") {
						alert("独轮车不写内容好比上厕所不带纸");
					} else if (change_num === '0') {
						if (time.trim() === '') {
							alert("为什么不写时间!");
						} else {
							start = 1;
							button.innerHTML = "我说婷婷";
							let str_split = str.split("\n");
							let str_num = str_split.length;
							
							periodic = setInterval(() => {
								let str_temp = str_split[strI].length > 20 ? str_split[strI].substr(0, 20) : str_split[strI];
								text[text.length - 1].value = str_temp;
								let form_data = formData(str_temp, room_id_1, csrf_1);
								run_unicycle_request_1("https://api.live.bilibili.com/msg/send", cookie_1, form_data);
								strI = ++strI % str_split.length;
								sleep(100);
								text[text.length - 1].value = '';
							}, time);
						}
					} else if (change_num === '1') {
						if (time.trim() === '') {
							alert("为什么不写时间!");
						} else {
							start = 1;
							button.innerHTML = "我说婷婷";
							let str_split = new Array();
							let temp_str = '';
							for (let i = 0, j = 1; i < str.length; i++) {
								if (j < strMax && ([i] !== '\n' || str[i] !== '\t' || str[i] !== ',' || str[i] !== '.' || str[i] !== '?' || str[i] !== '!' || str[i] !== ',' || str[i] !== '。' || str[i] !== '?' || str[i] !== '!')) {
									temp_str += str[i];
									j++;
								} else {
									temp_str += str[i];
									str_split.push(temp_str);
									temp_str = '';
									j = 1;
								}
							}
							
							periodic = setInterval(() => {
								text[text.length - 1].value = str_split[strI];
								let form_data = formData(str_split[strI], room_id_1, csrf_1);
								run_unicycle_request_1("https://api.live.bilibili.com/msg/send", cookie_1, form_data);
								strI = ++strI % str_split.length;
								sleep(100);
								text[text.length - 1].value = '';
							}, time);
						}
					} else if (change_num === '2') {
						alert("编程模式");
					} else if (change_num === '3') {
						alert("随机模式");
					}
					
				} else {
					start = 0;
					button.innerHTML = "独轮车,启动!";
					clearInterval(periodic);
				}
			}
		})(mode_top_select_1, room_id, csrf, cookie, data));
	}
})();

async function run_unicycle_request_1(url, cookie, data) {
	GM_xmlhttpRequest({
			method: 'POST',
			url: url,
			anonymous: true,
			cookie: cookie,
			data: data,
			onload: function(response) {
			},
			onerror: function (){
				    alert(`操作失败`);
			}
	});
}

async function run_unicycle_request_GET(url) {
	return new Promise((resolve, reject) => {
		GM_xmlhttpRequest({
				method: 'GET',
				url: url,
				headers: {
					"Content-Type": "application/json; charset=utf-8",
					"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36",
				},
				onload: function(response) {
					let array = new Array();
					array[0] = JSON.parse(response.responseText);
					array[1] = response.responseHeaders;
					resolve(array);
				},
				onerror: function (){
						alert(`操作失败!`);
				}
		});
	})
}

function sleep(time){
 return new Promise((resolve) => setTimeout(resolve, time));
}

function formData(msg, room_id, csrf) {
	let form = new FormData();
	form.append("bubble","0");
	form.append("msg",msg);
	form.append("color","16777215");
	form.append("mode","1");
	form.append("fontsize","25");
	form.append("rnd",Date.now());
	form.append("roomid",room_id);
	form.append("csrf",csrf);
	form.append("csrf_token",csrf);
	return form;
}