f8g

WinHTTP で Ajax っぽく

mixi にログイン。ActiveX のイベント捕捉の仕方分からんので、タイマー使ってチェック。Optionでもっと楽にできたりして。

window.onload = function(){
	var WinHttpReq = new ActiveXObject("WinHttp.WinHttpRequest.5.1");
	WinHttpReq.open("POST", "https://mixi.jp/login.pl", true);
	WinHttpReq.send("next_url=%2Fhome.pl&email=email&password=password&x=51&y=8");
	document.body.innerHTML = "loading";

	var cookies;
	var timer = setInterval(function(){
		try{
			document.body.innerHTML = WinHttpReq.Status;
			cookies = login();
			clearInterval(timer);

			timer = setInterval(function(){
				try{
					display(cookies);
					clearInterval(timer);
				}
				catch(e){ document.body.innerHTML += "\u25A0"; }
			}, 1000);
		}
		catch(e){ document.body.innerHTML += "\u25A0"; }
	}, 1000);

	function login(){
		var headers = WinHttpReq.GetAllResponseHeaders().split("\n");
		var cookies = [];

		for(var i = 0, l = headers.length; i < l; i++)
			if( headers[i].match(/^Set\-Cookie:\s(.*);\s.*$/) )
				cookies.push(RegExp.$1);
		return cookies;
	}

	function display(cookies){
		WinHttpReq.open("GET", "http://mixi.jp/home.pl");
		WinHttpReq.SetRequestHeader( "Cookie", cookies.join("; ") )
		WinHttpReq.send();

		document.body.innerHTML = "<p>" + [
			WinHttpReq.Status,
			WinHttpReq.GetAllResponseHeaders().split("\n").join("<br>"),
			WinHttpReq.ResponseText
		].join("</p><p>") + "</p>";
	}
}

ActiveX のイベントってどうやって捕捉するんだ。MSXML の onreadystatechange はプロパティだから同じように扱えないんだよなー。