とりあえず整理したのでアップロード。
とりあえず整理したのでアップロード。
<?php$dummyCookie = array();$redirect_count = 0;//リターンモデルを作る$returns = array( "req_head" => array(), "res_head" => array() );/*$url : URL$port : ポート$method : GET, POST, HEADのいずれか(デフォルトはGET)$headers : リクエストヘッダ("ヘッダ名"=>"値")3$cc : クッキー$post : POSTの時に送信するデータを格納した配列("変数名"=>"値")*/function http($url, $port=80, $method="GET", $headers=null, $cc=null, $post=array("")){global $dummyCookie;global $returns;global $redirect_count;//URLを分解$URL = parse_url($url);//クエリーif (isset($URL['query'])) {$URL['query'] = "?".$URL['query'];} else {$URL['query'] = "";}//デフォルトのポートは80$URL['port'] = $port;if( !array_key_exists( "host", $URL ) ){$URL['host'] = "sp.mbga.jp";$URL['path'] = "/".$URL['path'];}//リクエストライン$request = $method." ".$URL['path'].$URL['query']." HTTP/1.1\r\n";$request .= "Host: ".$URL['host']."\r\n";//ヘッダif( $headers != null ){foreach( $headers as $k => $h ){$request .= $k.":".$h."\r\n";}}//クッキー分解してストアif( $cc ){$cc = str_replace( "Cookie: ", "", $cc );$sep = explode( ";", $cc );//受け取ったクッキーパラメータをストアforeach( $sep as $c ){$d = explode( "=", $c );if( strcmp( trim($d[0]), "" ) ){$dummyCookie[trim($d[0])] = trim($d[1]);}}}//クッキー結合if( $dummyCookie != null ){$request .= "Cookie: ";foreach( $dummyCookie as $key => $cookie ){if( $cookie != null ){$request .= "{$key}={$cookie}; ";}}$request .= "\r\n";}$request .= "x-msim-use: on\r\n";//POSTの時はヘッダを追加して末尾にURLエンコードしたデータを添付if (strtoupper($method) == "POST") {while (list($name, $value) = each($post)) {$POST[] = $name."=".urlencode($value);}$postdata = implode("&", $POST);$request .= "Content-Type: application/x-www-form-urlencoded\r\n";$request .= "Content-Length: ".strlen($postdata)."\r\n";$request .= "\r\n";$request .= $postdata;} else {$request .= "\r\n";}$request .= "\r\n\r\n";//var_dump($dummyCookie);//WEBサーバへ接続$err = "";if( $port == 443 ){$fp = fsockopen("ssl://".$URL['host'], $URL['port']);}else{$fp = fsockopen($URL['host'], $URL['port']);}//接続に失敗した時の処理if (!$fp) {die("ERROR\n");}//Timeoutを2秒にstream_set_timeout($fp, 2);//要求データ送信fwrite($fp, $request);//応答データ受信$response = "";$Cnt=0;$redirect = null;while (!feof($fp)){$line = fgets($fp, 1024);$response .= $line;if( strpos($line, "Set-Cookie") !== false ){//キーパース$line = str_replace( "Set-Cookie: ", "", $line );$elements = explode( ";", $line );//設定をパース$kvp = explode( "=", array_shift($elements) ); //VALUE取得$key_name = $kvp[0];$value = $kvp[1];$expire=null;$path=null;$domain=null;$secure=null;$httponly=null;foreach( $elements as $elm ){$kvp = explode( "=", $elm );switch( $kvp[0] ){case "expire":$expire = $kvp[1];break;case "path":$path = $kvp[1];break;case "domain":$domain = $kvp[1];break;case "secure":$secure = $kvp[1];break;case "httponly":$httponly = $kvp[1];break;}}$dummyCookie[$key_name] = $value; //( $key_name, $value, $expire, $path, $domain, $secure, $httponly );}if( strpos($line, "Location") !== false ){$redirect = trim(str_replace( "Location: ", "", $line ));}//if( stripos($line, "Content-Type") !== false ) break;}//ヘッダ部分とボディ部分を分離$DATA = explode("\r\n\r\n", $response, 2);//リクエストヘッダをコメントアウトして出力//echo "<!-- resuest headers \r\n {$request} -->";$returns["req_head"][] = str_replace( "\r\n", "<BR>", $request );//レスポンスヘッダをコメントアウトして出力//echo "<!-- response headers \r\n {$DATA[0]} -->";$returns["res_head"][] = str_replace( "\r\n", "<BR>", $DATA[0] );$redirect_count = 0;//echo "<hr><hr>";if( $redirect != null ){$redirect_count++;if($redirect_count>2){//リダイレクト三回でexitexit;}//echo "redirect to:".$redirect;//接続を終了fclose($fp);$fp = null;$returns["body"][] = $DATA[1];$DATA[1] = http($redirect, 80, "GET", "Referer: {$redirect}");}//接続を終了if($fp){fclose($fp);}//メッセージボディを出力return $DATA[1];}//////////////////////////////////////////////////////////////////////////////////////////////////////// ここから本体//// アクセスにフックをかけるロガータイプのソースですが// 改造することで、HTML解析スクリプトとして利用できます。// コマンドラインからのアクセスも可能です。////////GETかPOSTのどっちかで変数拾ってくるfunction GetParam( $name ){$ret = null;if(isset($_GET[$name])) {$ret = $_GET[$name];}if(isset($_POST[$name])) {$ret = $_POST[$name];}return $ret;}//リクエスト$url = GetParam("url");$port = GetParam("port");$method = GetParam("mt");$cookie = GetParam("c");$postParam = GetParam("pp");$url="";//やや雑な値チェックif( $url === null ){echo "URLが無いです";exit;}if( $port == null ){$port = 80;}if( $method === null ){$method = "GET";}//HTMLからPOST値もらうときのパーサ$params = array();if( $postParam ){$ar = explode( ",", $postParam );foreach( $ar as $a ){$d = explode( "::", $a );$params[$d[0]] = $d[1];}}//リクエストヘッダ//スマホからm○bageにハックする仕様になってる$request_header = array();//$request_header["Referer"] = "";$request_header["User-Agent"] = "Mozilla/5.0 (iPhone; U; CPU iPhone OS 4_2_1 like Mac OS X; ja-jp) AppleWebKit/532.9 (KHTML, like Gecko) Version/4.0.5 Mobile/8C148 Safari/6531.22.7";$request_header["Accept"] = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8";$request_header["Accept-Language"] = "ja,en-us;q=0.7,en;q=0.3";$request_header["Accept-Encoding"] = "gzip,deflate";$request_header["Accept-Charset"] = "Shift_JIS,utf-8;q=0.7,*;q=0.7";$request_header["Keep-Alive"] = "115";$request_header["Connection"] = "keep-alive";/*//Basic認証用のヘッダif ($user && $pass) {$request_header["Authorization"] = "Basic ".base64_encode($user.":".$pass);}*///Webリクエスト//$body = http( $url, $port, $method, $request_header, $cookie, $params );$body = http( "https://www.google.co.jp/", 80, "GET", $request_header, null, null );//本体を表示する(したい場合は)//echo $body;////////解析するならここで$bodyをごにょごにょする////////以下データ出力は任意に//リクエストヘッダ描画/*$counts = count($returns["req_head"]);for( $i=0; $i<$counts; $i++ ){echo "リクエスト<br />";echo $returns["req_head"][$i];echo "<hr>";echo "レスポンス<br />";echo $returns["res_head"][$i];echo "<hr>";}*///ファイル出力/*$fp = fopen( "http.txt", "w" );if( $fp ){fwrite($fp,$body,strlen($body));fclose($fp);}*///HTMLからのクロール用に出力するもの/*//ストアしたクッキーパラメータをHTMLに返す$cookies = "";if( $dummyCookie != null ){$cookies .= "Cookie: ";foreach( $dummyCookie as $key => $cookie ){if( $cookie != null ){$cookies .= "{$key}={$cookie}; ";}}$cookies .= "\r\n";}$c_enc = urlencode($cookies);$c_enc = str_replace( "+", "%20", $c_enc );*//* 外部クローラ用コールバックecho "<script type='text/javascript'>";echo "req_callback(\"".$c_enc."\")";echo "</script>";*/?>