/** * 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
张小明
前端开发工程师
Java与AI融合新探索:JBoltAI框架能力深度剖析
html在人工智能技术日新月异的背景下,Java作为企业级应用开发的主力军,如何有效融合AI技术成为行业关注的焦点。JBoltAI框架以其独特的AIGS能力、数据管理与处理能力、数据可视化能力,为Java开发者铺就了一条通往AI世界的坚实道路。本文将基于…
豆包和InfiniSynapse 联网搜索哪家强:一起寻找元气
今天我无意在群里看到如下一段对话:发这个截图的朋友其实是想展示,其实豆包完全可以替代搜索,而且还没广告。但是如果搜索结果返回的不太好,比如信息有冲突之类的,其实大家应该能够感受到,像豆包/DeepSeek …
优化 Selenium 使用文本挖掘在分析留言数据中提供了多种应用 如情感分析、主题建模、关键词提取和文本分类
优化 Selenium 使用文本挖掘在分析留言数据中提供了多种应用 如情感分析、主题建模、关键词提取和文本分类 优化 Selenium 文本挖掘在分析留言数据中提供多种应用 如何优化 Selenium 的使用以提高爬取效率、数据清洗的具体步骤和常用工具 在当今大数据时代,网络爬虫…
2026年02月03日全球AI前沿动态
一句话总结 2026年2月3日前后,AI领域呈现全产业链爆发式进展:通用与垂直模型密集迭代(轻量化、高性能成主流),多智能体协作与物理AI技术突破,企业并购、融资活跃,应用场景覆盖办公、社交、工业…
【LLM】CL-bench:评估LLM学新知识的能力
note CL-bench 围绕一个简单但严格的设计原则构建:每个任务都必须要求从 context 中学习新知识。 CL-bench 中的每个 context 都是完全自包含(Self-contained)的。解决任务所需的所有信息都显式地提供在 context 本身之中:不需要…
PPT配图神器01Agent:3秒生成可编辑配图,AI帮你告别找图烦恼
PPT配图快速生成,01Agent让你的职场视觉化表达更生动 做PPT最崩溃的时刻是什么? 不是写文案,不是理逻辑,而是找配图。 你打开搜索引擎,输入关键词,翻了20页图片,要么版权不明不敢用ÿ…