Tumblr - Archive Reblog

Reblog posts from any archive.

您需要先安裝使用者腳本管理器擴展,如 TampermonkeyGreasemonkeyViolentmonkey 之後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyViolentmonkey 後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyViolentmonkey 後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyUserscripts 後才能安裝該腳本。

你需要先安裝一款使用者腳本管理器擴展,比如 Tampermonkey,才能安裝此腳本

您需要先安裝使用者腳本管理器擴充功能後才能安裝該腳本。

(我已經安裝了使用者腳本管理器,讓我安裝!)

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

(我已經安裝了使用者樣式管理器,讓我安裝!)

// ==UserScript==
// @name        Tumblr - Archive Reblog
// @namespace   http://script.b9mx.com/tumblr-archive-reblog.user.js
// @description Reblog posts from any archive.
// @include     http*://*/archive
// @include     https://www.tumblr.com/dashboard?blogme*
// @version     2
// @grant       none
// ==/UserScript==
window.setTumblelogs = function(html){ // setTumblelogs - v2 - for trickier blog objects
	var tumblelogs = false;
	var spare = [];
	if(typeof html !== "undefined"){
		var div = jQuery("<div></div>").html(html);
        try{
		tumblelogs = JSON.parse(
            jQuery("<div></div>").html(
                div.find("noscript#bootloader").attr("data-bootstrap")
            ).text()
        )["Components"]["AbuseForm"]["tumblelogs"];
        }catch(e){
            return spare;
        }
        return tumblelogs;
	}
};
var dlh = document.location.href;
var deh = document.documentElement.innerHTML;
window.reblog_key_fetch_queue = [];
window.reblog_key_fetch_queue_id = [];
window.after_work = false;
window.fetch_reblog_key = function(id){
	jQuery("#arc_reblog_"+id).html('<img src="https://31.media.tumblr.com/2706639e7c88a85aaca555acb3fd8c57/tumblr_inline_n7vxmyg06N1rcl671.gif">');
	var api = 'fuiKNFp9vQFvjLNvx4sUwti4Yb5yGutBN4Xh10LXZhhRKjWlV4';
	var url = '//api.tumblr.com/v2/blog/' + window.tumblog + 
			  '.tumblr.com/posts?api_key=' + api + '&id=' + id + "&reblog_info=true";
	jQuery.ajax({
		url:url,
		dataType:'jsonp',
		success:function(re){
			if(typeof re !== "undefined" && re.hasOwnProperty("response")
			&& re["response"].hasOwnProperty("posts") && jQuery.type(re["response"]["posts"][0]) === "object"
			&& re["response"]["posts"][0].hasOwnProperty("reblog_key")){
				var reblog_key = re["response"]["posts"][0]["reblog_key"];
				jQuery("#arc_reblog_" + id).attr("onclick",
					"window.open('https://www.tumblr.com/dashboard?blogme=" +
					window.tumblog + "&id=" + id + "&key=" + reblog_key + "'" +
					",'win2'," +
					"'width=200,height=90," +
					"location=0,menubar=0,scrollbars=1,status=0,toolbar=0,resizable=1');"+
					"return false;"
				).val("Reblog").css("color","#000");
			}else{
				jQuery("#arc_reblog_"+id).text("API error").attr("title","Click to try again.").css("color","#f00");
			}
		},
		error: function(e){
			jQuery("#arc_reblog_"+id).text("API error").attr("title","Click to try again.").css("color","#f00")
		}
	});
}
window.reblog_win2 = function(id){
	return jQuery('<input>').val("Load Key").attr({
		"type":"button",
		"id":"arc_reblog_"+id,
		"onClick": "window.fetch_reblog_key('"+id+"');return false;"
	});
}
if(dlh.match("www.tumblr.com/dashboard\\?blogme")!==null){
	// run this as the blog list window
	if(dlh.match(/\?blogme=[^&]+&/) === null && dlh.match(/&id=[^&]+&/) === null
	&& dlh.match(/&key=[^$]+$/) === null){
		var css = jQuery('<style type="text/css">').append(
			'*{margin:0;padding:0;}' +
			'body{' +
				'font-family:arial,sans-serif;' +
				'font-size:16px;' +
				'color:#000;' +
				'background-color:#fff;' +
			'}' +
			'label{margin:5px 0}' +
			'input[type=radio]:checked,' +
			'input[type=radio]:checked + label{' +
				'background-color:#afcfdf;' +
			'}'
		);
		var title = jQuery("<title>").text("Archive Reblog Options");
		jQuery("head").html("");
		jQuery("body").html("loading...");
		jQuery.ajax({
			url:"https://www.tumblr.com/dashboard",
			type:'get',
			beforeSend: function(xhr) {
				xhr.setRequestHeader('X-Requested-With',{toString:function(){return '';}});
			},
			success: function(x){
				var tumblogs = window.setTumblelogs(x);
				jQuery("head").append(css,title);
				var form = jQuery('<div/>').append(
					jQuery('<label for="as_draft">').append(
						jQuery('<input id="as_draft" type="checkbox">').change(function(){
							if(jQuery(this).prop("checked")){
								set_cookie("gm_ar_draft", "yes", 999);
							}else{
								unset_cookie("gm_ar_draft");
							}
						}).prop("checked", function(){
							return get_cookie("gm_ar_draft") !== false && 
								   get_cookie("gm_ar_draft").value === "yes";
						}),
						"Reblog posts as draft"
					), "<br><br>Select a blog to reblog to."
				);
				var first = "";
				jQuery.each(tumblogs, function(i, bl){
					var name = bl.name;
					if(first.length === 0) first = name;
					form.append(
						jQuery("<div>").append(
							jQuery('<input>').attr({
								"type": "radio",
								"name": "gm_ar_poster",
								"id": name
							}).prop("checked", function(){
								return get_cookie("gm_ar_poster") !== false && 
									   get_cookie("gm_ar_poster").value === name;
							}).change(function(){
								if(jQuery(this).prop("checked")){
									set_cookie(
										"gm_ar_poster",
										jQuery(this).attr("id"),
										999
									);
								}
							}),
							jQuery('<label>').attr({
								"for":name
							}).append(name)
						)
					)
				});
				if(form.find("input:checked").length === 0){
					form.find("#" + first).prop("checked", true);
					set_cookie("gm_ar_poster", first, 999);
				}
				form.append(
					jQuery('<input>').val("Close Window").attr({
						"type":"button",
						"onClick":"window.close();"
					}),"<br><br>"
				);
				jQuery("body").html(form);
			}
		});
	}else{
		// reblogging window
		var name = dlh.match(/\?blogme=([^&]+)&/)[1];
		var id = dlh.match(/&id=([^&]+)&/)[1];
		var reblog_key = dlh.match(/&key=([^$]+$)/)[1];
		var form_key = jQuery("#tumblr_form_key").attr("content");
		var css = jQuery('<style type="text/css">').append(
			'*{margin:0;padding:0;}' +
			'body{' +
				'font-family:arial,sans-serif;' +
				'font-size:16px;' +
				'color:#000;' +
				'background-color:#fff;' +
			'}'
		);
		var title = jQuery("<title>").text("Archive Reblog " + id);
		jQuery("head").html("");
		jQuery("head").append(css,title);
		jQuery("body").html("");
		if(get_cookie("gm_ar_poster") === false){
			jQuery("body").html("Error: Must set blog options first.");
		}else{
			jQuery("body").css("color","").html(
				'<img src="https://31.media.tumblr.com/2706639e7c88a85aaca555acb3fd8c57/tumblr_inline_n7vxmyg06N1rcl671.gif"> Reblogging '+id
			);
			window.tag_fetch_not_running = true;
			jQuery.ajax({
				url: 'https://www.tumblr.com/svc/post/fetch',
				type: 'post',
				data:'{"reblog_id":"' + id + '",' +
					'"reblog_key": "' + reblog_key + '",'+
					'"channel_id":"' + name + '",' +
					'"post_type":false,' +
					'"form_key":"'+ form_key +'"}',
				success: function(x){
					var post_object = x;
					var reblog_name = ((post_object["post"]["reblog_name"] !== null)? post_object["post"]["reblog_name"] : blog_name)
					var reblog_post_id = ((post_object["post"]["root_id"] !== null)? post_object["post"]["root_id"] : id);
					var blog_name = get_cookie("gm_ar_poster").value;
					var draft = get_cookie("gm_ar_draft") !== false && get_cookie("gm_ar_draft").value === "yes";
					jQuery.ajax({
						url: 'https://www.tumblr.com/svc/secure_form_key',
						type: 'post',
						data: '',
						headers: {
							'X-tumblr-form-key': form_key
						},
						success: function(x2, b, r){
							var sform_key = r.getResponseHeader('X-tumblr-secure-form-key');	
							var isset = function(val, type){
								if(jQuery.type(type) === "undefined") type = jQuery.type(val);
								return jQuery.type(val) !== "undefined"
										&& val !== null
										&& val !== false
										&& jQuery.type(val) === type
								
							}
							var changes_to_post = {
								"channel_id": blog_name,
								"detached": true,
								"reblog": true,
								"post[date]": "",
								"reblog_id": id.toString(),
								"reblog_post_id": id.toString(),
								"reblog_key": reblog_key,
								"is_recommended": false,
								"placement_id": false,
								"rbpt": "",
								"post[publish_on]": "",
								"safe_edit": true,
								"post_context_page": "dashboard",
								"created_post": (isset(post_object["created_post"])?post_object["created_post"]:true),
								"post[tags]":(isset(post_object.post.tags)?post_object.post.tags:null),
								"form_key": form_key,
								"errors": false,
								"context_page": "dashboard",
								// context page queue/drafts? maybe not needed
								// "post": post_object.post, // maybe these are vestigial ? ??
								// "post_tumblelog", post_object["post_tumblelog"],
								"silent": true,
								"context_id": reblog_name,
								"editor_type": "rich",
								"is_rich_text[one]": "0",
								"is_rich_text[two]": "1",
								"is_rich_text[three]": "1",
								"post[slug]": "",
								"post[source_url]": (isset(post_object.post["source_url"])?
														post_object.post["source_url"]
														:
														"http://"
													),
								"post[three]": (isset(post_object.post.three)? post_object.post.three: ""),
								"post[type]": post_object.post.type,
								"post[one]": (isset(post_object.post.two)? post_object.post.one: ""),
								"post[two]": (isset(post_object.post.two)? post_object.post.two: ""),
								"post[three]": (isset(post_object.post.three)? post_object.post.three: ""),
								"post[tags]": (isset(post_object.post.tags)? post_object.post.tags: ""),
								"post[state]": (draft ? "1":"0 3"),
							};
							if(isset(post_object.post.photos,"array")){
								var order = "";
								var oneone = "";
								jQuery.each(post_object.post.photos, function(i,photo){
									order += photo.id+",";
									oneone += "1";
									var srt = photo.url;
									var src = srt.replace(/500\.(\w{3,4}$)/,"1280.$1");
									var test_1280 = jQuery("<img>").attr({
										"src":src
									}).bind("error",function(){
										src = srt;
									}).ready(function(){
										jQuery(this).remove();
									});
									changes_to_post["images["+photo.id+"]"] = src;	
									changes_to_post["caption["+photo.id+"]"] = isset(photo.caption)? photo.caption: "";
								});
								changes_to_post["post[photoset_layout]"] = isset(post_object.post["photoset_layout"]) ? post_object.post["photoset_layout"]: oneone;
								changes_to_post["post[photoset_order]"] = order.replace(/,$/,'');
								changes_to_post["MAX_FILE_SIZE"] = "10485760";
							}
							if(isset(post_object.post.type) && post_object.post.type === "audio"){
								jQuery.extend(changes_to_post,{
									"pre_upload": "",
									"preuploaded_url": "",
									"remove_album_art": "",
									"artwork_pre_upload": "1",
									"MAX_FILE_SIZE": "10485760",
									"album_art": isset(post_object.post["audio_artwork"])? post_object.post["audio_artwork"] : ""
								});
								if(isset(post_object.post["id3_tags"],"array")){
									jQuery.each(post_object.post["id3_tags"], function(i, id3){
										changes_to_post['id3_tags['+i+']'] = id3;
									});
								}
							}
							if(isset(post_object.post.type) && post_object.post.type === "video"){
								jQuery.extend(changes_to_post,{
									"post[one]": post_object["post"]["video"]["embed_code"],
									"pre_upload": "",
									"MAX_FILE_SIZE": "10485760",
									"preuploaded_url": "",
									"preuploaded_ch": "",
									"valid_embed_code": "1"
								});
							}
							jQuery.ajax({
								url: 'https://www.tumblr.com/svc/post/update',
								type: 'post',
								headers: {
									'X-tumblr-form-key': form_key,
									'X-tumblr-puppies': sform_key
								},
								data: JSON.stringify(changes_to_post),
								success: function(){
									jQuery("body").css("color","green").html(
										"Post " + id + " reblogged to " + blog_name + (draft ? " as a draft":"") + "!"
									);
									setTimeout(function(){
										window.close();
									}, 2500);
								}
							});
						}
					});
				}
			});
		}
	}
}else if(dlh.match(/\/archive(\/\d{4}\/\d{1,2})?$/)!==null
	&& jQuery("header#nav_archive").length > 0){
	// run this on any archive page
	window.tumblog = deh.match(/&amp;name=([^"]+)"/)[1];
	window.append_timer = setInterval(function(){
		if(!window.after_work
		&& jQuery('.post_glass').length !== jQuery('.post_glass.with_re').length){
			window.after_work = true;
			jQuery('.post_glass:not(.with_re)').each(function(){
				jQuery(this).addClass("with_re");
				if(jQuery(this).find('input').length === 0){
					var id = jQuery(this).parents('.post_micro').attr("id").substr(11);
					jQuery(this).prepend(window.reblog_win2(id));
				}
			});
		}else{
			window.after_work = false;
		}
	}, 1000);
	jQuery("head").append(
		jQuery('<style type="text/css">').text(
			'.post_micro input{bottom:2px;cursor:pointer;height:20px;' +
			'position:absolute;right:2px;width:90px;z-index:9999;}'
		)
	);
	jQuery("#nav_archive").append(
		jQuery('<input>').val("Open Reblog Options").attr({
			"type":"button",
			"onClick":
				"window.open('https://www.tumblr.com/dashboard?blogme','win1'," +
				"'width=300,height=200," +
				"location=0,menubar=0,scrollbars=1,status=0,toolbar=0,resizable=1')"
		})
	);
}