@hatenaquestionのtweetを人力検索・アンケート・いわしに分類するGreasemonkey
ニッチなGreasemonkeyを作っては一人悦に浸っているso_blueです、こんにちは!
今日もまた下らないグリモン作ったので、性懲りも無くupしてみます!
先日、はてなの人力検索の新着質問をつぶやいてくれるtwitterのbotの存在を知り、早速フォローしてみました。
人力検索はてな (@hatenaquestion) | Twitter
このbotをフォローすると、人力検索で質問がされるごとに
- 質問内容
- 質問ページへのリンク
をつぶやいてくれます。
PCさわってる時は、結構な頻度でtwitterのTLをチェックしてるので、人力検索で質問がされる度に知らせてもらえるのは非常に助かるんですが、その質問が人力検索なのかアンケートなのか、はたまたいわしなのかは、つぶやきだけではわからない、実際の質問ページにとばないと分からない*1のが難点です。あと、結構な頻度で質問が削除されてたりもするんですよね。質問ページにとんだはいいが、既に質問は削除されてた…なんて事が構あったりします。ちょっとウザいです。
話は変わって、自分は、はてなのアクセス解析を利用してます。はてなのアクセス解析は有料オプションですので、このサービスを利用するにはお金、というかはてなポイントが必要なんですが、自分はこのポイントを人力検索でもらえるポイントで賄ってるんですね。とりわけお手軽にポイントがもらえる「アンケート」が自分の主戦場です。(;^ω^)
これ以上説明すると
ちょっと下衆くなりそう(;^ω^)なので、説明はこれくらいにしておいて、グリモンの効果について。
効果は↓のキャプチャ画像をご覧ください。
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
最後に
下衆くてどうもすみません(;^ω^)