PHPでSSLサイトやLocation:飛ばしのサイトを読む

ブログパーツのPHP化で、ソケット対応をしたので、記録しておく。

  • PHPがインストールされているかチェックする
        <script src="http://code.jquery.com/jquery-1.6.2.min.js"></script>
        <script>
        $(document).ready(function()
        {
                //POSTメソッドで送るデータを定義します var data = {パラメータ名 : 値};
                var data = {request : $('#request').val()};
                $.ajax({
                    type: "POST",
                    url: "send.php",
                    data: data,
                    success: function(data, dataType)
                    {
                        if (data.slice(0,2)=="OK") {
    			document.getElementsByName('jsphp')[0].value = "PHP";
    			document.getElementById('ifrm').outerHTML = '<iframe id="WPifrm" frameborder=0 height=8 src="" ></iframe>';
    		    }
    		    else document.getElementByName('jsphp')[0].value = "legacy";
                    },
                    error: function(XMLHttpRequest, textStatus, errorThrown)
                    {
                        // レガシーモードのまま
                        document.getElementByName('jsphp')[0].value = "legacy";
                    }
                });
                return false;
        });
        </script>
    
  • send.php
    <?php
    header("Content-type: text/plain; charset=UTF-8");
    if (isset($_POST['request']))
    {
        echo "OK";
    }
    else
    {
        echo 'The parameter of "request" is not found.';
    }
    ?>
    
  • HTMLページのソケット読み
    //ソケットでデータを取得 by 村田佑介、 SSL追加 by Fujii
    function data_get($url,$authuser="",$authpass=""){
    	global $base;
    	unset($basic);
    	$tmp = parse_url($url);
    	if($tmp['query']){
    	    $tmp['path'] .=  "?".$tmp['query'];
    	}
    	if($tmp['fragment']){
    //            $tmp['path'] .= "#".$tmp['fragment'];
    	}
    	if ($tmp['scheme']=="http")
    	 $fp = fsockopen($tmp['host'], 80, $errno, $errstr, 4); // 80番ポートに接続
    	elseif ($tmp['scheme']=="https")
    	 $fp = fsockopen("ssl://".$tmp['host'], 443, $errno, $errstr, 4); // 443番ポートに接続
    	else print "Scheme invalid. {$tmp['scheme']}";
    	if(!$fp){
    	    print $errno.":".$errstr; 
    	    return array("status" => "connect_fail","msg" => $errstr);
    	}
    	$base = $tmp['scheme']."://".$tmp['host']."/";
    	$out = "GET {$tmp['path']} HTTP/1.1\r\n"."Accept: */*\r\n"."Content-Type: application/x-www-form-urlencoded\r\n";
    	$out .= "Host: {$tmp['host']}\r\n";
    	$out .= "User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/38.0.2125.111 Safari/537.36\r\n";
    	if($authuser){
    	    $out .= "Authorization: Basic ".base64_encode($authuser.":".$authpass)."\r\n"; 
    	}
    	$out .= "Connection: Close\r\n\r\n";
    	fwrite($fp, $out);
    	stream_set_timeout($fp, 4);
    	//コンテンツ部分の受信
    	$in = '';
    	while (!feof($fp)) {
    	    $in .= fgets($fp, 4096);
    	}
    	fclose($fp);
    	//ヘッダーとコンテンツ部分に分割
    	$in = explode("\r\n\r\n",$in);
    	//ヘッダーを配列に格納
    	$info = decode_header($in[0]);
    	if ($info['status']=="301" || $info['status']=="302") {
    		// Moved Parmanentry or Temporary
     print $info['location']."<br>";
    		if (substr($info['location'],0,6)=="/leaf/") // goo,OCNの深い層
    		  return(put_dict("http://".$tmp['host'].$info['location'],
    			'<!--wordTitle-->','<!--/wordTitle-->','+'));
    		else {
    		  return(data_get(((substr($info['location'],0,4)=='http')?
    		   "":$tmp['scheme']."://".$tmp['host']).$info['location'],
    		 	$authuser,$authpass));
    		}
    	}
    	//デコード
    	unset($in[0]);//ヘッダー削除
    	$in = join("\r\n\r\n",$in);
    	$body = decode_body($info, $in);
    	return mb_convert_encoding($body, "UTF-8","auto");
    }
    	
    function decode_header($str){
    	//<CRLF>ごとに分割
    	$part = preg_split("/\n/", $str, -1, PREG_SPLIT_NO_EMPTY);
    	$out = array ();
    	for ($h = 0; $h < sizeof($part); $h++) {
    	    if ($h != 0) {
    		// :で区切ってkeyとvalueを作成
    		$pos = strpos($part[$h], ':');
    		$k = strtolower(str_replace(' ', '', substr($part[$h], 0, $pos)));
    		$v = trim(str_replace("\r", '',substr($part[$h], ($pos + 1))));
    	    } 
    	    else{
    		//1行目ステータスコード
    		$k = 'status';
    		$v = explode (' ', $part[$h]);
    		$v = $v[1];
    	    }
    	    //keyとvalueを配列に格納
    	    if ($k == 'set-cookie') $out['cookies'][] = $v;
    	    else		    $out[$k] = $v;
    	}
    	return $out;
    }
         
    function decode_body ($info, $str, $eol = "\n"){
    	$tmp = str_replace("\r", '',$str);
    	$add = strlen($eol);
    	//チャンク形式の判定
    	if (isset($info['transfer-encoding']) &&
    		 ($info['transfer-encoding'] == 'chunked')) {
    	    do {
    		//チャンクサイズを取得して10進数に変換
    		$tmp = ltrim($tmp);
    		$pos = strpos($tmp, $eol);
    		$len = hexdec(substr($tmp, 0, $pos));
    		if (!is_int($len)) break;               
    		//圧縮転送されている場合解凍する
    		if (isset($info['content-encoding'])) {
    		    $str2 .= gzinflate(substr($tmp, ($pos + $add + 10), $len));
    		} 
    		else{
    		    $str2 .= substr($tmp, ($pos + $add), $len);
    		}
    		$tmp = substr($tmp, ($len + $pos + $add));
    		$check = trim($tmp);
    	    } while (!empty($check));
    	}
    	elseif(isset($info['content-encoding'])) {
    	//圧縮転送されている場合解凍する
    	    $str2 = gzinflate(substr ($tmp, 10));
    	}
    	else    $str2 = $str;
    	return $str2;
    }
    ?>
    
カテゴリー: テスト パーマリンク

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です