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