久方ぶりのプログラミングネタ。ブログのジャンルが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();