2013-08-16 73 views
2

我只有fsockopen在我的服務器上使用。我的意思是我不能使用cURL或file_get_contents。我使用PHP 通過PHP - 使用fsockopen(skype username check)獲取頁面內容?

我想有一個Skype的用戶名驗證的方式,所以我發現從其他話題此鏈接:

https://login.skype.com/json/validator?new_username=anyUserName

本頁面響應爲有效或無效用戶名爲JSON輸出: {「status」:200,「status_text」:「valid」,「data」:{「markup」:「」,「alternatives」:false,「fieldDetails」:「」}}

它說有效,所以這個用戶名不存在。我可以解析這些數據,看看它是否正確。

我的問題是,我怎麼能得到這個HTTPS網頁內容與的fsockopen,我可以打開我嘗試讀取數據插座,但我有許多片段,我從論壇上得到了失敗的次數太多。因爲我不知道該怎麼做,即使你不能寫代碼,請告訴我還是告訴我一個辦法呢?

基本上,如何返回skype ID狀態與fsockopen 在PHP,我很樂意獲得評論,先謝謝你們。

回答

0

如果你在你的php中有openssl,你應該可以用'ssl://''tls://'作爲主機名或ip的前綴,並帶有正確的端口號,而php應該處理其餘的。所以簡單地這樣:

fsockopen('ssl://78.141.177.180', 443, $errno, $errstr); 

並像往常一樣使用返回的資源。 當我沒有捲曲可用時,我自己使用下面的功能(代碼從php.net comment打撈並稍微按摩)。這樣稱呼它

not_curl_get('login.skype.com/json/validator?new_username=foo', 'ssl://', 443) 

函數本身:

function not_curl_get($url, $protocol = '', $port = 80, $options = array()) { 
    $options = array_merge(array(
     'follow_location'  => true, 
     'return_response_part' => 'body', 
     'referer'    => false, 
     'user_agent'   => 'Mozilla/5.0 (Windows; U; Windows NT 5.1; hu; rv:1.9.1.2) Gecko/20090729 Firefox/3.5.2 (.NET CLR 3.5.30729)', 
     'cookie_file'   => false, 
     'request_type'   => 'get', 
    ), $options); 

    global $_NOT_CURL_GET_OLDHEADER; 
    $url = str_replace("http://","",$url); 
    if (preg_match("#/#","$url")){ 
     $page = $url; 
     $url = @explode("/",$url); 
     $url = $url[0]; 
     $page = str_replace($url,"",$page); 
     if (!$page || $page == ""){ 
      $page = "/"; 
     } 
     $ip = gethostbyname($url); 
    }else{ 
     $ip = gethostbyname($url); 
     $page = "/"; 
    } 
    $open = fsockopen($protocol.$ip, $port, $errno, $errstr, 60); 
    if ($options['request_type'] === 'post'){ 
     $send = "POST $page HTTP/1.0\r\n"; 
    }else{ 
     $send = "GET $page HTTP/1.0\r\n"; 
    } 
    $send .= "Host: $url\r\n"; 
    if ($options['referer']){ 
     $send .= "Referer: ".$options['referer']."\r\n"; 
    } 
    if ($options['cookie_file']){ 
     if (@file_exists($options['cookie_file'])){ 
      $cookie = urldecode(@file_get_contents($options['cookie_file'])); 
      if ($cookie){ 
       $send .= "Cookie: $cookie\r\n"; 
       $add = @fopen($options['cookie_file'],'w'); 
       fwrite($add,""); 
       fclose($add); 
      } 
     } 
    } 
    $send .= "Accept-Language: en-us, en;q=0.50\r\n"; 
    if ($options['user_agent']){ 
     $send .= "User-Agent: ".$options['user_agent']."\r\n"; 
    } 
    if ($options['request_type']){ 
     $send .= "Content-Type: application/x-www-form-urlencoded\r\n"; 
     $send .= "Content-Length: " .strlen($options['request_type']) ."\r\n\r\n"; 
     $send .= $options['request_type']; 
    }else{ 
     $send .= "Connection: Close\r\n\r\n"; 
    } 
    fputs($open, $send); 
    $return = ''; 
    while (!feof($open)) { 
     $return .= fgets($open, 4096); 
    } 
    fclose($open); 
    $return = @explode("\r\n\r\n",$return,2); 
    $header = $return[0]; 
    if ($options['cookie_file']){ 
     if (preg_match("/Set\-Cookie\: /i","$header")){ 
      $cookie = @explode("Set-Cookie: ",$header,2); 
      $cookie = $cookie[1]; 
      $cookie = explode("\r",$cookie); 
      $cookie = $cookie[0]; 
      $cookie = str_replace("path=/","",$cookie[0]); 
      $add = @fopen($options['cookie_file'],'a'); 
      fwrite($add,$cookie,strlen($read)); 
      fclose($add); 
     } 
    } 
    if ($_NOT_CURL_GET_OLDHEADER){ 
     $header = "$_NOT_CURL_GET_OLDHEADER<br /><br />\n$header"; 
    } 
    if ($return[1]){ 
     $body = $return[1]; 
    }else{ 
     $body = ""; 
    } 
    if ($options['return_response_part'] === 'body'){ 
     $return = $body; 
    } 
    if ($options['return_response_part'] === 'head'){ 
     $return = $header; 
    } 
    if ($options['return_response_part'] === 'all'){ 
     $return = "$header$body"; 
    } 
    if ($options['follow_location']){ 
     if (preg_match("/Location\:/","$header")){ 
      $url = @explode("Location: ",$header); 
      $url = $url[1]; 
      $url = @explode("\r",$url); 
      $url = $url[0]; 
      $_NOT_CURL_GET_OLDHEADER = str_replace("\r\n\r\n","",$header); 
      $l = "&#76&#111&#99&#97&#116&#105&#111&#110&#58"; 
      $_NOT_CURL_GET_OLDHEADER = str_replace("Location:",$l,$_NOT_CURL_GET_OLDHEADER); 
      return not_curl_get($url, $protocol, $port, $options); 
     }else{ 
      return $return; 
     } 
    }else{ 
     return $return; 
    } 
} 
+0

您好,非常感謝你的努力,卜這種方式不會返回我頁面的內容,它的響應HTTP等所需物品。好吧等我其實需要完全file_get_contents我認爲的功能..你確定這是什麼回報?因爲關於我的主機的可能性再次出現了一些權限問題..順便說一下,這個腳本有一個無限循環問題。 – questioner

+0

我不確定你的環境中發生了什麼,這個函數似乎對我很有用(見[demo](http://codepad.viper-7.com/GPQKF8))。無限循環的唯一可能性應該是當服務器始終發送「位置」標題時,但可以使用選項數組禁用它。 – complex857

+0

我是個好兄弟,非常感謝,我會盡力解決我的主機帳戶上的問題。感謝您的所有努力。 ALl最好.. – questioner