本文目录导读:

- 命令行 Shell 脚本 (最常用,基于 curl)
- Python 脚本 (最灵活,适合集成)
- Node.js 脚本 (适合服务端)
- PHP 脚本 (适合已有 PHP 环境的场景)
- 注意事项(重要)
- 简单测试方法(无需脚本)
这是一个关于“短链接还原”的脚本问题,短链接还原的核心原理是通过 HTTP 请求获取目标网址的重定向终点,通常利用 curl 或编程语言的 HTTP 库来实现。
这里为你提供几种常见语言的短链接还原脚本,涵盖命令行和编程场景:
命令行 Shell 脚本 (最常用,基于 curl)
绝大多数短链接(如 t.cn, bit.ly, 短网址服务)都是通过 301/302 重定向实现的,使用 curl 的 -L 跟踪重定向 + -s 静默模式 + -o /dev/null 丢弃内容 + -w 输出最终 URL。
#!/bin/bash
# 用法: ./还原.sh https://短链接地址
short_url="$1"
if [ -z "$short_url" ]; then
echo "用法: $0 <短链接>"
exit 1
fi
# 核心指令:获取最终重定向后的真实URL
real_url=$(curl -s -L -o /dev/null -w '%{url_effective}' "$short_url")
echo "短链接: $short_url"
echo "还原后: $real_url"
执行:
chmod +x 还原.sh ./还原.sh https://url.cn/xxxx
Python 脚本 (最灵活,适合集成)
Python 的 requests 库非常适合处理重定向。
import requests
def expand_short_url(short_url):
"""
还原短链接,返回最终的真实URL
:param short_url: 短链接地址
:return: 真实URL 或 None
"""
try:
# 设置 User-Agent 模拟浏览器,避免某些服务拒绝访问
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36'}
# allow_redirects=True 表示跟踪重定向
response = requests.get(short_url, headers=headers, allow_redirects=True, timeout=10)
# 返回最终请求的 URL (即重定向后的地址)
return response.url
except requests.exceptions.RequestException as e:
print(f"请求出错: {e}")
return None
if __name__ == "__main__":
short_url = input("请输入短链接: ").strip()
real_url = expand_short_url(short_url)
if real_url:
print(f"还原后的URL: {real_url}")
else:
print("无法还原该短链接。")
Node.js 脚本 (适合服务端)
const axios = require('axios');
async function expandShortUrl(shortUrl) {
try {
const response = await axios.get(shortUrl, {
maxRedirects: 10, // 最多跟踪10次重定向
headers: {
'User-Agent': 'Mozilla/5.0'
},
// 不自动跟随重定向,手动获取 Location 头部 (另一种实现方式)
// 但更简单的是让 axios 自动跟,然后返回最终URL
});
return response.request.res.responseUrl || shortUrl; // 最终URL
} catch (error) {
// 某些短链接会返回 301/302,axios 可能会报错,但可以捕捉并处理
if (error.response && error.response.headers.location) {
// 手动递归处理
return await expandShortUrl(error.response.headers.location);
}
console.error('Error:', error.message);
return null;
}
}
// 使用示例
expandShortUrl('https://短链接').then(realUrl => {
console.log('真实URL:', realUrl);
});
PHP 脚本 (适合已有 PHP 环境的场景)
<?php
function expandShortUrl($shortUrl) {
// 初始化 cURL
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $shortUrl);
curl_setopt($ch, CURLOPT_HEADER, true); // 获取响应头
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, false); // 不自动跟随,我们自己处理
curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0');
$response = curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
// 如果是 301/302/303/307 等重定向状态码
if (in_array($httpCode, [301, 302, 303, 307, 308])) {
preg_match('/Location: (.+)/', $response, $matches);
if (isset($matches[1])) {
$redirectUrl = trim($matches[1]);
// 递归处理,直到拿到最终 URL
return expandShortUrl($redirectUrl);
}
}
curl_close($ch);
return $shortUrl; // 如果不是重定向,直接返回原始 URL 或最终 URL
}
$short = readline("请输入短链接: ");
echo "真实URL: " . expandShortUrl($short) . "\n";
?>
注意事项(重要)
- User-Agent 头:很多短链接服务(如 微博 t.cn)拒绝了
curl或默认的 HTTP 客户端,脚本中设置User-Agent模拟浏览器通常可以解决。 - 循环重定向:理论上短链接可能形成一个循环(A->B->A),生产环境中的脚本要设置重定向次数上限(如 10 次),防止死循环导致程序卡死,上面的 Python 和 Node.js 版本已通过
max_redirects或timeout做了防护。 - 非 HTTP 重定向:少数短链接使用 JavaScript 跳转或 Meta Refresh 刷新,上述脚本无法处理这类情况,因为它需要执行 JS 环境才能解析。
- 隐蔽式短链接:有些短链接会先展示一个中间页(如广告页),再通过点击按钮或倒计时跳转,这种情况下脚本只能拿到中间页的 URL,并非最终目标。
- 安全性:还原后得到的 URL 可能是恶意网站或钓鱼链接,请只在可信任的环境中执行还原操作,并对结果进行安全审查(比如用 VirusTotal 扫描)。
简单测试方法(无需脚本)
如果你只是偶尔需要还原一两个短链接,可以使用 curl 命令:
curl -sIL -o /dev/null -w '%{url_effective}' https:// 短链接
-I 参数表示只获取响应头,速度更快。
你可以根据你的具体使用场景(是写自动化工具、做爬虫、还是偶尔用一下)选择上面的方案,有更具体的需求(例如微博特殊的短链接处理、或者需要批量还原)可以继续问我!