【问题标题】:PHP - get a page content with fsockopen (skype username check)?PHP - 使用 fsockopen(Skype 用户名检查)获取页面内容?
【发布时间】:2013-08-16 02:46:18
【问题描述】:

我的服务器上只有 fsockopen 可以使用。我的意思是我不能使用 cURL 或 file_get_contents。顺便说一下,我正在使用 PHP

我想要一个Skype用户名验证,所以我从另一个主题中找到了这个链接:

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

此页面响应为有效或无效的用户名作为 JSON 输出: {"status":200,"status_text":"valid","data":{"markup":"","alternatives":false,"fieldDetails":""}}

它说有效,所以这个用户名不存在。我可能会解析这些数据,看看它是否正确。

我的问题是,我如何使用 fsockopen 获取此 https 页面内容,我可以打开套接字我尝试读取数据但我失败了太多次,因为我从中获得了许多 sn-ps论坛。因为我不知道该怎么做,即使你不会写代码也请告诉我或告诉我一个方法吗?

基本上,如何使用 fsockopen 在 PHP 中返回 skype id 状态,我会很高兴获得 cmets,提前谢谢各位。

【问题讨论】:

    标签: php validation skype fsockopen


    【解决方案1】:

    如果你的 php 中有 openssl,你应该能够在主机名或 ip 前加上 'ssl://''tls://' 并使用正确的端口号,其余的应该由 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;
        }
    }
    

    【讨论】:

    • 嗨,非常感谢您的努力,但是这种方式不会返回页面内容,它会像 HTTP Req 一样响应。好的等等。我认为我实际上需要 file_get_contents 的功能。你确定这到底返回了什么吗?因为关于我的主机的可能性再次出现了一些权限问题..顺便说一下这个脚本有一个无限循环问题。
    • 我不确定您的环境中发生了什么,该功能似乎对我有用(见demo)。无限循环的唯一可能性应该是服务器始终发送location 标头,但您可以使用选项数组禁用它。
    • 你太棒了兄弟,非常感谢,我会尝试解决我主机帐户的问题。感谢您的所有努力。一切都好..
    猜你喜欢
    • 2014-05-14
    • 1970-01-01
    • 1970-01-01
    • 2012-01-23
    • 1970-01-01
    • 2015-12-16
    • 1970-01-01
    • 1970-01-01
    • 2011-02-11
    相关资源
    最近更新 更多