js(wscript)製twitter投稿・取得ツール

ぷーる様が公開しているブログ「muumoo.jp」 http://muumoo.jp/ でjs製のtwitter投稿ツールが公開されています。手軽につぶやきたいときは、ランチャのbluewindから呼び出して使っていました。


で、jsで投稿できるんだから、取得もできそうだよね、と思って探したら、このブログでバージョンアップ版として公開されていました。


http://muumoo.jp/news/2008/06/24/0twitterclientjs.html


喜び勇んで試してみたのですが、最近のtwitter側仕様変更のため動きません。ならば、と修正と微妙な変更を加えましたので、ここで公開いたします。
とりあえず、twitterclient2.jsとでもしておきます。

(function() {
  var Twitter = function(id, pass){
    this.id = id;
    this.pass = pass;
    this.log = {};
  };
  Twitter.prototype.Update = function(message) {
    return this._get('http://twitter.com/statuses/update.json', message, 'POST');
  }
  Twitter.prototype.FriendTimeline = function() {
    return this._format(eval(this._get('http://twitter.com/statuses/friends_timeline.json', null, 'GET')));
  }
  Twitter.prototype.Mentions = function() {
    return this._format(eval(this._get('http://twitter.com/statuses/mentions.json', null, 'GET')));
  }
  Twitter.prototype._get = function(url, data, method) {
    var xmlhttp = new ActiveXObject('Msxml2.XMLHTTP');
    xmlhttp.open(method, url, false, this.id, this.pass);
    xmlhttp.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
    xmlhttp.send(data);
    if(xmlhttp.status != 200) WScript.echo(xmlhttp.status + ' ' + xmlhttp.statusText);
    return xmlhttp.responseText;
  }
  Twitter.prototype._format = function(items) {
    if(items.length == 0) return '';
    var statuses = '';
    items.sort(function(a, b){ return a.id - b.id; });
    for(var i = 0; i < items.length; i++) {
      var item = items[i];
      if(this.log[item.id]) continue;
      
      var t = item.created_at.split(' ');
      var d = new Date(t[1] + ' ' + t[2] + ',' + t[5] + ' ' + t[3] + ' ' + t[4]);
      var line =
	  '●' +
          item.user.screen_name + ' [' +
          d.getFullYear() + '.' +
          (d.getMonth() + 1) + '.' +
          d.getDate() + ' ' +
          d.getHours() + ':' +
          d.getMinutes() + '] ' + '\n' +
          item.text + '\n';
      this.log[item.id] = 1;
      statuses += line;
    }
    return statuses;
  }
    
  
  var args = WScript.Arguments;
  if(args.length < 2) return;
  
  var twitter = new Twitter(args.Item(0), args.Item(1));
  if(args.length == 2) {
    var statuses = twitter.FriendTimeline();
    if(statuses.length > 0) WScript.echo(statuses);
  } else if(args.length == 3 && args.Item(2) == '@') {
    while(true) {
        var statuses = twitter.Mentions();
        if(statuses.length > 0) WScript.echo(statuses);
	WScript.Sleep(60 * 1000 * 10); // interval 10min
    }
  } else {
    var statuses = [];
    for(var i = 2; i < args.length; i++) {
      statuses.push(args.Item(i));
    }
    twitter.Update('status=' + encodeURIComponent(statuses.join(' ')));
  }
})();

使い方

オリジナルとほぼ変わりません。

  • WScriptで実行すると、結果がダイアログで表示されます。

wscript twitterclient2.js ユーザー名 パスワード

cscript twitterclient2.js ユーザー名 パスワード

オリジナルとの変更点

  • タイムライン取得は一度きりで(常駐せずに)結果を表示して終了します。引数はユーザー名とパスワードです。
  • 返信取得は常駐します。10分ごとにチェックします。引数はユーザー名とパスワードと@です。

(例:wscript twitterclient2.js ユーザー名 パスワード @)

  • 発言も一度きりで常駐しません。引数はユーザー名とパスワードと投稿内容です。間違って@のみの投稿をしてしまうと、裏で返信取得として常駐しちゃうのでお気をつけください。
  • 表示フォーマットを微調整

注意

タイムライン取得の場合、常駐しないため、cscriptで実行すると結果が一瞬で閉じてしまって見えません(汗
コマンドプロンプトから実行すれば見えるのですが、基本的にはWScriptからの実行を想定しています。(仕事中のチラミとかを想定)


返信取得は常駐するので、どちらで実行しても問題ありません。(不意の@を教えてほしいので、常駐します。)


あと、取得に関しては大なり小なりは文字化けします。
固定で置換すればよさそうですが、サボってます。


常駐した場合の終了方法ですが、cscriptならCtrl-cで。wscriptの場合は、タスクマネージャからwscript.exeを終了させてください。