現在地をGPSで取得してtwitterに送る
WSH。ActiveScriptRubyが必要。あと、GPSはコメットUSB/3とかいうやつ。
var user = "username"; var pass = "password"; var invGeocoderURL = "http://nishioka.sakura.ne.jp/google/ws.php"; var xhr = new ActiveXObject("MSXML2.XMLHTTP"); var sc = new ActiveXObject("ScriptControl"); sc.Language = "RubyScript"; sc.AddCode([ 'require "wincom"', 'def open', ' s = Serial.new', ' s.open(7, 11, 4800, 8, 0, 0, 1024, 1)', ' return s', 'end', 'def get(s)', ' s.receive', 'end', 'def close(s)', ' s.close()', 'end'].join("\n")); var ruby = sc.CodeObject; var gps = ruby.open(); while(true){ try{ var data = ruby.get(gps).split("\n"); WScript.Echo(data.join("\n")) for(var i = 0; i < data.length; i++){ if( data[i].match(/\$GPGGA/) ){ var GPGGA = data[i].split(","); var lat_s = GPGGA[2]; var lng_s = GPGGA[4]; } else if( data[i].match(/\$GPRMC/) ){ var GPRMC = data[i].split(","); var lat_s = GPRMC[3]; var lng_s = GPRMC[5]; } } if(lat_s && lng_s){ var lat = toLat(lat_s); var lng = toLng(lng_s); if( isNaN(lat) || isNaN(lng) ) gps_close(); xhr.open("GET", invGeocoderURL + "?" + makeParam({lat:lat, lon:lng, format:"simple"}), false); xhr.send(); var rXML = xhr.responseXML; var pref = rXML.getElementsByTagName("pref")[0].childNodes[0].nodeValue; var city = rXML.getElementsByTagName("city")[0].childNodes[0].nodeValue; WScript.Echo(["location:", pref, city]); xhr.open('POST', "http://twitter.com/statuses/update.json", false, user, pass); xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded'); xhr.setRequestHeader('X-Twitter-Client', 'SendLocationToTwitter'); xhr.send( 'status=' + encodeURIComponent("Location: " + pref + city) ); gps_close(); } } catch(e){ continue; } WScript.Sleep(1000); } function gps_close(){ ruby.close(gps); WScript.Quit(); } function toLat(s){ return parseFloat( s.substr(0, 2) ) + parseFloat( s.substr(2, s.length - 1) ) / 60; } function toLng(s){ return parseFloat( s.substr(0, 3) ) + parseFloat( s.substr(3, s.length - 1) ) / 60; } function makeParam(params){ var param = []; for(var k in params) param.push(k + "=" + params[k]); return param.join("&"); }
逆ジオコーダーは、
http://www.knya.net/archives/2005/07/rest.html
のを使ってます。結構細かいところまで出ますが、cityまでしか送らないようにしてます。というか、あんまり当てになんない。
あーあと、Rubyのシリアルポートのは
http://d.hatena.ne.jp/arikui/20070410#1176197167
のやつ使ってます。Windows限定。
追記
見直してみたらダメな部分があるな。そのまま使わない方がいいですね。
追記2:直しておいた