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 {
        }
    }
}