// ==UserScript==
// @name 太平洋电脑网头像上传助手
// @author greasepig
// @description 可上传GIF动态图片
// @version 1.0.1
// @namespace https://greasyfork.org/users/2620-greasepig
// @include http://my.pconline.com.cn/setting/face.jsp
// @grant GM_xmlhttpRequest
// @run-at document-end
// @downloadURL https://update.greasyfork.icu/scripts/3052/%E5%A4%AA%E5%B9%B3%E6%B4%8B%E7%94%B5%E8%84%91%E7%BD%91%E5%A4%B4%E5%83%8F%E4%B8%8A%E4%BC%A0%E5%8A%A9%E6%89%8B.user.js
// @updateURL https://update.greasyfork.icu/scripts/3052/%E5%A4%AA%E5%B9%B3%E6%B4%8B%E7%94%B5%E8%84%91%E7%BD%91%E5%A4%B4%E5%83%8F%E4%B8%8A%E4%BC%A0%E5%8A%A9%E6%89%8B.meta.js
// ==/UserScript==
function _xmlhttpRequest(details) {
function setupEvent(xhr, url, eventName, callback) {
xhr[eventName] = function () {
var isComplete = xhr.readyState == 4;
var responseState = {
responseText: xhr.responseText,
readyState: xhr.readyState,
responseHeaders: isComplete ? xhr.getAllResponseHeaders() : "",
status: isComplete ? xhr.status : 0,
statusText: isComplete ? xhr.statusText : "",
finalUrl: isComplete ? url : ""
};
callback(responseState);
};
}
var xhr = new XMLHttpRequest();
var eventNames = ["onload", "onerror", "onreadystatechange"];
for (var i = 0; i < eventNames.length; i++ ) {
var eventName = eventNames[i];
if (eventName in details) {
setupEvent(xhr, details.url, eventName, details[eventName]);
}
}
if (details.upload) {
for (var eventName in details.upload) {
xhr.upload[eventName] = details.upload[eventName];
}
}
xhr.open(details.method, details.url);
if (details.overrideMimeType) {
xhr.overrideMimeType(details.overrideMimeType);
}
if (details.headers) {
for (var header in details.headers) {
xhr.setRequestHeader(header, details.headers[header]);
}
}
xhr.send(details.data ? details.data : null);
}
if (navigator.userAgent.indexOf('Firefox') == -1)
GM_xmlhttpRequest = _xmlhttpRequest;
function $(id) {
return document.getElementById(id);
}
function getCookie(name){
var arr, reg = new RegExp("(^| )" + name + "=([^;]*)(;|$)");
if (arr = document.cookie.match(reg)) return unescape(arr[2]);
else return null;
}
var session_id = getCookie('common_session_id');
var uploadUrl = 'http://upc.pconline.com.cn/upload_head_stream_flash.jsp?action=upload&application=usercenter&common_session_id=' + session_id;
var commitUrl = 'http://upc.pconline.com.cn/upload_head_stream_flash.jsp?action=commit&application=usercenter&common_session_id=' + session_id;
var out = document.createElement('div');
out.innerHTML = '
';
var formDiv = $('formDiv');
formDiv.insertBefore(out, formDiv.firstChild);
var btnSubmit = $('submit');
var statusIcon = $('status');
var uploadProgress = $('progress');
var avatars = {
'150x150': {img: $('img_150x150'), queryStr: '&width=150&height=150', binStr: null, uploaded: false},
'120x120': {img: $('img_120x120'), queryStr: '&width=120&height=120', binStr: null, uploaded: false},
'100x100': {img: $('img_100x100'), queryStr: '&width=100&height=100', binStr: null, uploaded: false},
'70x70': {img: $('img_70x70'), queryStr: '&width=70&height=70', binStr: null, uploaded: false},
'50x50': {img: $('img_50x50'), queryStr: '&width=50&height=50', binStr: null, uploaded: false},
'20x20': {img: $('img_20x20'), queryStr: '&width=20&height=20', binStr: null, uploaded: false}
};
var uploadNow = '';
function readFile (onloadFunc) {
var reader = new FileReader();
reader.onload = onloadFunc;
return reader;
}
function showImage(size, file){
readFile(function(e){
avatars[size].img.src = e.target.result;
}).readAsDataURL(file);
}
function getImageBinArray(size, file){
readFile(function(e){
avatars[size].binStr = new Uint8Array(e.target.result);
avatars[size].uploaded = false;
btnSubmit.removeAttribute('disabled');
}).readAsArrayBuffer(file);
}
function handleFile(size, file){
var imageType = /image\/.*/;
if (!file.type.match(imageType)) {
alert('不是有效的图像文件!');
return;
}
if (file.size > 1048576) {
alert('文件大小必须在1M(1048576字节)以内!');
return;
}
getImageBinArray(size, file);
showImage(size, file);
}
function bindOpenFile(size) {
var handleBox = $('avatar_' + size);
handleBox.addEventListener('click', function(e){
var file = document.createElement('input');
file.type = 'file';
file.accept = 'image/*';
file.addEventListener('change', function(e){
handleFile(size, e.target.files[0]);
});
file.click();
}, false);
}
function onUploadHandler(response) {
uploadProgress.textContent = '正在上传 ' + uploadNow + ': 100%';
if (response.status == 200 && response.responseText.indexOf('"retCode":0') >= 0) {
avatars[uploadNow].uploaded = true;
startUpload();
} else {
onerrorHandler(response);
}
}
function onerrorHandler(e) {
uploadProgress.textContent = e.statusText;
statusIcon.className = 'error';
onloadendHandler();
}
function onloadendHandler() {
btnSubmit.removeAttribute('disabled');
}
function uploadOnprogressHandler(e) {
if (e.lengthComputable) {
uploadProgress.textContent = '正在上传 ' + uploadNow + ': ' + Math.round(100 * e.loaded / e.total) + '%';
}
}
function onCommitHandler(response) {
if (response.status == 200 && response.responseText.indexOf('"retCode":0') >= 0) {
uploadProgress.textContent = '完成';
statusIcon.className = 'success';
// onloadendHandler();
} else {
onerrorHandler(response);
}
}
function uploadCommit() {
uploadProgress.textContent = '正在设置头像';
GM_xmlhttpRequest({
method: 'GET',
url: commitUrl,
onload: onCommitHandler,
onerror: onerrorHandler
});
}
function uploadAvatar(size) {
uploadNow = size;
uploadProgress.textContent = '正在上传 ' + size;
GM_xmlhttpRequest({
method: 'POST',
url: uploadUrl + avatars[size].queryStr,
data: avatars[size].binStr,
headers: {'Content-Type': 'application/octet-stream'},
onload: onUploadHandler,
onerror: onerrorHandler,
upload: {onprogress: uploadOnprogressHandler}
});
}
function startUpload() {
var size;
for (size in avatars) {
if (avatars[size].binStr != null && avatars[size].uploaded == false)
return uploadAvatar(size);
}
uploadCommit();
}
function upload() {
btnSubmit.setAttribute('disabled', 'disabled');
statusIcon.style.display = 'block';
statusIcon.className = 'loading';
startUpload();
}
for (var size in avatars) {
bindOpenFile(size);
}
btnSubmit.addEventListener('click', upload);