いけむランド

はてダからやってきました

Twitter の timeline に Wassr の timeline を追加するスクリプト rosetter.user.js を書いてみた

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);


Wassrjson を取得して、Twitter のレイアウトに合わせて DOM を作成して、末尾に appendChild することで一体化したような見栄えにしている。本当は時間で並べ替えをしたいが、まだ JavaScript をよくわかっていないので、できるようにするかどうかは未定。
また、Wassr の発言には favorite や reply のアイコンを表示させていない。これを Wassr 対応させるかどうかも未定。



Wassr の最新の friends_timeline が取得できていることは確認した。



何故かクロスポストはできないので、それは何とかしたい。