My Computer · 2024/11/08 0

机场订阅链接解析转换php源码

朋友的苹果手机爬墙软件不支持订阅链接,每次都要找我要地址,有亿点麻烦。。。

老规矩,请chatgpt大哥帮忙将机场订阅链接解析成可直接导入的服务器地址,并给页面增加一个访问密码,对移动端显示做了优化。修改代码中的访问密码和订阅地址参数后即可使用。

<?php
session_start();

// 设置访问密码
$password = "your_password"; // 将 "your_password" 替换为你的实际密码

// 最大登录尝试次数和锁定时间(单位:秒)
$max_attempts = 3; 
$lock_time = 6000; // 60分钟

// 检查是否已通过验证
if (!isset($_SESSION['authenticated'])) {
    // 如果用户未通过验证,检查当前的IP
    $user_ip = $_SERVER['REMOTE_ADDR'];

    // 初始化尝试记录
    if (!isset($_SESSION['attempts'])) {
        $_SESSION['attempts'] = 0;
        $_SESSION['first_attempt_time'] = time();
    }

    // 检查是否超过最大尝试次数
    if ($_SESSION['attempts'] >= $max_attempts) {
        // 如果锁定时间尚未到,显示提示信息
        if (time() - $_SESSION['first_attempt_time'] < $lock_time) {
            $remaining_time = $lock_time - (time() - $_SESSION['first_attempt_time']);
            die("您尝试次数过多,请稍后再试。锁定时间: $remaining_time 秒。");
        } else {
            // 如果锁定时间到,重置尝试次数
            $_SESSION['attempts'] = 0;
        }
    }

    // 处理表单提交的密码
    if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['password'])) {
        if ($_POST['password'] === $password) {
            // 密码正确,设置会话变量
            $_SESSION['authenticated'] = true;
            $_SESSION['attempts'] = 0; // 重置尝试次数
        } else {
            // 密码错误,增加尝试次数
            $_SESSION['attempts']++;
            $_SESSION['first_attempt_time'] = time(); // 更新首次尝试时间
            $error_message = "密码错误,请重试。";
        }
    }

    // 如果未通过验证,显示密码输入表单
    if (!isset($_SESSION['authenticated'])) {
        ?>
        <!DOCTYPE html>
        <html lang="zh">
        <head>
            <meta charset="UTF-8">
            <meta name="viewport" content="width=device-width, initial-scale=1.0">
            <title>访问受限</title>
        </head>
        <body>

        <h1>请输入访问密码</h1>
        <form method="post">
            <label for="password">密码:</label>
            <input type="password" name="password" id="password" required>
            <button type="submit">提交</button>
        </form>

        <?php if (isset($error_message)) { echo "<p style='color: red;'>$error_message</p>"; } ?>

        </body>
        </html>
        <?php
        exit(); // 停止执行,直到输入正确密码
    }
}

// 机场订阅地址
$subscription_url = "替换为机场订阅地址";

// 函数:获取并解析订阅内容
function getV2RayLinks($url) {
    // 获取订阅内容
    $content = file_get_contents($url);
    if ($content === false) {
        return "无法获取订阅内容,请检查订阅地址是否正确。";
    }

    // 解码 Base64 内容
    $decoded_content = base64_decode($content);
    if ($decoded_content === false) {
        return "订阅内容解码失败。";
    }

    // 去除多余空格并按行排列
    $links = array_map('trim', explode("\n", trim($decoded_content)));
    return $links;
}

// 处理更新请求
$parsed_links = [];
if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['update'])) {
    $parsed_links = getV2RayLinks($subscription_url);
}
?>

<!DOCTYPE html>
<html lang="zh">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>订阅解析</title>
    <style>
        body {
            font-family: Arial, sans-serif;
            padding: 10px;
            max-width: 600px;
            margin: auto;
        }
        h1, h2 {
            text-align: center;
        }
        .link-container {
            display: flex;
            justify-content: space-between;
            align-items: center;
            border: 1px solid #ccc;
            padding: 8px;
            margin: 5px 0;
            border-radius: 5px;
            font-size: 14px;
            word-break: break-all;
        }
        .copy-button {
            font-size: 12px;
            padding: 5px 8px;
            background-color: #007bff;
            color: #fff;
            border: none;
            border-radius: 4px;
            cursor: pointer;
        }
        .copy-button:active {
            background-color: #0056b3;
        }
    </style>
</head>
<body>

<h1>订阅解析</h1>

<!-- 更新按钮 -->
<form method="post" style="text-align: center;">
    <button type="submit" name="update">更新</button>
</form>

<!-- 显示解析结果 -->
<div>
    <h2>解析后的链接:</h2>
    <?php if ($parsed_links): ?>
        <?php foreach ($parsed_links as $link): ?>
            <div class="link-container">
                <span class="link-text"><?php echo htmlspecialchars($link); ?></span>
                <button class="copy-button" onclick="copyToClipboard('<?php echo htmlspecialchars($link); ?>')">复制</button>
            </div>
        <?php endforeach; ?>
    <?php else: ?>
        <p style="text-align: center;">点击上方的“更新”按钮获取最新链接</p>
    <?php endif; ?>
</div>

<script>
function copyToClipboard(link) {
    // 创建临时元素用于复制
    const tempInput = document.createElement("textarea");
    tempInput.value = link;
    document.body.appendChild(tempInput);
    tempInput.select();
    tempInput.setSelectionRange(0, 99999); // 兼容移动端
    document.execCommand("copy");
    document.body.removeChild(tempInput);
    alert("已复制链接到剪贴板");
}
</script>

</body>
</html>