脚本怎样短链接还原

wen 实用脚本 26

本文目录导读:

脚本怎样短链接还原

  1. 命令行 Shell 脚本 (最常用,基于 curl)
  2. Python 脚本 (最灵活,适合集成)
  3. Node.js 脚本 (适合服务端)
  4. PHP 脚本 (适合已有 PHP 环境的场景)
  5. 注意事项(重要)
  6. 简单测试方法(无需脚本)

这是一个关于“短链接还原”的脚本问题,短链接还原的核心原理是通过 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";
?>

注意事项(重要)

  1. User-Agent 头:很多短链接服务(如 微博 t.cn)拒绝了 curl 或默认的 HTTP 客户端,脚本中设置 User-Agent 模拟浏览器通常可以解决。
  2. 循环重定向:理论上短链接可能形成一个循环(A->B->A),生产环境中的脚本要设置重定向次数上限(如 10 次),防止死循环导致程序卡死,上面的 Python 和 Node.js 版本已通过 max_redirectstimeout 做了防护。
  3. 非 HTTP 重定向:少数短链接使用 JavaScript 跳转或 Meta Refresh 刷新,上述脚本无法处理这类情况,因为它需要执行 JS 环境才能解析。
  4. 隐蔽式短链接:有些短链接会先展示一个中间页(如广告页),再通过点击按钮或倒计时跳转,这种情况下脚本只能拿到中间页的 URL,并非最终目标。
  5. 安全性:还原后得到的 URL 可能是恶意网站或钓鱼链接,请只在可信任的环境中执行还原操作,并对结果进行安全审查(比如用 VirusTotal 扫描)。

简单测试方法(无需脚本)

如果你只是偶尔需要还原一两个短链接,可以使用 curl 命令:

curl -sIL -o /dev/null -w '%{url_effective}' https:// 短链接

-I 参数表示只获取响应头,速度更快。

你可以根据你的具体使用场景(是写自动化工具、做爬虫、还是偶尔用一下)选择上面的方案,有更具体的需求(例如微博特殊的短链接处理、或者需要批量还原)可以继续问我!

抱歉,评论功能暂时关闭!