PHP 实现“万能”的短网址还原

mengkun 33.8K 32

常见的短网址都是通过 301 或 302 跳转的方式实现重定向到目标网站的,因此我们可以使用 PHP 的 curl_getinfo 来取得 header 中的重定向地址,也就是短网址对应的原始网址(嗯,原理就是这么简单……[aru_49]

完整的函数代码如下:

/***
 * 万能短网址还原函数
 * @param $shortUrl 短网址
 * @return 原始网址 | 空(还原失败或非短网址)
 */
function restoreUrl($shortUrl) {
    $curl = curl_init();
    curl_setopt($curl, CURLOPT_URL, $shortUrl);
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($curl, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:70.0) Gecko/20100101 Firefox/70.0');
    curl_setopt($curl, CURLOPT_HEADER, true);
    curl_setopt($curl, CURLOPT_NOBODY, false);
    curl_setopt($curl, CURLOPT_TIMEOUT, 15);
    curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
    curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 2);
    curl_setopt($curl, CURLOPT_ENCODING, 'gzip');
    $data = curl_exec($curl);
    $curlInfo = curl_getinfo($curl);
    curl_close($curl);
    if($curlInfo['http_code'] == 301 || $curlInfo['http_code'] == 302) {
        return $curlInfo['redirect_url'];
    }
    return '';
}

使用方法:

$shortUrl = 'https://url.cn/54VbB8h';    // 要还原的短网址
$orinalUrl = restoreUrl($shortUrl);
if($orinalUrl) {
    echo "短网址 {$shortUrl} 的还原结果:{$orinalUrl}";
} else {
    echo "短网址还原失败";
}

经过实测,该函数可以顺利实现下列短网址的还原:[aru_47]

  • https://url.cn/54VbB8h
  • http://t.cn/AiR8Qoyp
  • http://uee.me/cAhq8
  • http://rrd.me/eWCg3
  • https://sohu.gg/MSYnnHo02
  • https://dwz.cn/I5l2YWKL
  • http://1t.click/bceu
  • http://dwz.win/qMp
  • http://qq.cn.hn/e8N
  • http://tb.cn.hn/x7X
  • http://jd.cn.hn/aaK9
  • http://tinyurl.com/y5gkl3v9
  • http://u6.gg/sLaav
  • http://c7.gg/fQBWn
  • http://985.so/ejaT
  • http://new.3qtt.cn/1hqafu
  • http://dwz1.cc/DvjLsDcC
  • https://ml.mk/‌‌‌​‌​​‌​‌​‌‌​‌‌‌/
  • https://ml.mk/BvZ
  • http://suo.im/555AiB
  • https://suo.dog/msugd
  • http://sina.lt/eEyd
  • http://mrw.so/4woTLt

不过,诸如 https://m.tb.cn/h.ew5NAEA 这种在前端使用 js 跳转的短网址就无能为力了~_~

发表评论 取消回复
表情 图片 链接 代码

  1. 111
    111 Lv 1

    i42.cn怎么还原各位大佬

  2. 异星软件空间
    异星软件空间 Lv 1

    干的漂亮[aru_147]

  3. f\'s\'d
    f\'s\'d Lv 1

    [aru_2]哈哈不错哦

  4. tom
    tom Lv 1

    是不是可以做成脚本[aru_1][aru_13],还请指教
    然后就是看上了这些款表情包,怎么保存自己用呀?阿鲁和贴吧等

  5. 琦森
    琦森 Lv 1

    用file_get_contents可以实现https的还原[aru_3]

  6. qvdd
    qvdd Lv 1

    [aru_12] 这个你试试能否还原: https://qvdd.cn

  7. 会飞的鱼
    会飞的鱼 Lv 2

    来个友联吧

  8. Kate
    Kate Lv 1

    有没有短网址api

  9. 小米博客
    小米博客 Lv 1

    有点好笑[aru_16]

  10. 小飞
    小飞 Lv 1

    大佬大佬大佬

  11. 杨小杰博客
    杨小杰博客 Lv 3

    人才,一个curl就把文章水了

  12. 哼哼
    哼哼 Lv 1

    你好,大佬,有的连接会进行跳转多次,怎么写代码才可以不断查找到最初的连接。

    • mengkun
      mengkun 站长

      @哼哼就用这个函数多获取几次,直到再也获取不到了为止呗

      • 哼哼
        哼哼 Lv 1

        @mengkun明白了,那请教大佬,如果用js或者no-referrer 进行跳转的,那是不是就无法获取跳转之后的连接了?

      • mengkun
        mengkun 站长

        @哼哼当然也可以获取到,从源代码中用正则提取出来就行了。不过需要逐个进行适配,没法做成通用的

  13. 杰新博客
    杰新博客 Lv 3

    大佬 那个微博的短链接接口不能用了 有办法破解不,网上好像有的还可以,可惜没有流出方法[aru_2]

    • mengkun
      mengkun 站长

      @杰新博客我已经找到新的接口了,但不能公布出来。不然见光死了[aru_16]

      • 杰新博客
        杰新博客 Lv 3

        @mengkun提示点呗,这个很急用啊,拜托[aru_72]

      • TY
        TY Lv 1

        @杰新博客自己搭建一个短链系统呗

    • Kate
      Kate Lv 1

      @杰新博客https://api.66mz8.com/api/dwz.php?api&url=网址

      • Kate
        Kate Lv 1

        @Kate写错了

        t.cn:https://api.66mz8.com/api/dwz.php?api=tcn&url=http://www.baidu.com

        sinaurl.cn:https://api.66mz8.com/api/dwz.php?api=sinaurlcn&url=http://www.baidu.com

  14. i2120
    i2120 Lv 1

    您的那个壁纸代码不支持HTTPS 有办法处理吗

    • 杰新博客
      杰新博客 Lv 3

      @i2120接口采集是http,自然不支持https。你可以找找其他接口

  15. 现实君
    现实君 Lv 3

    人才

    • mengkun
      mengkun 站长

      @现实君好久不见!

      • 现实君
        现实君 Lv 3

        @mengkun哈哈哈,感觉就在昨天才见呀

  16. 轩沫说
    轩沫说 Lv 4

    哎呀,沙发没抢到。

  17. 轩沫说
    轩沫说 Lv 4

    还是新浪比较好用,百度还要收费。

  18. 亻韦哥
    亻韦哥 Lv 1

    好难得啊。我具然是第一

分享