0) { $b64 .= str_repeat('=', 4 - $mod); } $json_str = base64_decode($b64, true); if ($json_str === false) { return [false, null]; } $data = json_decode($json_str, true); if (!is_array($data)) { return [false, null]; } return [true, $data]; } // 将配置重新编码为 vmess 行 function build_vmess_line(array $data): string { $json = json_encode($data, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES); $b64 = base64_encode($json); return 'vmess://' . $b64; } // 标准 vmess 字段定义(显示顺序 + 中文说明) $vmess_fields = [ 'ps' => '备注(ps)', 'add' => '地址(add)', 'port' => '端口(port)', 'id' => 'UUID(id)', 'aid' => '额外ID(aid)', 'scy' => '加密方式(scy)', 'net' => '网络(net)', 'type' => '伪装类型(type)', 'host' => 'Host(host)', 'path' => '路径(path)', 'tls' => 'TLS(tls)', 'sni' => 'SNI(sni)', 'alpn' => 'ALPN(alpn)', 'insecure' => 'insecure', ]; // ===== 控制流程变量 ===== $mode = 'input'; // input | edit | result $original_text = ''; $result_text = ''; $gost_text = ''; $vmess_rows = []; // 仅合法 vmess 行的解析结果 $other_lines = []; // 非 vmess 行或解析失败的行 $target_ip = ''; $batch_from = ''; $batch_to = ''; $batch_ip_from = ''; $batch_ip_to = ''; if ($_SERVER['REQUEST_METHOD'] === 'POST') { $step = $_POST['step'] ?? 'input'; $target_ip = trim($_POST['target_ip'] ?? ''); $batch_from = trim($_POST['batch_from'] ?? ''); $batch_to = trim($_POST['batch_to'] ?? ''); $batch_ip_from = trim($_POST['batch_ip_from'] ?? ''); $batch_ip_to = trim($_POST['batch_ip_to'] ?? ''); if ($step === 'upload') { // 第一步:用户粘贴 vmess 列表,进入“表格编辑模式” $original_text = trim($_POST['content'] ?? ''); if ($original_text !== '') { $lines = preg_split("/\r\n|\n|\r/", $original_text); foreach ($lines as $line) { $raw = trim($line); if ($raw === '') { continue; } [$ok, $data] = parse_vmess_line($raw); if (!$ok) { $other_lines[] = $raw; continue; } // 拆分成标准字段 + 额外字段 $fields = []; foreach ($vmess_fields as $key => $_label) { $fields[$key] = isset($data[$key]) ? (string)$data[$key] : ''; } $extra = array_diff_key($data, $vmess_fields); $vmess_rows[] = [ 'fields' => $fields, 'extra' => !empty($extra) ? json_encode($extra, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES) : '', ]; } } $mode = 'edit'; } elseif ($step === 'save') { // 第二步:从表格接收编辑后的数据,生成最终 vmess 列表 $rows_post = $_POST['rows'] ?? []; $other_lines = []; $other_raw = trim($_POST['other_lines'] ?? ''); if ($other_raw !== '') { $other_lines = preg_split("/\r\n|\n|\r/", $other_raw); } $lines_out = []; $gost_lines_out = []; // 从表格重建 JSON foreach ($rows_post as $row) { $fields = $row['fields'] ?? []; $extra_json = $row['extra'] ?? ''; $data = []; foreach ($vmess_fields as $key => $_label) { if (isset($fields[$key]) && $fields[$key] !== '') { $data[$key] = $fields[$key]; } } if ($extra_json !== '') { $extra = json_decode($extra_json, true); if (is_array($extra)) { $data = array_merge($data, $extra); } } // 批量替换(提交阶段再兜底跑一遍) if ($target_ip !== '') { $data['add'] = $target_ip; } if ($batch_from !== '' && $batch_to !== '') { array_walk_recursive($data, function (&$value) use ($batch_from, $batch_to) { if (is_string($value) && $value !== '') { $value = str_replace($batch_from, $batch_to, $value); } }); } if ($batch_ip_from !== '' && $batch_ip_to !== '' && isset($data['add'])) { $data['add'] = str_replace($batch_ip_from, $batch_ip_to, (string)$data['add']); } // 构建 vmess 行 $lines_out[] = build_vmess_line($data); // 构建对应的 Gost 配置行(端口使用当前记录的 port 字段) $ip_for_gost = isset($data['add']) ? (string)$data['add'] : ''; $port_for_gost = isset($data['port']) ? (string)$data['port'] : ''; if ($ip_for_gost !== '' && $port_for_gost !== '') { if (strpos($ip_for_gost, ':') === false) { // IPv4 $gost_lines_out[] = 'nonencrypt/' . $port_for_gost . '#' . $ip_for_gost . '#' . $port_for_gost; } else { // IPv6,添加方括号 $ip = $ip_for_gost; if ($ip[0] !== '[') { $ip = '[' . $ip . ']'; } $gost_lines_out[] = 'nonencrypt/' . $port_for_gost . '#' . $ip . '#' . $port_for_gost; } } else { $gost_lines_out[] = ''; } } // 把无法解析的其它行也保留在结果中 foreach ($other_lines as $raw) { $raw = trim($raw); if ($raw !== '') { $lines_out[] = $raw; } } $result_text = implode(PHP_EOL, $lines_out); $gost_text = implode(PHP_EOL, $gost_lines_out); $mode = 'result'; } } else { // 默认示例文本 $original_text = "vmess://ew0KICAidiI6ICIyIiwNCiAgInBzIjogIkFsaVBDLUdHWS1TaGFyZS1CZXN0dm0tU0ciLA0KICAiYWRkIjogIjEuMS4xLjEiLA0KICAicG9ydCI6ICIzMzg4OCIsDQogICJpZCI6ICI3N2MwYWFmZC03MTNhLTQwZDUtYmI2MS1mZWMyN2JiMTI0MTEiLA0KICAiYWlkIjogIjAiLA0KICAic2N5IjogImF1dG8iLA0KICAibmV0IjogInRjcCIsDQogICJ0eXBlIjogIm5vbmUiLA0KICAiaG9zdCI6ICIiLA0KICAicGF0aCI6ICIiLA0KICAidGxzIjogIiIsDQogICJzbmkiOiAiIiwNCiAgImFscG4iOiAiIiwNCiAgImZwIjogIiIsDQogICJpbnNlY3VyZSI6ICIwIg0KfQ=="; $mode = 'input'; } ?>