[YouTube] Auto add Text in ChatBox

Auto add Text in ChatBox.

目前为 2022-11-23 提交的版本。查看 最新版本

此脚本不应直接安装,它是一个供其他脚本使用的外部库。如果您需要使用该库,请在脚本元属性加入:// @require https://update.cn-greasyfork.org/scripts/455302/1120373/%5BYouTube%5D%20Auto%20add%20Text%20in%20ChatBox.js

// ==UserScript==
// @name         [YouTube] Auto add Text in ChatBox
// @namespace    http://tampermonkey.net/
// @version      0.1
// @description  Auto add Text in ChatBox.
// @author       You
// @include        https://www.youtube.com/watch*
// @include        https://www.youtube.com/live_chat*
// @icon         data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==
// @grant        none
// ==/UserScript==

const player = document.getElementById("movie_player")

/**
*@Description チャットエリアが表示された後にチャットエリアのiframe内にkeydownイベントを追加する。
*/
let getChatInterval = setTimeout( ()=> {
	let chat = document.getElementById("chatframe")

	if(chat != null && chat.contentWindow.document.querySelector('#input') != null || document.querySelector('#input') != null){
		if(document.querySelector('#input') != null){
			chat = document.querySelector('#input')
		}else{
			chat = chat.contentWindow
		}
		addText("#")

		chat.addEventListener("keydown", e => {

			if(e.key == "Enter"){

				//フォーカスが当てられている要素のIDを取得
				let activeElementId

				//Elementsタブからiframeタグ内を参照している場合はwindowの参照先もiframe内になるので判定する。
				if(document.getElementById("chatframe") != null){
					activeElementId = document.getElementById("chatframe").contentWindow.document.activeElement.id
				}else{
					activeElementId = document.activeElement.id
				}

				//テキストボックスに指定した文字を追加。
				if(activeElementId == "input"){
					setTimeout( () => addText("#"))
				}
			}
		})

	}
},5000)

/**
 *@Description キャレットの位置を文末に変更
*/
function addText(text){

	//Elementsタブからiframeタグ内を参照している場合はwindowの参照先もiframe内になるので判定する。
	if(document.getElementById("chatframe") != null){
		const chat = document.getElementById("chatframe").contentWindow
		chat.document.querySelector('#input').setAttribute("has-text" , "")
		chat.document.querySelector('#input').querySelector('#input').setAttribute("aria-invalid" , "")
		chat.document.querySelector('#input').querySelector('#input').textContent = text
		moveEndCaret(chat.document.querySelector('#input').querySelector('#input') , chat)

	}else{
		document.querySelector('#input').setAttribute("has-text" , "")
		document.querySelector('#input').querySelector('#input').setAttribute("aria-invalid" , "")
		document.querySelector('#input').querySelector('#input').textContent = text
		moveEndCaret(document.querySelector('#input').querySelector('#input'))

	}
}

/**
 *@Description キャレットの位置を文末に変更
*/
function moveEndCaret(textBox , iframewindow = window){
	const selection = iframewindow.getSelection()
	const range = document.createRange()
	const offset = textBox.innerText.length
	range.setStart(textBox.firstChild, offset)
	range.setEnd(textBox.firstChild, offset)
	selection.removeAllRanges()
	selection.addRange(range)
}