PHP-如何由短网址得到缩短之前的真实网址?

小组聊天灌水 小组聊天灌水 主题:993 回复:2175

PHP-如何由短网址得到缩短之前的真实网址?

瑾兮 发布于 2017-02-17 字数 0 浏览 1363 回复 5

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

支持 Markdown 语法,需要帮助?

评论(5

晚风撩人 2017-10-23 5 楼

提供一个完整的短网址还原的程序,支持还原goo.gl、adf.ly、t.co、t.cn等国内外300多种短网址。
代码如下:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"&gt;
<html xmlns="http://www.w3.org/1999/xhtml"&gt;

<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>短网址还原 - 短网址分析 - 短网址真实网址</title>
<link rel="stylesheet" type="text/css" href="css/css.css" />
</head>
<body>
<?php

error_reporting(E_ALL^E_NOTICE^E_WARNING);

////////////信息输出,可通过CSS控制输出样式,START/////////////
$info[1] = '亲!不是短网址或暂不支持还原。';
$info[2] = '真实网址为:<br/><br/>';
$info[3] = '↓<br/><a href="';
$info[4] = '" target="_blank">';
$info[5] = '</a><br/>';
$info[6] = '亲!不是短网址或已失效。';
$info[7] = '<a href="';
////////////////////////信息输出,END/////////////////////////

/////////////////////主函数,勿修改,START///////////////////
function unshort($url)
{
global $info;
$UrlHeader = (get_headers($url,1));
$UnurlHeader1 = $UrlHeader[Location];
$UnurlHeader2 = $UrlHeader[location];
if (!empty($UnurlHeader1)){
$unurl = $UnurlHeader1;
}
else {
$unurl = $UnurlHeader2;
}
if ($unurl==''){
echo $info[6];
}
else {
if(is_array($unurl)) {
$count_url = count($unurl);
if ($count_url>10) { //一次性还原的至多跳转数
$count_url = 10; //防止死循环
}
for ($i=0;$i<$count_url;$i++){
echo $info[3].$unurl[$i].$info[4].$unurl[$i].$info[5];
}
}
else {
$unurl = $info[7].$unurl.$info[4].$unurl.$info[5];
echo $unurl;
}
}
}

function adfunshort($url)
{
global $info;
$c = file_get_contents($url);
list($version,$status_code,$msg) = explode(' ',$http_response_header[0], 3);
if ($status_code == '302') {
$unurl = unshort($url);
}
else{
$p = "/url = '(.)';/isU";
preg_match($p, $c, $content);
$unurl = $content[1];
$html = file_get_contents($unurl);
list($version,$status_code,$msg) = explode(' ',$http_response_header[0], 3);
if ($status_code == '200') {
$d = file_get_contents($unurl);
$f = "/0; URL=(.
)">/isU";
preg_match($f, $d, $content2);
$unurl = $content2[1];
if ($unurl==''){
echo $info[6];
}
else{
$unurl = $info[7].$unurl.$info[4].$unurl.$info[5];
echo $unurl;
}
}
else {
$unurl = unshort($unurl);
}
}
}
/////////////////////主函数,END///////////////////////////
?>

<!---HTML页面,START-->

<div id="all">
<div id="logo">短网址还原 - UnShortURL</div>

<div id="form">
<form action="" method="POST">
短网址:<input type="text" name="turl" class="inurl" size="26" />
<input type="hidden" name="url_done" value="done" />
<input type="submit" value="还原" class="suburl" />
</form>
</div>

<div id="trurl">

<?php
//预处理开始
$turl = trim($_POST['turl']);
$url_done= $_POST['url_done'];
global $info;
if ($url_done == 'done'){
$http = substr($turl,0,7);
if ($http != 'http://' && $http != 'https:/'){
$turl = 'http://'.$turl;
}
$tturl = substr($turl,0,11);
if ($tturl == 'http://adf.'){
echo $info[2];
$longurl = adfunshort($turl);
}
else {
echo $info[2];
$longurl = unshort($turl);
}
}
//预处理结束
?>
</div>

<div id="surported">支持还原goo.gl、adf.ly、t.co、t.cn等国内外300多种短网址。</div>
<div id="hr"><hr></div>

<!--HTML,END-->

</body>
</html>

CSS代码:

 body { margin:0 auto; width:700px; font-size:14px;}

a:link {text-decoration:none; color:gray;}
a:visited {text-decoration:none; color:gray;}

all {}

logo { font-size:22px; font-weight:bold; text-align:center; margin-top:100px;}

form { text-align: center;margin-top:35px;}

trurl {text-align: center; margin:25px auto; line-height:20px;}

surported { text-align:center; font-weight:bold;margin-top:50px}

hr { width:500px; margin:5px 100px;}

powered { font-size:12px; text-align:center;}

清晨说ぺ晚安 2017-10-19 4 楼

可以用程序请求下短网址,获取响应头信息就可以了,通常短网址是进行了302跳转,并且响应有Location 信息。下边以新浪微博的短网址举例:

  $url = "http://t.cn/zWlRz8s";

$info = parse_url($url);
$fp = fsockopen($info['host'], 80,$errno, $errstr, 30);
fputs($fp,"GET {$info['path']} HTTP/1.1rn");
fputs($fp, "Host: {$info['host']}rn");
fputs($fp, "Connection: closernrn");
$rewrite = '';
while(!feof($fp)) {
    $line = fgets($fp);
    if($line != "rn" ) {
        if(strpos($line,'Location:') !== false) {
            $rewrite = str_replace(array("r","n","Location: "),'',$line);
        }
    }else {
        break;
    }
}
var_dump($rewrite);

上例输出: string(58) "http://iphone.myzaker.com/l.php?l=5025f27377cd62f90a000000"

也就是短网址对应的真实网址, 上边程序可以用php 的get_headers()来代替,但是需要注意的是 这个函数接受到302跳转时会自动请求跳转的地址,如果跳转后的地址出现跳转后会继续请求新的地址,可能会有多次的情况,所以只拿第一次跳转的地址既可以了。

甜柠檬 2017-10-03 3 楼

原理是获取 URL 响应头里的 Location 信息。代码如下:

function get_real_url($url){
$headers = @get_headers($url);
$pattern = '/Locations:s(https?:[^;snr]+)/i';
if($locations = preg_grep($pattern, $headers)){
preg_match($pattern, end($locations), $redirect);
return $redirect[1];
}
return $url;
}

上面的代码能获取所有 301 跳转的最终指向。

归属感 2017-07-03 2 楼

这个得不到吧,短网址是由长网址根据一定的算法生成出来的,主要是为了解决微博字数限制的问题,而且生成网后是存入数据库的,然后和长网址对应,当我们访问短网址时由301跳转到长网址,所以无法根据短网址还原成长网址。

浮生未歇 2017-05-17 1 楼

你这个应该是反链接管理,短连接都是由长连接配置或者伪静态生成的,应该可以返回去的!