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で実行すると、結果が標準出力(コマンドプロンプト)に出力されます。
cscript twitterclient2.js ユーザー名 パスワード
オリジナルとの変更点
- タイムライン取得は一度きりで(常駐せずに)結果を表示して終了します。引数はユーザー名とパスワードです。
- 返信取得は常駐します。10分ごとにチェックします。引数はユーザー名とパスワードと@です。
(例:wscript twitterclient2.js ユーザー名 パスワード @)
- 発言も一度きりで常駐しません。引数はユーザー名とパスワードと投稿内容です。間違って@のみの投稿をしてしまうと、裏で返信取得として常駐しちゃうのでお気をつけください。
- 表示フォーマットを微調整
注意
タイムライン取得の場合、常駐しないため、cscriptで実行すると結果が一瞬で閉じてしまって見えません(汗
コマンドプロンプトから実行すれば見えるのですが、基本的にはWScriptからの実行を想定しています。(仕事中のチラミとかを想定)
返信取得は常駐するので、どちらで実行しても問題ありません。(不意の@を教えてほしいので、常駐します。)
あと、取得に関しては大なり小なりは文字化けします。
固定で置換すればよさそうですが、サボってます。
常駐した場合の終了方法ですが、cscriptならCtrl-cで。wscriptの場合は、タスクマネージャからwscript.exeを終了させてください。