2012年07月09日

JavaScript(WSH)を使ってTwitterのつぶやきをExcelに出力するスクリプトを書いてみた

久方ぶりのプログラミングネタ。ブログのジャンルがIT/インターネットじゃなくなりつつあったので。

下記のコードを任意のファイルに保存して、コマンドプロンプトで以下のコマンドを実行します。

cscript //x 保存したファイル名 検索するキーワード

例えば、デスクトップ上にtweet.jsというファイル名で保存して、@FooBuzz4Kを検索するには、

cscript //x C:\Users\FooBuzz4K\Desktop\tweet.js @FooBuzz4K

Excelが起動し、ツイートをワークシートに出力していきます。

解説その他は、明日以降へ(たぶん)つづく。

// 文字列にtrimメソッドを追加
String.prototype.trim = function()
{
	return this.replace(/^\s+|\s+$/g, "");
}

function createXMLHttpRequest()
{
	var progIDs = 
		[ 'Msxml2.XMLHTTP.6.0','Msxml2.XMLHTTP.3.0','Microsoft.XMLHTTP'];

	for (var i = 0; i < progIDs.length; i++)
	{
		try
		{
			var xmlDOM = new ActiveXObject(progIDs[i]);
			return xmlDOM;
		}
		catch (ex)
		{
		}
	}
	return null;
}

var line = 0;

var sheet = null;

var xhr = null;

function callback()
{
	if (xhr.readyState != 4)
	{
		return;
	}
	if ( xhr.status == 403 )
	{
		WScript.Echo("APIの制限を越えました");
		return;
	}
	else if ( xhr.status == 404 )
	{
		WScript.Echo("Done");
		return;
	}
	else if (xhr.status != 200)
	{
		WScript.Echo("原因不明のエラーです: " + xhr.status);
		return;
	}
	var res = eval("("+xhr.responseText+")");

	if ( res == null )
	{
		WScript.Echo("JSONオブジェクトが見つかりません");
		return;
	}

	if ( sheet == null )
	{
		WScript.Echo("ワークシートを取得できませんでした");
		return;
	}

	for( var i = 0; i < res.results.length; i++ )
	{
		if ( i == 0 && line == 0 )
		{
			var j = 1;
			for ( var key in res.results[0] )
			{
				//WScript.Echo(key);
				sheet.Cells(1,j++).Value = key;
			}
			line ++;
		}
		sheet.Cells(line+i+1,1).Value =
			 res.results[i].created_at;

		sheet.Cells(line+i+1,2).Value =
			 res.results[i].from_user;

		sheet.Cells(line+i+1,3).Value =
			 res.results[i].from_user_id;

		sheet.Cells(line+i+1,4).Value =
			 "'" + res.results[i].from_user_id_str;

		sheet.Cells(line+i+1,5).Value =
			 res.results[i].from_user_name;

		sheet.Cells(line+i+1,6).Value =
			 res.results[i].geo;

		sheet.Cells(line+i+1,7).Value =
			 res.results[i].id;

		sheet.Cells(line+i+1,8).Value =
			 "'" + res.results[i].id_str;

		sheet.Cells(line+i+1,9).Value =
			 res.results[i].iso_language_code;

		sheet.Cells(line+i+1,10).Value =
			 res.results[i].metadata.result_type;

		sheet.Cells(line+i+1,11).Value =
			 res.results[i].profile_image_url;

		sheet.Cells(line+i+1,12).Value =
			 res.results[i].profile_image_url_https;

		sheet.Cells(line+i+1,13).Value =
			 res.results[i].source;

		sheet.Cells(line+i+1,14).Value =
			 res.results[i].text;

		sheet.Cells(line+i+1,15).Value =
			 res.results[i].to_user;

		sheet.Cells(line+i+1,16).Value =
			 res.results[i].to_user_id;

		sheet.Cells(line+i+1,17).Value =
			 "'" + res.results[i].to_user_id_str;

		sheet.Cells(line+i+1,18).Value =
			 res.results[i].to_user_name;
	}

	line = line + res.results.length;

	xhr = createXMLHttpRequest();

	if ( xhr == null )
	{
		WScript.Echo("XMLHttpRequestを取得できませんでした");
		return;
	}

	xhr.onreadystatechange = callback;

	xhr.open("GET",
		 "http://search.twitter.com/search.json" + res.next_page,false);

	xhr.send();

	return;
}

// 引数チェック
if ( WScript.Arguments.length < 1 )
{
	WScript.Echo("キーワードを指定してください");
	WScript.Quit(1);
}

//  Excel起動
var excel = new ActiveXObject( "Excel.Application" );

if ( excel == null )
{
	WScript.Echo("Excelの起動に失敗しました");
	WScript.Quit(2);
}

// Excelを表示
excel.Visible = true;

// ワークブックを追加
excel.Workbooks.Add();

// ワークブックを取得
var book = excel.Workbooks( excel.Workbooks.Count );

if ( book == null )
{
	WScript.Echo("ワークブックを取得できませんでした");
	excel.Quit();
	WScript.Quit(3);
}

// ワークシートを取得
sheet = book.WorkSheets("Sheet1");

if ( sheet == null )
{
	WScript.Echo("ワークシートを取得できませんでした");
	excel.Quit();
	WScript.Quit(4);
}

// XMLHttpRequestを取得
xhr = createXMLHttpRequest();

if ( xhr == null )
{
	WScript.Echo("XMLHttpRequestを取得できませんでした");
	excel.Quit();
	WScript.Quit(5);
}

xhr.onreadystatechange = callback;

var url = "http://search.twitter.com/search.json?rpp=100&q=";

var query = "";

for ( var i = 0; i < WScript.Arguments.length; i++ )
{
	var arg = WScript.Arguments(i);
	if ( -1 != arg.indexOf(" ") )
	{
		arg = "\""+encodeURIComponent(arg)+"\""
	}
	else
	{
		arg = encodeURIComponent(arg);
	}
	query = query + arg + " ";
}

query = query.trim();

url = url + query;

xhr.open("GET", url, false);

xhr.send();
posted by FooBuzz at 17:22| Comment(0) | TrackBack(0) | プログラミング | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

この記事へのトラックバックURL
http://blog.seesaa.jp/tb/279925228

この記事へのトラックバック
×

この広告は1年以上新しい記事の投稿がないブログに表示されております。