群晖Synology利用QuickConnect内网穿透获取直链

2025-08-12  本文已影响0人  oOtroyOo

群晖Synology利用QuickConnect内网穿透获取直链下载

原文地址

前期准备

步骤详解

这里使用Postman或类似工具,进行实验

  1. 国内账户使用 https://global.quickconnect.cn/Serv.php
  2. 全球账户使用 https://global.quickconnect.to/Serv.php
[
    {  // *HTTP的body*
        "version": 1,
        "command": "get_server_info",
        "stop_when_error": false,
        "stop_when_success": false,
        "id": "mainapp_http",
        "serverID": "[QuickConnect ID]",
        "is_gofile": false,
        "path": ""
    },
    {   // *HTTPS的body*
        "version": 1,
        "command": "get_server_info",
        "stop_when_error": false,
        "stop_when_success": false,
        "id": "mainapp_https",
        "serverID": "[QuickConnect ID]",
        "is_gofile": false,
        "path": ""
    }
]
  [
      {
          // ...
          "service": {
            // ...
              "relay_ip": "*ip*",
              "relay_port": *port*,
              // ...
          },
          // ...
      },
      {
      // ...
      }
  ]

编写解析器

  1. nodejs 实现

使用nodejs是因为他可以单文件即可运行,很方便的实现http服务。

当然如果知晓其原理,也可以用其他语言实现。

const http = require('http');
const { URL } = require('url');

let qc_map = {}

/**
 * @param {http.IncomingMessage} req 
 * @param {http.ServerResponse} res 
 */
async function handle(req, res) {
    let qc_id = req.url.split('/', 2)[1]
    if (!qc_id) {
        res.writeHead(400, { 'Content-Type': 'text/plain;charset=utf-8' });
        res.end('Bad Request');
        return
    }
    if (!qc_map[qc_id]) {

        const raw = JSON.stringify([
            {
                "version": 1,
                "command": "get_server_info",
                "stop_when_error": false,
                "stop_when_success": false,
                "id": "mainapp_http",
                "serverID": qc_id,
                "is_gofile": false,
                "path": ""
            }
        ]);

        /**  @type {RequestInit} */
        const requestOptions = {
            method: "POST",
            body: raw
        };

        const result = await fetch("https://global.quickconnect.cn/Serv.php", requestOptions)
            .then((response) => response.json())
            .catch((error) => console.error(error));
        for (data of result) {
            if (data.service && data.service.relay_ip) {
                qc_map[qc_id] = {
                    relay_ip: data.service.relay_ip,
                    relay_port: data.service.relay_port
                }
                break
            }
        }
    }

    if (qc_map[qc_id]) {
        let url = new URL(req.url.substring(qc_id.length + 1), `http://${qc_map[qc_id].relay_ip}:${qc_map[qc_id].relay_port}`);
        res.writeHead(301, { 'Location': url.toString() });
    } else {
        res.writeHead(404, { 'Content-Type': 'text/plain;charset=utf-8' });
        res.end('Not Found');
    }
}

const server = http.createServer(async (req, res) => {

    try {
        await handle(req, res);
        res.end();
    } catch (err) {
        // 捕获异常并返回给前端
        res.writeHead(500, { 'Content-Type': 'application/json;charset=utf-8' });
        // let msg = `${err.message}\n${err.stack.replace(/^/gm, '  ')}\n`;
        let msg = err.stack
        res.end(msg);
    }
});
server.on('error', function (e) {
    console.error(e);
});

server.listen(9000, () => {
    console.log('server is running on port 9000');
});

部署服务端(可选)

上一篇 下一篇

猜你喜欢

热点阅读