とりあえず整理したのでアップロード。
とりあえず整理したのでアップロード。
<?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)
{
//リダイレクト三回でexit
exit;
}
//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>";
*/
?>