Discuz论坛头像上传助手

突破图片尺寸、GIF帧数限制,无损上传

目前為 2015-08-25 提交的版本,檢視 最新版本

// ==UserScript==
// @name Discuz论坛头像上传助手
// @author greasepig & 枫谷剑仙
// @description 突破图片尺寸、GIF帧数限制,无损上传
// @version 1.1.0
// @namespace http://www.mapaler.com/
// @include http://*/home.php?mod=spacecp&ac=avatar*
// @include http://*/admin.php?m=user&a=login*
// @run-at document-end
// @grant none
// ==/UserScript==

(function(){
	var mycamera, action, query, ucpage;
	var CamRequestName = "camsrc"; //传递url参数用参数名
	var img_Background = "data:image/gif;base64,R0lGODlhEAAQAIAAAN/f3////yH5BAAHAP8ALAAAAAAQABAAAAIfhG+hq4jM3IFLJhoswNly/XkcBpIiVaInlLJr9FZWAQA7";
	var img_AddImg = "data:image/gif;base64,R0lGODlhIAAgAJEAAFNTYr/P/////wAAACH5BAEHAAIALAAAAAAgACAAAAJhlI8Sy5sPX2uxwskAsFzhoHXWB25iRIbn9alrkpovEs9wK9se5qLkD3TsgkTKsFjUIJclJlLpJEKjwCm1JtBot7GtV/XVdsNaDlZ3zORsZ12bjUMb3jP6y77Cv8jyA99SAAA7";
	var img_Loading = "data:image/gif;base64,R0lGODlhKAAoAIAAAGNjc////yH/C05FVFNDQVBFMi4wAwEAAAAh+QQJBwABACwJAAUAFgAIAAACGIyPAMidupw0ME6pbsj6bdhRFRhWX3hkBQAh+QQJBwABACwNAAYAFQALAAACGwwQqXm71xxEzsA6K6OY6w+G4kiWm6lkqLoiBQAh+QQJBwABACwSAAUAEQARAAACHQwQqbt3DJNDEb6KLc3S8X594UeW5omWYzaRrYsUACH5BAkHAAEALBcABgALABUAAAIbDBCpebfa0GNy2ouzdbt1PoHaSJZmd0Vf9TgFACH5BAkHAAEALBsACQAIABYAAAIaDBCZd2rsXpy02hubY0jx3GHiuIUL5KFpVAAAIfkECQcAAQAsFwANAAsAFQAAAhyMbwCIqpwcjLPai7Nmb7oFfVW3lQ0YSinJoUwBACH5BAkHAAEALBIAEgARABEAAAIcjI8IkH27XINMpmiz3rx7jW0UN5KVcoKQGapdAQAh+QQJBwABACwNABcAFQALAAACG4yPeQDqydibsc0nr968o6yAUBSSpWhUmFU+BQAh+QQJBwABACwJABsAFgAIAAACFwwQqcuGd5p0EM5W3ZVx981ZICaOzCcVACH5BAkHAAEALAYAFwAVAAsAAAIcDBCpy3rX4npIWmiz3rz7WTWY+JAjeCaUlDpIAQAh+QQJBwABACwFABIAEQARAAACHQwQqbt3DJNDEb6Ks968e31tEzeS1GedoGOGa1AAACH5BAkHAAEALAYADQALABUAAAIcDBCpebfa0GNy2ouz3tnZ+DWXx5XmQ6LiBIZBAQAh+QQJBwABACwFAAkACAAWAAACGIwNcJh67V5ctNqLE4WL94mF4vhtzaeVBQAh+QQJBwABACwGAAYACwAVAAACHIxvAIiqnByMs9ob3nQL8qph4kiWYOdJaciwSAEAIfkECQcAAQAsBQAFABEAEQAAAh6MjwiQfbtcg0ymeKt9cHPsBWBIluaJTppHka27bgUAIfkECQcAAQAsBgAGABUACwAAAhuMbwCIyqcci+tRG1+qWPsPhqInjVBmbmW6mgUAOw==";
	var img_Success = "data:image/gif;base64,R0lGODlhKAAoAIAAAAD/AP///yH5BAEHAAEALAAAAAAoACgAAAJtjI+py+0Po5y0gltzuFxPDnoQGIoO2ZkMiqkL27oJLCt0PbM4cu9bvwO+YhKhrRSBAU6ooo7ZfBiPz8aUGh1mR9Vcl7s9XK3CMTSr9KR/YYvyq3m343Kiqr6s1X1vn2HtBxeE5CdmV4iYqKhQAAA7";
	var img_error = "data:image/gif;base64,R0lGODlhKAAoAIAAAP8AAP///yH5BAEHAAEALAAAAAAoACgAAAJ8jI+py+0Po5wJWLoscPri021ZKGJkiZxopI7npK5gC8Uc3diP7pISn8KxhAHgD2eEtZKUGPFTdHagPSY1ar1ifdoqtzuTgg3Sabcc0tqyO+SzRmQrmPLwd/6u5O3p3D744qWhFKh3N3RIlohohjdI1cfweDU5ZnmJmYlZAAA7"
	mycamera = document.getElementsByName('mycamera')[0];
	
	var out = document.createElement('div');
	out.id = "discuz-avatar";
	var domHTML = '';
	domHTML +=	'<style type="text/css">';
	domHTML +=	'#discuz-avatar {width:448px; padding:20px 0px; border:1px solid #CCC; background-color: white; text-align:center;}';
	domHTML +=	'#discuz-avatar td {padding:10px; vertical-align: top; text-align: center;}';
	domHTML +=	'#discuz-avatar td span {display:block; padding:10px 0;}';
	domHTML +=	'.img_div {display:table-cell; vertical-align: middle; border: 1px solid #CCC; cursor: pointer; background: url("'+img_Background+'");}';
	domHTML +=	'#big {width:200px; height:250px;}';
	domHTML +=	'#middle {width:120px; height:160px;}';
	domHTML +=	'#small {width:48px; height:48px;}';
	domHTML +=	'#img_b {max-width: 200px; max-height: 250px;}';
	domHTML +=	'#img_m {max-width: 120px; max-height: 160px;}';
	domHTML +=	'#img_s {max-width: 48px; max-height: 48px;}';
	domHTML +=	'#submit {width:60px;}';
	domHTML +=	'#status {display:none; width:40px; height:40px; margin:0px auto;}';
	domHTML +=	'#status.loading {background: url('+img_Loading+') no-repeat center;}';
	domHTML +=	'#status.success {background: url('+img_Success+') no-repeat center;}';
	domHTML +=	'#status.error {background: url('+img_error+') no-repeat center;}';
	domHTML +=	'#progress {padding: 5px;}';
	domHTML +=	'</style>';
	domHTML +=	'<h3>Discuz论坛头像上传助手</h3><table><tr><td><div id="big" class="img_div"><img id="img_b" src=""></div><span>大头像</span></td><td><div id="middle" class="img_div"><img id="img_m" src=""></div><span>中头像</span></td><td><div id="small" class="img_div"><img id="img_s" src=""></div><span>小头像</span></td></tr></table><div id="status"></div><div id="progress"></div><input id="submit" type="button" value="提交" disabled="disabled">';
	out.innerHTML = domHTML;
		
	if (mycamera)
	{
		ucpage = false;
		host = mycamera.src.match(/^https?:\/\/([^\/]+)\/.*/);
		if (document.domain == host[1])
		{
			query = mycamera.src.match(/^(.*)images\/camera\.swf.*(&appid=\d+).*(&input=.+&agent=[^&]+)/);
			action = query[1] + 'index.php?m=user&inajax=1&a=rectavatar' + query[2] + query[3] + '&avatartype=virtual';
			mycamera.parentNode.appendChild(out);
		}
		else
		{
			var out = document.createElement('div');
			var outuclink = document.createElement('a');
			outuclink.href = "http://"+host[1]+"/admin.php?m=user&a=login&iframe=&sid=&"+CamRequestName+"=" + escape(mycamera.src);
			outuclink.innerHTML = "UCenter页面链接";
			outuclink.target = "_blank"
			
			var outcamerasrc = document.createElement('input');
			outcamerasrc.id = "camera-src";
			outcamerasrc.type = "text";
			outcamerasrc.className = "px";
			outcamerasrc.value = mycamera.src;
			
			var outcamerasrclabel = document.createElement('label');
			outcamerasrclabel.innerHTML = "上传头像Flash链接";
			outcamerasrclabel.appendChild(outcamerasrc);
			
			out.innerHTML = "本站UC域名与论坛不一致,因为跨域安全问题请到UCenter页面输入"
			out.appendChild(document.createElement('br'));
			out.appendChild(outuclink);
			out.appendChild(document.createElement('br'));
			out.appendChild(outcamerasrclabel);
			mycamera.parentNode.appendChild(out);
		}
	}
	else
	{
		ucpage = true;
		var Request = new Object(); //获取网页参数
		Request = GetRequest();
		mycamera = document.getElementById("loginform");
		if (mycamera == null) return;
		mycamera.parentNode.appendChild(out);
		
		var outcamerasrc = document.createElement('input');
		outcamerasrc.id = "camera-src";
		outcamerasrc.type = "text";
		outcamerasrc.className = "px";
		outcamerasrc.value = unescape(Request[CamRequestName]); //获取传递的参数
		
		var outcamerasrclabel = document.createElement('label');
		outcamerasrclabel.innerHTML = "填写上传Flash链接";
		outcamerasrclabel.appendChild(outcamerasrc);
		
		var outcameradiv = document.createElement('div');
		outcameradiv.appendChild(outcamerasrclabel);
		
		var discuz_avatar = document.getElementById("discuz-avatar");
		discuz_avatar.insertBefore(outcameradiv,discuz_avatar.lastChild);
	}

	var btnSubmit = document.getElementById("submit");
	var statusIcon = document.getElementById("status");
	var uploadProgress = document.getElementById("progress");
	var avatars = {
		big: {img: document.getElementById("img_b"), hex: null},
		middle: {img: document.getElementById("img_m"), hex: null},
		small: {img: document.getElementById("img_s"), hex: null}
	};
	avatars.big.img.src = img_AddImg;
	avatars.middle.img.src = img_AddImg;
	avatars.small.img.src = img_AddImg;
	function GetRequest() {
		var url = location.search; //获取url中"?"符后的字串
		var theRequest = new Object();
		if (url.indexOf("?") != -1)
		{
			var str = url.substr(1);
			strs = str.split("&");
			for(var i = 0; i < strs.length; i ++) 
			{
				theRequest[strs[i].split("=")[0]]=(strs[i].split("=")[1]);
			}
		}
		return theRequest;
	}
	
	function readFile (onloadFunc) {
		var reader = new FileReader();
		reader.onload = onloadFunc;
		return reader;
	}

	function showImage(target, file){
		readFile(function(e){
			avatars[target].img.src = e.target.result;
		}).readAsDataURL(file);
	}

	function byte2hex(bytes) {
		var uint8Array = new Uint8Array(bytes);
		var hex = '';
		for (var i = 0; i < uint8Array.length; i++) {
			hex += uint8Array[i] < 16 ? '0' + uint8Array[i].toString(16) : uint8Array[i].toString(16);
		}
		return hex.toUpperCase();
	}

	function getImageHexString(target, file){
		readFile(function(e){
			avatars[target].hex = byte2hex(e.target.result);
			if (avatars.big.hex && avatars.middle.hex && avatars.small.hex) {
				btnSubmit.removeAttribute("disabled");
			}
		}).readAsArrayBuffer(file);
	}

	function handleFile(target, file){
		var imageType = /image\/.*/;
		if (!file.type.match(imageType)) {
			alert("不是有效的图像文件!");
			return;
		}
		if (file.size > 2097152) {
			alert("文件大小必须在2M以内!");
			return;
		}
		avatars[target].img.src = "http://bcs.duapp.com/user-img/discuz-avatar/loading.gif";
		setTimeout(function(){
			getImageHexString(target, file);
			showImage(target, file);
		}, 100);
	}

	function bindOpenFile(id) {
		var handleBox = document.getElementById(id);
		handleBox.addEventListener("click", function(e){
			var file = document.createElement("input");
			file.type = "file";
			file.addEventListener("change", function(e){
				handleFile(id, e.target.files[0]);
			});
			file.click();
		}, false);
	}

	function gm_post(url, post) {
		GM_xmlhttpRequest({
			method: "POST",
			url: url,
			data: post,
			headers: {"Content-Type": "application/x-www-form-urlencoded"},
			onload: onloadHandler,
			onerror: onerrorHandler,
			upload: {onprogress: uploadOnprogressHandler}
		});
	}

	function ajaxPost(url, post) {
		var xhr = new XMLHttpRequest();
		// xhr.onload = onloadHandler;
		xhr.onload = function(e) {onloadHandler(e.target)};
		xhr.onerror = onerrorHandler;
		// xhr.onloadend = onloadendHandler;
		xhr.upload.onprogress = uploadOnprogressHandler;
		xhr.open("POST", url, true);
		xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
		xhr.send(post);
	}

	function onloadHandler(response) {
		uploadProgress.textContent = "100%";
		var xml = (new DOMParser()).parseFromString(response.responseText, "text/xml");
		// unsafeWindow.console.log(xml);
		if (xml) {
			var success = xml.querySelector('face');
			if (success != null && success.getAttribute("success") == 1) {
				statusIcon.className = "success";
			} else {
				statusIcon.className = "error";
				var message = xml.querySelector('message');
				if (message)
					uploadProgress.textContent = message.getAttribute('type') + ': ' + message.getAttribute('value');
				else uploadProgress.textContent = response.responseText;
			}
		} else {
			statusIcon.className = "error";
			uploadProgress.textContent = 'error: no responseXML';
		}
		onloadendHandler();
	}

	function onerrorHandler(e) {
		statusIcon.className = "error";
		onloadendHandler();
	}

	function onloadendHandler(e) {
		btnSubmit.removeAttribute("disabled");
	}

	function uploadOnprogressHandler(e) {
		if (e.lengthComputable) {
			uploadProgress.textContent = Math.round(100 * e.loaded / e.total) + "%";
		}
	}

	function upload() {
		if (ucpage)
		{
			mycamera.src = document.getElementById("camera-src").value;
			query = mycamera.src.match(/^(.*)images\/camera\.swf.*(&appid=\d+).*(&input=.+&agent=[^&]+)/);
			action = query[1] + 'index.php?m=user&inajax=1&a=rectavatar' + query[2] + query[3] + '&avatartype=virtual';
		}
		else
		{
			query = mycamera.src.match(/^(.*)images\/camera\.swf.*(&appid=\d+).*(&input=.+&agent=[^&]+)/);
			action = query[1] + 'index.php?m=user&inajax=1&a=rectavatar' + query[2] + query[3] + '&avatartype=virtual';
		}
		var post = "avatar1=" + avatars.big.hex + "&avatar2=" + avatars.middle.hex + "&avatar3=" + avatars.small.hex + "&urlReaderTS=" + Date.now();
		btnSubmit.setAttribute("disabled", "disabled");
		statusIcon.style.display = "block";
		statusIcon.className = "loading";
		//if (navigator.userAgent.indexOf('Firefox') > 0) 
		//	gm_post(action, post);
		//else
			ajaxPost(action, post);
	}

	bindOpenFile("big");
	bindOpenFile("middle");
	bindOpenFile("small");
	btnSubmit.addEventListener("click", upload);
})();

QingJ © 2025

镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址