/** * SakuraFrp API 客户端 * 仅实现了获取隧道列表的功能 * * @version 1.0 * @author AI Assistant */ class SakuraFrpApi { /** * API 基础 URL * @var string */ private const BASE_URL = 'https://api.natfrp.com/v4'; /** * 用户认证 Token * @var string */ private $userToken; /** * 构造函数 * @param string $userToken 您的 SakuraFrp 用户 Token */ public function __construct(string $userToken) { $this->userToken = $userToken; } /** * 获取隧道列表 * 对应 C# 中的 tunnels() 方法 * * @return array|null 成功时返回隧道列表数组,失败时返回 null * @throws Exception 如果请求失败或发生 cURL 错误 */ public function getTunnels(): ?array { $url = self::BASE_URL . '/tunnels'; //echo "请求 URL: " . $url . "\n"; return $this->makeRequest('GET', $url); } /** * 通用的请求方法 * * @param string $method HTTP 方法 (GET, POST, etc.) * @param string $url 请求的 URL * @param array|null $data 对于 POST 请求,要发送的 JSON 数据 * @return array|null 成功时返回解码后的 JSON 数组,失败时返回 null * @throws Exception */ private function makeRequest(string $method, string $url, ?array $data = null): ?array { // 1. 初始化 cURL $ch = curl_init(); // 2. 设置 cURL 选项 curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // 将响应作为字符串返回,而不是直接输出 curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); // 跟随重定向 // 添加 SSL 验证选项(开发环境可禁用,生产环境应启用) curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // 禁用 SSL 证书验证 curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); // 不检查证书中的主机名 // 3. 设置请求头 $headers = [ 'Accept: application/json', 'Authorization: Bearer ' . $this->userToken ]; curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); // 4. 如果是 POST 请求,设置 POST 数据 if ($method === 'POST' && $data !== null) { curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data)); $headers[] = 'Content-Type: application/json'; curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); } // 5. 执行请求 $response = curl_exec($ch); // 6. 检查错误 if (curl_errno($ch)) { $error_msg = curl_error($ch); curl_close($ch); throw new Exception("cURL Error: " . $error_msg); } // 7. 获取 HTTP 状态码 $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); curl_close($ch); // 8. 处理响应 if ($httpCode >= 200 && $httpCode < 300) { // 成功响应 $decodedResponse = json_decode($response, true); if (json_last_error() === JSON_ERROR_NONE) { return $decodedResponse; } throw new Exception("JSON Decode Error: " . json_last_error_msg()); } else { // 错误响应 $errorResponse = json_decode($response, true); $errorMessage = $errorResponse['message'] ?? $response; throw new Exception("API Request Failed with HTTP Code {$httpCode}: {$errorMessage}"); } return null; } }旧PHP版SakuraFrpApi
张小明
前端开发工程师
【完全免费】一键锁定电脑键盘和鼠标,防止小孩舍友同事触碰自己的电脑。如何让电脑键盘鼠标失效?这款神器轻松帮你解决!
——软件使用教程—— 一键锁定电脑键盘和鼠标,防止小孩舍友同事触碰自己的电脑。——下载地址(防止被拦截,请用浏览器打开)—— 夸克地址: https://pan.dxlszyk.com/s/1jghdt106 多盘地址: https://ww…
研发环境:SSL证书快速部署
目录 概述 生成证书 单域名证书(dev.luckybin.top) Linux Windows(PowerShell) 通配符证书(*.luckybin.top) Linux Windows(PowerShell) Nginx配置示例 单域名配置 通配符…
AI摩尔定律下的行业奇点:程序员职业自动化演进与人类护城河重构研究报告(V2.0)
摘要 本报告基于CES 2026麦肯锡全球总裁Bob Sternfels的最新披露与NVIDIA CEO Jensen Huang的"AI工厂"理论,提出**“代理式AI摩尔定律”:AI工程能力正从生成式(Generative)向代理式(Agentic)跃迁,迭代周期压缩至3-4个月**。麦肯锡已部署2.5万名AI数字员工与4…
解决Vmware Ubuntu25.10 NAT 模式无法上网
1. 检查 VMware NAT 服务状态 在 Windows 中确保以下服务正在运行: # 以管理员运行 PowerShell Get-Service | Where-Object {$_.Name -like "*VMware*"} | Format-Table Name, Status 需要运行的服务:VMware NAT ServiceVMware DHCP ServiceV…
第三次Python练习题
1.使用os和os.path以及函数的递归完成:给出一个路径,遍历当前路径所有的文件及文件夹打印输出所有的文件(遇到文件输出路径,遇到文件夹继续进文件夹)import os import os.path def list_all_file(path):for name in os.listdir(pa…