Greasy Fork

Greasy Fork is available in English.

Twitter: GET THE BIRD BACK ENFORCE 還我鳥來!!!

替換會經常看到的那個沒設計感的東西...我會不會太閒?

当前为 2023-08-25 提交的版本,查看 最新版本

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Greasemonkey 油猴子Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Userscripts ,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展后才能安装此脚本。

(我已经安装了用户脚本管理器,让我安装!)

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

(我已经安装了用户样式管理器,让我安装!)

// ==UserScript==
// @name         Twitter: GET THE BIRD BACK ENFORCE 還我鳥來!!!
// @namespace    https://www.plurk.com/SpyMomiji
// @version      1.1.2
// @description  替換會經常看到的那個沒設計感的東西...我會不會太閒?
// @author       SpyMomiji
// @match        https://twitter.com/*
// @icon         https://images.plurk.com/4ijevWqGhP9oHMmhaFCS5y.png
// @run-at       document-start
// @noframes     true
// @grant        none
// @license      MIT
// ==/UserScript==

(function() {

    //推特原本的 logo(svg) 與顏色
    var orig_svg = "M23.643 4.937c-.835.37-1.732.62-2.675.733.962-.576 1.7-1.49 2.048-2.578-.9.534-1.897.922-2.958 1.13-.85-.904-2.06-1.47-3.4-1.47-2.572 0-4.658 2.086-4.658 4.66 0 .364.042.718.12 1.06-3.873-.195-7.304-2.05-9.602-4.868-.4.69-.63 1.49-.63 2.342 0 1.616.823 3.043 2.072 3.878-.764-.025-1.482-.234-2.11-.583v.06c0 2.257 1.605 4.14 3.737 4.568-.392.106-.803.162-1.227.162-.3 0-.593-.028-.877-.082.593 1.85 2.313 3.198 4.352 3.234-1.595 1.25-3.604 1.995-5.786 1.995-.376 0-.747-.022-1.112-.065 2.062 1.323 4.51 2.093 7.14 2.093 8.57 0 13.255-7.098 13.255-13.254 0-.2-.005-.402-.014-.602.91-.658 1.7-1.477 2.323-2.41z";
	var orig_color = 'rgb(29, 155, 240)';

    //分頁標籤的 favicon
	var orig_favicon = "data:image/x-icon;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAJkSURBVHgB7VZBbtpQEH3zIW0WVYuXVaH4Bs0NSk4AOUFhEarskhMknIDsqkKlcIT0BNAT1D1B3ZJK3dmVuirwp/MhVmzAxiagKBJv9+ePZ97M/JkxsMMODwzChlD84FWQp3MxeCDHAhiumB+MJrr1+8Ryw3p/9+H4DctfIPCq49Xlw8Kv99YlMuB19885gy/i7llziwGfFFWJyR02XzSCuwiBUse7BlFVaz5LS8KQVkRXaXRJsqImfDjKSZBNyzEyFWFKVJ4KFbWLElUao6KbSk8i9TXgTPaorxTskPwOxa7/9baGt4zg8oQbNyfWYJlRU0/KUx9ZwNwYNq1ecFRzl18QpW0bB0Ks//KjV1uwlbuLJA3GxEdh5wb5yGEPl3qMd2xecYQHKnlFlVLX95kxYCFKGg5IlU2a0uLpCM68LEJA+sJ/Dm6Jy3aMjQIRakRUm+UuvfOp/X34iQSejeFo0Hdx4optG5uFH/R+GHNvANcm3VtwLs+Lvy2TRwhIOnrYHhysIuDKcCDwGbYAjglOzQt+HssElF6dvoNNOZeuCSbfSgIGMjILMo4/ExZf7TqghNLmlwm1gpSC2tmaLAZMvWGz0Iu7XpqBm2NrQNN5cD+Y5ZOTdZyok3RZMusZOJUN+QZrQFb0oQkG6xIIYHe8A03Unx/Ryd6jS2ctAsbxmFRVynGKlM5na5ePVkUe0p+h9MmraS2zXqYgmSWjOPtElHbLTVB3Q79gqQlMScxqXpeav0UWiGMmXKSNOpZAAPvKs/U/1MRoxRxl+5WD+psUy2D5IdmRVoWjnqDnLlkyO+zwaPAf1zXwZL751PUAAAAASUVORK5CYII=";

    var triggerOnAnimationFrame = ( window.requestAnimationFrame || window.webkitRequestAnimationFrame );

	class GeneralInterval{
		constructor( func, options ){

			options = {
				interval: 1,
				...(options??{})
			};

			var intervalSetting = (!triggerOnAnimationFrame && !options.interval)? 1 : options.interval;
			func = func.bind(this, options.attr );

			this.enable = true;
			this.attr = options.attr;

			if(intervalSetting){
				this.interval = setInterval( func, intervalSetting );
				func();
			} else {
				var loop = (function(enable){
					func();
					this.enable && triggerOnAnimationFrame( loop );
				}).bind(this);
				loop();
			}

		}

		stop(){
			this.enable = false;
			clearInterval(this.interval);
		}

	}


	//探測 react 載入狀態
	var icon_stage_1 = ()=> new GeneralInterval( function(){
		if( document.getElementsByTagName('main').length || document.getElementsByTagName('header').length )
			icon_stage_2() && this.stop();
	}, {interval: 0 })


    //處理掉左上角的 X
	var icon_stage_2 = ()=> new GeneralInterval( function(checked){
		var target = Array.from(document.getElementsByTagName("a"))
		.filter( i=>
			!checked.has(i) && checked.add(i) &&
			i.role=="link"&&
			( i.ariaLabel=="X" || i.ariaLabel=="Twitter" )&&
			( i.href=="https://twitter.com/home" || i.href=="https://twitter.com/" || i.href=="https://x.com/home" || i.href=="https://x.com/" )
		)[0];

		if(!( target && (target.ariaLabel = "Twitter") && (target = target.getElementsByTagName("svg")[0]) ))return;

		target.getElementsByTagName('path')[0].setAttribute('d',orig_svg);
		target.style.color = orig_color;
		this.stop();
	}, {attr: new Set(), interval: 0 })

	icon_stage_1();


	//處理掉載入畫面的 X
	new GeneralInterval( function(){
		var target = document.getElementById("react-root");
		if(!( target && (target = target.getElementsByTagName("svg")[0]) ))
			return document.readyState == 'complete' && this.stop();

		target.getElementsByTagName('path')[0].setAttribute('d',orig_svg);
		target.style.color = orig_color;
		this.stop();
	})


	//處理掉分頁標籤的 X
	new GeneralInterval( function(checked){
		var target = Array.from(document.getElementsByTagName("link")).filter( i=>
			!checked.has(i) && checked.add(i) &&
			i.rel=="shortcut icon"
		)[0];

		if(!( target ))
			return document.readyState == 'complete' && this.stop();

		target.href = orig_favicon;
		this.stop()
	}, {attr: new Set() })


	//處理掉分頁標籤名稱中的 X
	new GeneralInterval( function(){
		if( this.pageTitle == document.title ) return;
		if( document.title == 'X' ) return this.pageTitle = document.title = 'Twitter';
		var match = document.title.match(/(.*)\/ X$/);
		match&&(this.pageTitle = document.title = match[1] + '/ Twitter');
	}, {interval: 100 })


})();