@hatenaquestionのtweetを人力検索・アンケート・いわしに分類するGreasemonkey

ニッチなGreasemonkeyを作っては一人悦に浸っているso_blueです、こんにちは!
今日もまた下らないグリモン作ったので、性懲りも無くupしてみます!


先日、はてな人力検索の新着質問をつぶやいてくれるtwitterbotの存在を知り、早速フォローしてみました。
人力検索はてな (@hatenaquestion) | Twitter
このbotをフォローすると、人力検索で質問がされるごとに

  • 質問内容
  • 質問ページへのリンク

をつぶやいてくれます。
PCさわってる時は、結構な頻度でtwitterのTLをチェックしてるので、人力検索で質問がされる度に知らせてもらえるのは非常に助かるんですが、その質問が人力検索なのかアンケートなのか、はたまたいわしなのかは、つぶやきだけではわからない、実際の質問ページにとばないと分からない*1のが難点です。あと、結構な頻度で質問が削除されてたりもするんですよね。質問ページにとんだはいいが、既に質問は削除されてた…なんて事が構あったりします。ちょっとウザいです。

話は変わって、自分は、はてなアクセス解析を利用してます。はてなアクセス解析有料オプションですので、このサービスを利用するにはお金、というかはてなポイントが必要なんですが、自分はこのポイントを人力検索でもらえるポイントで賄ってるんですね。とりわけお手軽にポイントがもらえる「アンケート」が自分の主戦場です。(;^ω^)

これ以上説明すると

ちょっと下衆くなりそう(;^ω^)なので、説明はこれくらいにしておいて、グリモンの効果について。
効果は↓のキャプチャ画像をご覧ください。

Before

After


人力検索なら「人」、アンケートなら「ア」、いわしなら「い」のマークが質問urlの後ろに付きます。また、補足情報として、割り振られるポイントや回答状況がマークの後ろにプラスされます。削除された質問にはマークが付きません。あと、上のキャプチャ画像だけではわからないのですが、字の色が質問の状態を表してて、白抜き→回答受付中、黒字→回答受付終了となります。

ソース

// ==UserScript==
// @name           hatenaquestionCategorizer
// @namespace      http://d.hatena.ne.jp/so_blue/
// @description    人力検索はてなのtwitter-bot【hartenaquestion】のtweetを「人力検索」「アンケート」「いわし」に分類します。
// @author         so_blue
// @version        0.1
// @include        http://twitter.com/*
// @include        https://twitter.com/*
// ==/UserScript==
(function() {

	GM_addStyle(<><![CDATA[
		span.question_status {
			display: inline-block;
			-moz-border-radius: 3px;
			padding: 2px;
			color: #fff;
		}
	]]></>);

	var xpath = '//li[contains(@class, "u-hatenaquestion")]//span[@class="entry-content"]/a[starts-with(@href, "http://q.hatena.ne.jp") and not(@lang="ja")]';

	var span = document.createElement('span');
	//span.style.fontWeight = 'bold';

	function getAnchors(doc) {
		var tweets = document.evaluate(xpath, doc, null, 7, null);
		if (!tweets) return;
		for (var i = 0, len = tweets.snapshotLength; i < len; i++) {
			var q = tweets.snapshotItem(i);
			q.lang = 'ja';
			GM_xmlhttpRequest({
				method: 'GET',
				url: q.href,
				onload: categorize(q)
			});
		}
	}

	function categorize(node) {
		return function(res) {
			var div = document.createElement('div');
			div.innerHTML = res.responseText;
			var img = document.evaluate('.//h1//img[@class="by"]', div, null, 9, null).singleNodeValue;
			if (!img) return;
			var s = img.src.split('-')[1].substring(0, 1);
			var wrapper = span.cloneNode(true);
			var elm = span.cloneNode(true);
			elm.className = 'question_status';
			wrapper.appendChild(elm);
			var q_stat = document.evaluate('.//div[@class="question-information"]//li[2]', div, null, 9, null).singleNodeValue
			if (/終了/.test(q_stat.textContent)) {
				elm.style.color = '#000';
			}
			switch (s) {
			case 'j':
				elm.style.backgroundColor = '#32CD32';
				elm.textContent = '人';
				var s = document.evaluate('.//div[@class="question-information"]//li[4]', div, null, 9, null).singleNodeValue.textContent;
				s = s.replace('回答ポイント:', '').replace('ポイント', 'pt');
				break;
			case 'e':
				elm.style.backgroundColor = '#ffa500';
				elm.textContent = 'ア';
				var s = document.evaluate('.//div[@class="question-information"]//li[3]', div, null, 9, null).singleNodeValue.textContent;
				s = s.replace('回答数:', '');
				break;
			default:
				elm.style.backgroundColor = '#4682B4';
				elm.textContent = 'い';
				var s = document.evaluate('.//div[@class="iwashi-header-top"]//span[@class="iwashi-status"]', div, null, 9, null).singleNodeValue.textContent;
				s = s.replace(' pt', 'pt');
				break;
			}
			var pt = span.cloneNode(true);
			pt.textContent = ' ' + s;
			wrapper.appendChild(pt);
			node.parentNode.insertBefore(wrapper, node.nextSibling);
			elm = pt = null;
		}
	}

	/*
	AutoPagerize対応
	via http://d.hatena.ne.jp/blooo/20091012/1255323254
	*/
	document.body.addEventListener('AutoPagerize_DOMNodeInserted', function(evt) {
		var doc = evt.target;
		getAnchors(doc);
	}, false);

	getAnchors(document);

})();

ソースが汚いですね...

宿題

  • listのページだと、他のscriptがエラーになってグリモンが動いてくれない。*2
  • AutoPagerize対応はしてるけど、twitter側の「新しいツイートがxx件あります」には対応出来てない。

という訳で

こんなのでよければどうぞ。
http://userscripts.org/scripts/show/69674

最後に

下衆くてどうもすみません(;^ω^)

*1:といっても、文面である程度は判断出来ると思いますが。

*2:うちだけ?