Flash でソケットを使って生 HTTP を送ってみた
Flash からログインしないと見れないデータを取得する方法です。
最初は flash.net.URLLoader を使って、requestHeaders に Cookie を指定してみたのですが、例外が出て使えませんでした・・(API ドキュメントにはそんなこと書いてないのに!)。
仕方がないのでソケットを使って接続してみました。ActionScript 3.0 からはソケットを扱えるようになったので、ポート80番を開いて生の HTTP リクエストを投げれば Cookie を付与することも可能です。
どちらにしてもあらかじめセッションIDをなんらかの方法で取得する方法があります。
HttpGetter.as
package { import flash.display.Sprite; import flash.events.Event; import flash.events.ProgressEvent; import flash.net.Socket; import flash.system.Security; import flash.text.TextField; public class HttpGetter extends Sprite { private var txt1:TextField; private var soc:Socket; private var str:String; public function HttpGetter() { //Security.loadPolicyFile("http://example.com/crossdomain.xml"); txt1 = new TextField(); txt1.width = 300; txt1.height = 300; txt1.multiline = true; this.addChild(txt1); soc = new Socket(); soc.addEventListener(Event.CONNECT, connectHandler); soc.addEventListener(ProgressEvent.SOCKET_DATA, dataHandler); soc.addEventListener(Event.CLOSE, closeHandler); soc.connect("example.com", 80); } private function connectHandler(event:Event):void { soc.writeUTFBytes("GET /some/where HTTP/1.1\n"); soc.writeUTFBytes("Host: example.com\n"); soc.writeUTFBytes("User-Agent: Mozilla/5.0\n"); soc.writeUTFBytes("Cookie: SESSIONID=xxxxxxxxxxx\n\n"); soc.flush(); } private function dataHandler(event:Event):void { str += soc.readUTFBytes(soc.bytesAvailable); txt1.text = str; } private function closeHandler(event:Event):void { } } }