Sabotter を使っているような素振りを見せながら、最近は JavaScript の勉強がてらにこんなのを書いて使っていたりする。
// ==UserScript== // @name rosetter // @namespace http://d.hatena.ne,jp/fd0 // @description Twitter の timeline に Wassr の timeline を追加する // @include https://twitter.com/home // @include http://twitter.com/home // ==/UserScript== if (!GM_getValue('rosetter.wassr.id')) { GM_setValue('rosetter.wassr.id', window.prompt("Please input wassr id")); } if (!GM_getValue('rosetter.wassr.password')) { GM_setValue('rosetter.wassr.password', window.prompt("Please input wassr password")); } /* * get timeline */ window.addEventListener("load", function() { GM_xmlhttpRequest( { method: 'GET', url: 'http://api.wassr.jp/statuses/friends_timeline.json?id=' + GM_getValue('rosetter.wassr.id'), headers: { 'User-agent': 'Mozilla/4.0 (compatible) Greasemonkey', 'Accept' : 'application/atom+xml,application/xml,text/xml', }, onload: function(responseDetails) { var timeline = document.getElementById("timeline"). getElementsByTagName("tbody")[0]; var statuses = eval(responseDetails.responseText); // append for (i in statuses) { // status status = statuses[i]; var tr = document.createElement("tr"); tr.id = "wassr_" + status["id"]; tr.className = "hentry hentry_hover"; // tr.style.backgroundColor = "#C0FFC0"; /* * +-----+-----+-----+ * | td1 | td2 | td3 | * +-----+-----+-----+ */ var td1 = document.createElement("td"); td1.className = "thumb vcard author"; var a1 = document.createElement("a"); a1.className = "url"; a1.href = "http://wassr.jp/user/" + status["user_login_id"] + "/"; var img1 = document.createElement("img"); img1.id = "profile-image"; img1.className = "photo fn"; img1.src = status["user"]["profile_image_url"]; img1.alt = status["user"]["screen_name"]; img1.height = 48; img1.width = 48; var td2 = document.createElement("td"); td2.className = "content"; var strong2 = document.createElement("strong"); var a21 = document.createElement("a"); a21.title = status["user_login_id"]; a21.href = "http://wassr.jp/user/" + status["user_login_id"] + "/"; a21.innerHTML = status["user_login_id"]; var span21 = document.createElement("span"); span21.className = "entry-content"; span21.innerHTML = " " + status["html"]; var span22 = document.createElement("span"); span22.className = "meta entry-meta"; var a22 = document.createElement("a"); a22.className = "entry-date"; a22.rel = "bookmark"; a22.href = status["link"]; var abbr2 = document.createElement("abbr"); abbr2.className = "published"; var date = new Date(Math.floor(parseInt(status["epoch"])) * 1000); abbr2.innerHTML = " " + date.toString(); abbr2.title = date.toString(); var td3 = document.createElement("td"); td3.align = "right"; td3.width = 10; a1.appendChild(img1); td1.appendChild(a1); tr.appendChild(td1); strong2.appendChild(a21); td2.appendChild(strong2); td2.appendChild(span21); a22.appendChild(abbr2); span22.appendChild(a22); td2.appendChild(span22); tr.appendChild(td2); tr.appendChild(td3); timeline.appendChild(tr); } } }) }, true); /* * cross post * via http://d.hatena.ne.jp/Malan/20080710/1215661202 * * 何故か下記のエラーがコンソールに表示されて post できない。>< * uncaught exception: unknown (can't convert to string) */ var updater = document.getElementById('update-submit'); updater.addEventListener("click", function() { var feeling = document.getElementById("status").value; if (!feeling) return; var args = { mathod: 'POST', headers: { 'Content-Type': 'application/x-www-form-urlencoded' } } args.url = 'http://' + GM_getValue('rosetter.wassr.id') + ':' + GM_getValue('rosetter.wassr.password') + '@api.wassr.jp/statuses/update.json?id=' + GM_getValue('rosetter.wassr.id');; args.data = 'status=' + encodeURIComponent(feeling); GM_xmlhttpRequest(args); } , true);
Wassr の json を取得して、Twitter のレイアウトに合わせて DOM を作成して、末尾に appendChild することで一体化したような見栄えにしている。本当は時間で並べ替えをしたいが、まだ JavaScript をよくわかっていないので、できるようにするかどうかは未定。
また、Wassr の発言には favorite や reply のアイコンを表示させていない。これを Wassr 対応させるかどうかも未定。
Wassr の最新の friends_timeline が取得できていることは確認した。
何故かクロスポストはできないので、それは何とかしたい。