DashPlus - Follow Back Checker

Checks if the blogs you're following also follow you

当前为 2016-12-18 提交的版本,查看 最新版本

您需要先安装一个扩展,例如 篡改猴Greasemonkey暴力猴,之后才能安装此脚本。

You will need to install an extension such as Tampermonkey to install this script.

您需要先安装一个扩展,例如 篡改猴暴力猴,之后才能安装此脚本。

您需要先安装一个扩展,例如 篡改猴Userscripts ,之后才能安装此脚本。

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

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

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

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

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

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

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

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

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

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

// ==UserScript==
// @name        DashPlus - Follow Back Checker
// @namespace   http://www.dashpl.us/
// @description Checks if the blogs you're following also follow you
// @include     *www.tumblr.com/following
// @include     *www.tumblr.com/following/*
// @version     2.0.2
// @grant       none
// @run-at      document-end
// ==/UserScript==



//var check_img = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAMAAAC6V+0/AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAYBQTFRFUqhUttq2XK1ePHs9TqJQ/f799fr1LFstyuXLvd6+KVUq6vTqUKZSHjMfSJZKRpFIZbJn8/nzXq5gT6RRTZ5PcLhyS5tMRZBHdLp2VqtYHj8fFSsVk8mUcrhzi8WM3+/fUKVSqNSputy7WKtas9m0Y7FlqdSqv9/AQolEqNOpZ7NpQohDgY2BU2NTuNy5Nkk3iMSK1+PX7vDuJzwo3uPe1OnU7/fviMOJkb6TN3I43O3cLl8wqtWrmMuZnM6dl6GX0uXT5/PnQmtDqbGqMmczxM7EwuDCv8zAv86/Xo5fNFs1WqlcWaxbn8+g2ezZoaqhtcO1sdizzubPaJRpQ4xFQYZChL+F1trXSI5Kt9q4jcaOcrl0+fz6YLBie718ms2b6Oro2ufaP4NB3eTdSnpLOXU6kMeRj8eQZnRmaXdpeLR6bXtud7t4m82cXHRcjLeNm6mblriX8fXy8Pfw8/fzeZZ6U6lV6PPo7PXsaLRqbbZvS1xMQWFC0ejSUahT////lfBh+AAAAIB0Uk5T/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////wA4BUtnAAABLUlEQVR42mKoxwIYwCRrsRUHp5K6qRmSoGBtpGJumpxcVLoeG0yQW11TLlpAiCm2UlTWwBEiWBFpl8NUVgcEDJJCQhKCIMEYpXhZZYY6MGBirGKxAAqy+vnG+UDFZOXVyoQjEusZuAPlVKFi5mwydQwKIYWCDEG2EsoQMZl6GSCpIO5pyMAYJlAG0QsWAwqmeDCoyTKBxbTY1MG0sLZTAIONgCSTokpdnbw8xBCR1BpXBjdVBiaOehnFelmIIJ91nglDeRgLDxMbdz1Ecx0Ls5Q/0PEOfCLCmvX1WnUQa7j0jUDezNfm865XgdjCby3tDPZ7SXCqRpYwSJlYEpe0DjSUikrZLTX4xPhCXaR47eHhyeqe58XOziVlnBmOFPL1yQUZ1brZzgkQHkCAAQAJGIOAIXi03wAAAABJRU5ErkJggg==";
//var check_img = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAXBJREFUeNqslcsvA1EYxWfGNN6jqkK9QmvjESwEW2Fr4X9lZ2mHSNio1KaxIBJCCVU1zpFzk5smw1z6Jb%2F0tjP3zPked%2BrHcey1M3x9zoNNMPxHnSo4gLlqgEUH2P2HGGMK7HARgj6Qcdj8Bi5BDcRiCBSMoGucgyMJMgbAujEVOIrdSvAevMpdCcwYcy6CDXAM7kBTeym2ACJzk4vglajL2ThYUjMDV8EnuWPdPkEWLIPJ1obaTWmqgw393qMH8vsZuAYfoFNpzuoeL0mQYmVtjJQOO3gDTsG7DkIRLNp1SxJkXR7UxUizxaE%2FUVcZI2AV5JPKZQt2a0OvRqKimpV1nQdgDUz8dBDsp9DNoJ7O9C%2FAodYZpTmnGnppBBn9YFTrupyGOqsboOu3cWgVZNfGlJ4v1zmwpbr6roKh6liUm7xea4U0YkbgWbNmCs3uboMVucqlHP6acciB3gMv1kWmPO0g9gj2v9%2FY7f4L%2BBJgAK%2B%2FTCvBclH%2BAAAAAElFTkSuQmCC";
//var question_img = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAP5JREFUeNqslVELgjAQx91a9iBiUfggPfT9P1f0EIRICBVT%2B1%2FcYJm6uTw4ps773f%2B2m4qu66IlTfCYwLfwdSDnCS8h7iEZevgDRraB7%2BlCwVeWUtvucI2s1VdJQmQYUo79qVaNZLwA9BqaoASAUrKiF%2F8ByhFgMlUfoC1X4K0wYxUpw%2Bk9gpwZRjZYgZoQcuzdawtGFs8F2lYBVlobI1l9ELC0dxqwmNtMhQDbHoxaZjcVIF1AC6ZcMB%2BFCqDTnCPjAmr4lZqc1y53xbhKrs2J4bF2KZTRwuYCJlyqaZfUZw0bqmjki0PzBWA%2B4hqjkGA38yDQNDMisfQv4C3AAHp3Vn27XeuSAAAAAElFTkSuQmCC";

var idPrefix = "dashplus_follow_back_";
var classPrefix = idPrefix;

var followBackCss = '.'+classPrefix+'status{ float: left; font-family: tumblr-icons; font-size: 30px !important; font-weight: normal; height: 27px !important; margin: 4px 11px 4px 0; padding: 0 10px 0 6px !important; text-align: center; width: 13px; } .follower .info{ width: 358px; } .viewhide{ visibility: hidden; } .'+classPrefix+'sideblog{ padding: 0 14px 0 1px !important } .follower .poptica_header.popover_standalone{ margin-left: 42px; } .'+classPrefix+'status ~ .poptica_header.popover_standalone{ margin-left: 0px; }';

function run(){
	document.getElementsByTagName('head')[0].insertAdjacentHTML('beforeend','<style type="text/css">' + followBackCss + '</style>');

	blogTabs = document.querySelectorAll('.tab_blogs .tab_blog:not(.tab_dashboard)');
	blogs = new Array();
	Array.prototype.forEach.call(blogTabs, function(blogTab){
		blogs.push(blogTab.getAttribute('id').slice(9));
	});

	me = blogs[0]; //Use the first blog from the user's sidebar by default
	drop_down_menu(blogs,me);
	run_check(me);
}
function drop_down_menu(blogs,me){
	//Construct a link
	var blogLink = document.createElement('div');
	blogLink.insertAdjacentHTML('beforeend', '<a href="//www.tumblr.com/blog/'+me+'">'+me+'</a>');

	//Create a container for the text and the link
	container = document.createElement('div');
	container.insertAdjacentHTML('beforeend',
		'You are seeing blogs that follow ' + blogLink.outerHTML
	);

	//And put that container in another box
	div = document.createElement('div');
	div.insertAdjacentHTML('beforeend',container.outerHTML);
	div.className += ' grey_note';
	div.style.overflow = 'hidden';
	div.style.marginTop = '20px';
	div.setAttribute('id',idPrefix + 'sidebar_box');

	//And then add it to the sidebar
	document.getElementById('right_column').insertAdjacentHTML('beforeend',div.outerHTML);
}
function run_check(me){
	followerDivs = document.querySelectorAll('div#following div.follower');
	Array.prototype.forEach.call(followerDivs, function(followerDiv){
		if(followerDiv.className.indexOf(classPrefix + "checked") < 0){
			followerDiv.className += " " + classPrefix + "checked";

			var nameLink = followerDiv.querySelector('.info .name > a');
			if(nameLink !== null && 'null' !== nameLink){ //Because JavaScript fails at having a "continue" operator.
				var name = nameLink.innerHTML;
				console.log(name);

				if(name !== null && name !== ''){
					//Okay, now let's do an Ajax POST request
					var xhr = new XMLHttpRequest();
					xhr.open('GET',encodeURI('/svc/blog/followed_by?' + encodeURI('tumblelog='+me+'&query='+name)));
					xhr.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
					xhr.onload = function(){
						var icon = document.createElement('div');
						icon.className += " " + classPrefix + "status";

						//The response has finished, let's check the response
						if(xhr.status == 200){ //If the response status is OK
							var data = JSON.parse(xhr.responseText); //Parse the JSON response
							//console.log(data);

							var followerRow = followerDiv.querySelector('.info');


							if(data.response.is_friend == 1){
                                //The user is following back
								icon.className += " chrome green big";
								icon.innerHTML = "";
							}
							else{
                                //The user is not following back
								icon.className += " chrome red big";
								icon.innerHTML = "";
							}

						}
						else if(xhr.status == 400){
                            //The blog in question is a side-blog, and therefore cannot follow back.
							icon.className += " chrome big viewhide";
							icon.innerHTML = "";
						}
						else{ //If the response is anything other than OK.
							console.log("DashPlus Follow Back: Error fetching follow-back status.");
							console.log(xhr);
						}
						followerDiv.querySelector('.info').insertAdjacentHTML('afterend',icon.outerHTML);
					}
					xhr.send();
				}
			}
		}
	});
}

run();