3

我无法使用从这里获得的以下函数成功地将双缩短 URL 转换为扩展 URL :

function doShortURLDecode($url) {
        $ch = @curl_init($url);
        @curl_setopt($ch, CURLOPT_HEADER, TRUE);
        @curl_setopt($ch, CURLOPT_NOBODY, TRUE);
        @curl_setopt($ch, CURLOPT_FOLLOWLOCATION, FALSE);
        @curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
        $response = @curl_exec($ch);
        preg_match('/Location: (.*)\n/', $response, $a);
        if (!isset($a[1])) return $url;
        return $a[1];
    }

当我得到的扩展 URL 又是一个具有扩展 URL 的缩短 URL 时,我遇到了麻烦。

通过两个 URL 缩短服务后,如何获得最终扩展 URL?

4

4 回答 4

1

由于t.co通过使用 JavaScript 和/或<meta>重定向使用 HTML 重定向,我们需要先获取它的内容。然后从中提取bit.lyURL 以执行 HTTP 标头请求以获取最终位置。此方法不依赖于在服务器上启用 cURL,并使用所有原生 PHP5 函数:

测试和工作!

function large_url($url) 
{
    $data = file_get_contents($url); // t.co uses HTML redirection
    $url = strtok(strstr($data, 'http://bit.ly/'), '"'); // grab bit.ly URL

    stream_context_set_default(array('http' => array('method' => 'HEAD')));
    $headers = get_headers($url, 1); // get HTTP headers

    return (isset($headers['Location'])) // check if Location header set
        ? $headers['Location'] // return Location header value
        : $url; // return bit.ly URL instead
}

// DEMO
$url = 'http://t.co/dd4b3kOz';
echo large_url($url);
于 2013-01-31T07:43:28.500 回答
1

终于找到了一种方法来获取双短网址的最终网址。最好的方法是使用 longurl api。

我不确定这是否是正确的方法,但我终于得到了作为最终 url 所需的输出:)

这是我所做的:

<?php
 function TextAfterTag($input, $tag)
 {
        $result = '';
        $tagPos = strpos($input, $tag);

        if (!($tagPos === false))
        {
                $length = strlen($input);
                $substrLength = $length - $tagPos + 1;
                $result = substr($input, $tagPos + 1, $substrLength); 
        }

        return trim($result);
 }

 function expandUrlLongApi($url)
 {
        $format = 'json';
        $api_query = "http://api.longurl.org/v2/expand?" .
                    "url={$url}&response-code=1&format={$format}";
        $ch = curl_init();
        curl_setopt ($ch, CURLOPT_URL, $api_query );
        curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt ($ch, CURLOPT_CONNECTTIMEOUT, 0);
        curl_setopt($ch, CURLOPT_HEADER, false);
        $fileContents = curl_exec($ch);
        curl_close($ch);
        $s1=str_replace("{"," ","$fileContents");
        $s2=str_replace("}"," ","$s1");
        $s2=trim($s2);
        $s3=array();
        $s3=explode(",",$s2);
        $s4=TextAfterTag($s3[0],(':'));
        $s4=stripslashes($s4);
        return $s4;
 }
 echo expandUrlLongApi('http://t.co/dd4b3kOz');
?>

我得到的输出是:

"http://changeordie.therepublik.net/?p=371#proliferation"

上面的代码有效。

@cryptic 共享的代码也是正确的,但我无法在我的服务器上得到结果(可能是因为一些配置问题)。

如果有人认为它可以通过其他方式完成,请随时分享。

于 2013-02-01T06:40:48.453 回答
0

也许您应该只使用CURLOPT_FOLLOWLOCATION= true 然后确定您被定向到的最终 URL。

于 2013-01-31T07:38:18.727 回答
0

如果问题不是t.co 或 a 中的 Javascript 重定向<META http-equiv="refresh"...,则可以很好地解决 stackexchange URL https://stackoverflow.com/q/62317

public function doShortURLDecode($url) {
    $ch = @curl_init($url);
    @curl_setopt($ch, CURLOPT_HEADER, TRUE);
    @curl_setopt($ch, CURLOPT_NOBODY, TRUE);
    @curl_setopt($ch, CURLOPT_FOLLOWLOCATION, FALSE);
    @curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
    $response = @curl_exec($ch);
    $cleanresponse= preg_replace('/[^A-Za-z0-9\- _,.:\n\/]/', '', $response);
    preg_match('/Location: (.*)[\n\r]/', $cleanresponse, $a);
    if (!isset($a[1])) return $url;
    return parse_url($url, PHP_URL_SCHEME).'://'.parse_url($url, PHP_URL_HOST).$a[1];
}

它会清除任何特殊字符的响应,这些字符可能会出现在 curl 输出中,然后再剪切出结果 URL(我在 php7.3 服务器上遇到了这个问题)

于 2019-07-15T09:23:58.460 回答