// ==UserScript==
// @name tieba_hide_someone
// @description 屏蔽某些人的帖子
// @include http://tieba.baidu.com/*
// @exclude http://tieba.baidu.com/tb*
// @exclude http://tieba.baidu.com/mo/*
// @icon http://imgsrc.baidu.com/forum/pic/item/6fd108fb43166d229cb84fac452309f79152d2e2.png
// @author congxz6688
// @version 2014.8.14.2
// @grant GM_getValue
// @grant GM_setValue
// @grant GM_registerMenuCommand
// @namespace https://greasyfork.org/scripts/148
// ==/UserScript==
//脚本双存储相互恢复
if (!localStorage.tiebaHideBlackList && GM_getValue("tiebaHideBlackList", "") != "") {
localStorage.tiebaHideBlackList = GM_getValue("tiebaHideBlackList");
}
if (GM_getValue("tiebaHideBlackList", "") == "" && localStorage.tiebaHideBlackList) {
GM_setValue("tiebaHideBlackList", localStorage.tiebaHideBlackList);
}
if (!localStorage.whiteUserIds && GM_getValue("whiteUserIds", "") != "") {
localStorage.whiteUserIds = GM_getValue("whiteUserIds");
}
if (GM_getValue("whiteUserIds", "") == "" && localStorage.whiteUserIds) {
GM_setValue("whiteUserIds", localStorage.whiteUserIds);
}
//从存储的数据中提取黑白名单
var getBlackList = GM_getValue("tiebaHideBlackList", "") != "" ? GM_getValue("tiebaHideBlackList").split(",") : [];
var whiteUsIds = GM_getValue("whiteUserIds", "") != "" ? GM_getValue("whiteUserIds").split(",") : [];
//今天的日期
var yuy = new Date();
var fulltime = yuy.toLocaleDateString();
var $ = unsafeWindow.$;
//当前日期、用户、已屏蔽之数据
var userData = unsafeWindow.PageData;
var userName = userData.user.name ? userData.user.name : userData.user.user_name;
var HideToday = JSON.parse((localStorage["HideToday"]) ? localStorage["HideToday"] : "{}");
HideToday[userName] = HideToday[userName] ? HideToday[userName] : [];
function addStyle(css) {
document.head.appendChild(document.createElement("style")).textContent = css;
}
function addNodeInsertedListener(elCssPath, handler, executeOnce, noStyle) {
var animName = "anilanim",
prefixList = ["-o-", "-ms-", "-khtml-", "-moz-", "-webkit-", ""],
eventTypeList = ["animationstart", "webkitAnimationStart", "MSAnimationStart", "oAnimationStart"],
forEach = function (array, func) {
for (var i = 0, l = array.length; i < l; i++) {
func(array[i]);
}
};
if (!noStyle) {
var css = elCssPath + "{",
css2 = "";
forEach(prefixList, function (prefix) {
css += prefix + "animation-duration:.001s;" + prefix + "animation-name:" + animName + ";";
css2 += "@" + prefix + "keyframes " + animName + "{from{opacity:.9;}to{opacity:1;}}";
});
css += "}" + css2;
addStyle(css);
}
if (handler) {
var bindedFunc = function (e) {
var els = document.querySelectorAll(elCssPath),
tar = e.target,
match = false;
if (els.length !== 0) {
forEach(els, function (el) {
if (tar === el) {
if (executeOnce) {
removeNodeInsertedListener(bindedFunc);
}
handler.call(tar, e);
return;
}
});
}
};
forEach(eventTypeList, function (eventType) {
document.addEventListener(eventType, bindedFunc, false);
});
return bindedFunc;
}
}
//移除精确监听
function removeNodeInsertedListener(bindedFunc) {
var eventTypeList = ["animationstart", "webkitAnimationStart", "MSAnimationStart", "oAnimationStart"],
forEach = function (array, func) {
for (var i = 0, l = array.length; i < l; i++) {
func(array[i]);
}
};
forEach(eventTypeList, function (eventType) {
document.removeEventListener(eventType, bindedFunc, false);
});
}
//逐一屏蔽函数
function goHideOneByOne(nn, lp) {
if (whiteUsIds.indexOf(userName) == -1) {
if (HideToday.date != fulltime) {
HideToday = {};
HideToday.date = fulltime;
HideToday[userName] = [];
}
getHiddenList = (HideToday[userName]) ? HideToday[userName] : [];
if (getHiddenList.indexOf(getBlackList[nn]) == -1) {
var postData = encodeURI("type=1&hide_un=" + getBlackList[nn] + "&ie=utf-8");
var urll = "http://tieba.baidu.com/tphide/add";
onebyone = new XMLHttpRequest();
onebyone.open("POST", urll, true);
onebyone.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
onebyone.setRequestHeader("Content-length", postData.length);
onebyone.setRequestHeader("Connection", "close");
onebyone.send(postData);
onebyone.onreadystatechange = function () {
if (onebyone.readyState == 4) {
if (onebyone.status == 200) {
var reTextTxt = JSON.parse(onebyone.responseText);
console.log(fulltime + " 屏蔽 " + getBlackList[nn] + " " + reTextTxt.msg);
ssw = HideToday[userName].push(getBlackList[nn]);
if (nn == lp) {
HideToday[userName] = getBlackList;
localStorage["HideToday"] = JSON.stringify(HideToday);
console.log(fulltime + " 眼中钉全部屏蔽完毕!");
} else {
localStorage["HideToday"] = JSON.stringify(HideToday);
ns = nn + 1;
setTimeout(function () {
goHideOneByOne(ns, lp); //自调用,顺序循环
}, 1000);
}
}
}
}
} else {
console.log(getBlackList[nn] + " 今天已经屏蔽过了。");
if (nn == lp) {
HideToday[userName] = getBlackList;
localStorage["HideToday"] = JSON.stringify(HideToday);
console.log(fulltime + " 眼中钉全部屏蔽完毕!");
} else {
ns = nn + 1;
goHideOneByOne(ns, lp); //自调用,顺序循环
}
}
}
}
//以用户脚本命令输入黑名单
function hideSomeOneBlackSet() {
if (getBlackList.toString() == "") {
mess = "请输入屏蔽黑名单,以小写的逗号相互隔开,可带小写空格,或者是小写的引号:";
caseShow = "坏人甲,坏人乙";
} else {
mess = "请修改屏蔽黑名单,以小写的逗号相互隔开,可带小写空格,或者是小写的引号:";
caseShow = getBlackList.toString();
}
var getSetData = prompt(mess, caseShow);
getBlackList = (getSetData == "坏人甲,坏人乙" || getSetData == "") ? [] : getSetData.replace(/,/g, ",").replace(/\s/g, "").replace(/["']/g, "").split(",");
localStorage.tiebaHideBlackList = getBlackList.toString();
GM_setValue("tiebaHideBlackList", getBlackList.toString());
goHideOneByOne(0, getBlackList.length - 1);
}
//以用户脚本命令输入马甲白名单
function hideSomeOneWhiteSet() {
if (whiteUsIds.toString() == "") {
mess = "请输入不执行本脚本的小号名单,以小写逗号相分隔,可带小写空格或小写引号,比如\r\n文科980195412是我的一个小号,当我用她登录时,不执行屏蔽:";
caseShow = "文科980195412,xyz";
} else {
mess = "请修改不执行脚本的小号名单,以小写逗号相分隔,可带小写空格或小写引号:";
caseShow = whiteUsIds.toString();
}
var getSetData = prompt(mess, caseShow);
whiteUsIds = (getSetData == "文科980195412,xyz" || getSetData == "") ? [] : getSetData.replace(/,/g, ",").replace(/\s/g, "").replace(/["']/g, "").split(",");
localStorage.whiteUserIds = whiteUsIds.toString();
GM_setValue("whiteUserIds", whiteUsIds.toString());
}
GM_registerMenuCommand("tieba_Hide_SomeOne黑名单设置", hideSomeOneBlackSet);
GM_registerMenuCommand("tieba_Hide_SomeOne白名单设置", hideSomeOneWhiteSet);
//判断条件 执行屏蔽动作
if (whiteUsIds.indexOf(userName) == -1 && (HideToday.date != fulltime || HideToday[userName].toString() != getBlackList.toString())) {
goHideOneByOne(0, getBlackList.length - 1);
}
if (whiteUsIds.indexOf(userName) == -1) {
addNodeInsertedListener(".j_thread_list", function () { //帖子列表
var Lhtml = $(this).find(".tb_icon_author").attr("title").match(/.*[::]\s?(.*)/)[1];
if (getBlackList.indexOf(Lhtml) != -1) {
$(this).remove();
}
});
addNodeInsertedListener(".lzl_single_post", function () { //楼中楼
var iUserIdhtml = $(this).find(".j_user_card").attr("username");
if (getBlackList.indexOf(iUserIdhtml) != -1) {
$(this).remove();
}
});
addNodeInsertedListener(".j_feed_replyme", function () { //回复我的
var iUserIdhtml = $(this).find(".replyme_user").text().replace(":", "");
if (getBlackList.indexOf(iUserIdhtml) != -1) {
$(this).remove();
}
});
}