普通视图

发现新文章,点击刷新页面。
昨天以前QAIU's Blog

关于123云盘在线解析配合nfdproxy绕过IP限制的方法

2026年3月27日 06:25

nfd云解析专业版已支持配合分布代理客户端即nfd−proxy(应用dnode技术)
在线解析网站:189.qaiu.top

下载安卓客户端

这里提供3种方式运行客户端,你可以任选一种,临时使用建议选择1,安装包体积很小,下载比较快,开发者可以选择第三种,执行python脚本

  1. 原生apk包
    https://lz0.qaiu.top/lz/iQw5D3llff1c
  2. 带后台运行的apk包
    https://lz0.qaiu.top/lz/iOpmn3llfrqj
  3. 源码运行
    参考 https://blog.qaiu.top/archives/dnode-ke-hu-duan

进入189.qaiu.top解析站

然后就可以利用189.qaiu.top解析123网盘了

关于技术原理,可以参考另一篇文章
https://blog.qaiu.top/archives/2026-03-18-02-12-02

nfd-proxy代理节点技术深度剖析

2026年1月1日 16:12

NFD Proxy — 分布式代理节点系统

将用户设备注册为代理节点,通过 WebSocket 控制面实现 geo 感知分发的 SOCKS5 / HTTP 代理网络。


架构

用户 / Vert.x 后端  │  HTTP CONNECT :8888  (Proxy-Authorization: Basic)  │  SOCKS5       :1080  (用户名/密码子协商)  ▼proxy_server.py          GeoIP 解析 → 同城→同省→默认→任意  │  WebSocket :9000/ws/node  ▼dnode_client.py          用户设备(真实出口 IP)  ▼目标服务器

组件

| 文件 | 说明 |

|------|------|

| proxy_server.py | 服务端:SOCKS5 + HTTP CONNECT 代理,WS 节点注册,Admin API,控制面板 |

| dnode_client.py | 节点客户端:全平台,单依赖 websockets,Android Chaquopy 支持 |

| run.py | 通用启动器:自动安装依赖,venv 管理,支持远程拉取执行 |

| dashboard.html | 实时监控大屏:节点地图、KPI、事件流 |

| admin.html | 管理面板:节点列表、踢除、URL 参数自动登录 |

| api-docs.html | API 文档 |

| start.sh | 服务端启动脚本,支持完整参数透传 |


快速启动

服务端

# 基础启动PROXY_USER=admin PROXY_PASS=secret ADMIN_TOKEN=tok python3 proxy_server.py# 或使用启动脚本./start.sh -u admin -p secret -t tok --debug

| 端口 | 协议 | 说明 |

|------|------|------|

| 1080 | SOCKS5 | 代理入口 |

| 8888 | HTTP CONNECT | 代理入口 |

| 9000 | HTTP / WS | 控制面板、API、节点注册 |

节点客户端

# 直接运行python dnode_client.py wss://dnode.qaiu.top/ws/node# 通过启动器(自动安装依赖)python run.py wss://dnode.qaiu.top/ws/node# 从远程拉取执行(Pydroid 等嵌入式环境)python run.py --url https://qaiu.top/src/py/dnode_client.py

环境变量

| 变量 | 默认 | 说明 |

|------|------|------|

| PROXY_USER | 空 | 代理用户名,逗号分隔多账号,空则不鉴权 |

| PROXY_PASS | 空 | 代理密码,与 PROXY_USER 一一对应 |

| ADMIN_TOKEN | 空 | Admin API 令牌,空则 Admin 全部拒绝 |

| SOCKS5_PORT | 1080 | SOCKS5 端口 |

| HTTP_PORT | 8888 | HTTP CONNECT 端口 |

| CONTROL_PORT | 9000 | 控制面板端口 |

| LOG_LEVEL | INFO | 日志级别,DEBUG 开启流量详情 |

| SHOW_TARGET | true | 事件流是否显示目标地址 |


代理认证 & 真实 IP

支持在凭证中携带真实 IP,用于 geo 节点选择(优先级:凭证 IP > XFF 头 > TCP peer):

# 格式 A  标准curl -x http://admin:secret@host:8888 https://ipinfo.io# 格式 B  携带真实 IP(适用于 Vert.x ProxyOptions 无法加自定义头的场景)curl -x http://'admin:1.2.3.4':secret@host:8888 https://ipinfo.io
// Vert.x ProxyOptionsnew ProxyOptions()    .setType(ProxyType.HTTP)    .setHost("dnode.qaiu.top").setPort(8888)    .setUsername("admin:" + userRealIp)   // "admin:1.2.3.4"    .setPassword("secret");

Admin API

所有 Admin 接口需要 Authorization: Bearer <ADMIN_TOKEN>?token=<ADMIN_TOKEN>

| 方法 | 路径 | 说明 |

|------|------|------|

| GET | /api/stats | 全局统计 + 最近 100 条事件(无需鉴权) |

| GET | /api/admin/nodes | 列出所有在线节点详情 |

| POST | /api/admin/node/{conn_id}/kick | 踢除单个节点,支持前 8 位前缀 |

| POST | /api/admin/nodes/kick-all | 踢除全部节点 |


节点分发策略

Tier 0  同城   (city 匹配)Tier 1  同省   (province 匹配)Tier 2  默认节点 (X-Default-Node: true)Tier 3  任意节点 (兜底)

同 Tier 内取负载最低节点。节点存活由 WS 断开事件驱动,无时间窗口过滤。


Android 集成

// Chaquopy — 启动thread {    Python.getInstance()        .getModule("dnode_client")        .callAttr("main_for_android",            "wss://dnode.qaiu.top/ws/node",            filesDir.absolutePath,  // 配置目录            "",                     // node_id,空则自动生成            "",                     // secret            false,                  // is_default            false)                  // debug}// 停止(任意线程安全调用)Python.getInstance()    .getModule("dnode_client")    .callAttr("stop_from_android")

停止机制stop_from_android() 通过 loop.call_soon_threadsafe 主动关闭 WS 连接,打断 async for 循环,event loop 立即退出,不依赖 flag 轮询。


依赖

服务端 (proxy_server.py)

aiohttp >= 3.9

节点客户端 (dnode_client.py)

websockets >= 10.0

其余均为标准库(asyncio / ssl / struct / json)。


dnode-py客户端

2026年3月9日 04:22

下载pydroid 参考 https://blog.qaiu.top/archives/pydroid3v72

pydroid运行

#pylint:disable=W0122# Pydroid dnode客户端from urllib.request import urlopenexec(urlopen('https://qaiu.top/src/py/dnode_client_v4.py').read())

dnode_client_v4完整代码

#!/usr/bin/env python3"""NFD 客户端节点  ── Android APK / 跨平台════════════════════════════════════════════════════════════════服务端地址优先级(高→低):  1. 命令行参数    python node_client.py wss://host:9000/ws/node  2. 环境变量      NFD_SERVER=wss://host:9000/ws/node  3. 配置文件      node_config.json  中的 server_url 字段  4. 内置默认值    ws://proxy.nfd.com:9000/ws/node其他可选参数:  --secret  <token>     接入密钥(也可在配置文件或 NFD_SECRET 环境变量中设置)  --id      <node_id>   指定设备 ID(默认自动生成并持久化)  --debug               等同于 LOG_LEVEL=DEBUGAndroid 配置文件路径优先级:  $NFD_CONFIG_DIR/node_config.json  /sdcard/nfd/node_config.json  <脚本同级目录>/node_config.json用法示例:  python node_client.py wss://proxy.example.com:9000/ws/node  python node_client.py wss://proxy.example.com:9000/ws/node --secret abc123  NFD_SERVER=wss://... python node_client.py"""import argparseimport asyncioimport hashlibimport jsonimport loggingimport osimport platformimport signalimport socketimport sslimport structimport sysimport timeimport uuidfrom typing import Dict, Optionalimport aiohttp# ══════════════════════════════════════════════════════════#  Android 检测# ══════════════════════════════════════════════════════════def _is_android() -> bool:    return (        os.path.exists("/data/data") or        os.environ.get("ANDROID_ROOT") is not None or        os.environ.get("ANDROID_DATA") is not None    )IS_ANDROID = _is_android()PLATFORM   = "Android" if IS_ANDROID else platform.system()# ══════════════════════════════════════════════════════════#  配置文件路径(Android 友好)# ══════════════════════════════════════════════════════════def _config_path() -> str:    # 1. 环境变量指定目录    env_dir = os.environ.get("NFD_CONFIG_DIR", "")    if env_dir:        return os.path.join(env_dir, "node_config.json")    # 2. Android:优先 SD 卡可读目录    if IS_ANDROID:        sdcard = "/sdcard/nfd"        try:            os.makedirs(sdcard, exist_ok=True)            return os.path.join(sdcard, "node_config.json")        except OSError:            pass    # 3. 脚本同级目录    return os.path.join(os.path.dirname(os.path.abspath(__file__)), "node_config.json")CONFIG_FILE = _config_path()# ══════════════════════════════════════════════════════════#  日志# ══════════════════════════════════════════════════════════def _setup_logging(debug: bool = False) -> None:    level = logging.DEBUG if debug else getattr(        logging, os.environ.get("LOG_LEVEL", "INFO").upper(), logging.INFO    )    fmt = "%(asctime)s.%(msecs)03d [%(levelname)-5s] %(name)s - %(message)s"    # Android 下 basicConfig 可能已被 chaquopy 初始化,安全地重设    root = logging.getLogger()    root.setLevel(level)    if not root.handlers:        handler = logging.StreamHandler(sys.stdout)        handler.setFormatter(logging.Formatter(fmt, datefmt="%H:%M:%S"))        root.addHandler(handler)    else:        for h in root.handlers:            h.setFormatter(logging.Formatter(fmt, datefmt="%H:%M:%S"))logger   = logging.getLogger("nfd.node")flow_log = logging.getLogger("nfd.flow")# ══════════════════════════════════════════════════════════#  工具函数# ══════════════════════════════════════════════════════════def _fmt_bytes(n: int) -> str:    n = int(n or 0)    for unit in ("B", "KB", "MB", "GB"):        if n < 1024:            return f"{n:.1f}{unit}"        n /= 1024    return f"{n:.1f}TB"def _local_ip() -> str:    """获取本机出口 IP(Android/Linux/Windows 均可用)"""    targets = [("8.8.8.8", 80), ("1.1.1.1", 80), ("114.114.114.114", 80)]    for host, port in targets:        try:            with socket.socket(socket.AF_INET, socket.SOCK_DGRAM) as s:                s.settimeout(1)                s.connect((host, port))                return s.getsockname()[0]        except OSError:            continue    return "?"def _device_fp() -> str:    """设备指纹:Android 优先读 Android ID,回退到通用方案"""    if IS_ANDROID:        # 尝试读取 Android ID(需 READ_PHONE_STATE 或已知路径)        try:            import subprocess            aid = subprocess.check_output(                ["settings", "get", "secure", "android_id"],                timeout=2, stderr=subprocess.DEVNULL            ).decode().strip()            if aid and aid != "null":                return hashlib.sha256(aid.encode()).hexdigest()[:16]        except Exception:            pass    raw = f"{platform.node()}-{PLATFORM}-{uuid.getnode()}"    return hashlib.sha256(raw.encode()).hexdigest()[:16]def _make_ssl_ctx(url: str) -> Optional[ssl.SSLContext]:    """wss:// 创建 SSL context;Android 证书链有时需宽松验证"""    if not url.startswith("wss://"):        return None    ctx = ssl.create_default_context()    if IS_ANDROID:        # Android 系统根证书路径不标准,允许加载系统证书        for ca_path in (            "/system/etc/security/cacerts",            "/data/misc/keychain/certs-added",        ):            if os.path.isdir(ca_path):                for f in os.listdir(ca_path):                    try:                        ctx.load_verify_locations(os.path.join(ca_path, f))                    except Exception:                        pass        # 如果仍有问题,可通过环境变量 NFD_SSL_NOVERIFY=1 跳过验证(不推荐生产)        if os.environ.get("NFD_SSL_NOVERIFY", "0") == "1":            ctx.check_hostname = False            ctx.verify_mode    = ssl.CERT_NONE            logger.warning("SSL 证书验证已禁用(NFD_SSL_NOVERIFY=1)")    return ctx# ══════════════════════════════════════════════════════════#  帧协议# ══════════════════════════════════════════════════════════TYPE_CONNECT_REQ  = 0x01TYPE_CONNECT_OK   = 0x02TYPE_CONNECT_FAIL = 0x03TYPE_DATA         = 0x04TYPE_CLOSE        = 0x05MAX_CONCURRENCY   = 50def pack_frame(tunnel_id: int, ftype: int, payload: bytes = b"") -> bytes:    return struct.pack(">IB", tunnel_id, ftype) + payloaddef unpack_frame(data: bytes):    tunnel_id, ftype = struct.unpack(">IB", data[:5])    return tunnel_id, ftype, data[5:]# ══════════════════════════════════════════════════════════#  单条隧道# ══════════════════════════════════════════════════════════class TunnelWorker:    def __init__(self, tid: int, host: str, port: int,                 ws_send_queue: asyncio.Queue, local_ip: str):        self.tid          = tid        self.host         = host        self.port         = port        self._ws_queue    = ws_send_queue        self._local_ip    = local_ip        self._tcp_writer: Optional[asyncio.StreamWriter] = None        self._data_queue: asyncio.Queue = asyncio.Queue()        self._closed      = False        self._t_start     = time.monotonic()        self._tx_bytes    = 0        self._rx_bytes    = 0    async def run(self):        flow_log.debug(f"[node] tid={self.tid:08x} | {self._local_ip} → {self.host}:{self.port} | TCP_CONNECTING")        try:            reader, writer = await asyncio.wait_for(                asyncio.open_connection(self.host, self.port), timeout=10            )            self._tcp_writer = writer            local = writer.get_extra_info("sockname")            local_addr = f"{local[0]}:{local[1]}" if local else self._local_ip        except Exception as e:            flow_log.debug(f"[node] tid={self.tid:08x} | TCP_FAIL {self.host}:{self.port} err={e}")            await self._ws_queue.put(pack_frame(self.tid, TYPE_CONNECT_FAIL, str(e).encode()))            return        conn_ms = f"{(time.monotonic()-self._t_start)*1000:.0f}ms"        await self._ws_queue.put(pack_frame(self.tid, TYPE_CONNECT_OK))        flow_log.debug(f"[node] tid={self.tid:08x} | {local_addr} → {self.host}:{self.port} | TCP_CONNECTED conn={conn_ms}")        async def tcp_to_ws():            try:                while not self._closed:                    chunk = await reader.read(65536)                    if not chunk:                        break                    self._rx_bytes += len(chunk)                    flow_log.debug(                        f"[node] tid={self.tid:08x} | "                        f"target→node chunk={_fmt_bytes(len(chunk))} ↓{_fmt_bytes(self._rx_bytes)}"                    )                    await self._ws_queue.put(pack_frame(self.tid, TYPE_DATA, chunk))            except Exception as e:                flow_log.debug(f"[node] tid={self.tid:08x} | tcp_to_ws err={e}")            finally:                await self._ws_queue.put(pack_frame(self.tid, TYPE_CLOSE))                self._closed = True        async def ws_to_tcp():            try:                while not self._closed:                    chunk = await self._data_queue.get()                    if chunk is None:                        break                    self._tx_bytes += len(chunk)                    flow_log.debug(                        f"[node] tid={self.tid:08x} | "                        f"node→target chunk={_fmt_bytes(len(chunk))} ↑{_fmt_bytes(self._tx_bytes)}"                    )                    writer.write(chunk)                    await writer.drain()            except Exception as e:                flow_log.debug(f"[node] tid={self.tid:08x} | ws_to_tcp err={e}")            finally:                try:                    writer.close()                except Exception:                    pass                self._closed = True        await asyncio.gather(tcp_to_ws(), ws_to_tcp(), return_exceptions=True)        logger.info(            f"[node] tid={self.tid:08x} | "            f"{self._local_ip} ⇄ {self.host}:{self.port} | "            f"CLOSED ↑{_fmt_bytes(self._tx_bytes)} ↓{_fmt_bytes(self._rx_bytes)} "            f"dur={time.monotonic()-self._t_start:.2f}s"        )    def feed_data(self, data: bytes):        if not self._closed:            self._data_queue.put_nowait(data)    def close(self):        self._closed = True        self._data_queue.put_nowait(None)        if self._tcp_writer:            try:                self._tcp_writer.close()            except Exception:                pass# ══════════════════════════════════════════════════════════#  节点主体# ══════════════════════════════════════════════════════════class ProxyNode:    RECONNECT_DELAYS = [2, 4, 8, 16, 30, 60]    def __init__(self, server_url: str, node_id: str, secret: str = "", is_default: bool = False):        self.server_url  = server_url        self.node_id     = node_id        self.secret      = secret        self.is_default  = is_default        self._local_ip   = _local_ip()        self._ssl_ctx    = _make_ssl_ctx(server_url)        self._tunnels:   Dict[int, TunnelWorker] = {}        self._ws_queue:  asyncio.Queue = asyncio.Queue()        self._sem        = asyncio.Semaphore(MAX_CONCURRENCY)        self._running    = False        self._total_tunnels = 0        self._total_tx      = 0        self._total_rx      = 0    async def run(self):        self._running = True        attempt = 0        while self._running:            try:                await self._connect_loop()                attempt = 0            except Exception as e:                delay = self.RECONNECT_DELAYS[min(attempt, len(self.RECONNECT_DELAYS)-1)]                logger.warning(                    f"连接断开 ({type(e).__name__}: {e}),"                    f"{delay}s 后重连... (第{attempt+1}次)"                )                await asyncio.sleep(delay)                attempt += 1    def stop(self):        self._running = False        for t in list(self._tunnels.values()):            t.close()    async def _connect_loop(self):        headers = {            "X-Node-ID":      self.node_id,            "X-Platform":     PLATFORM,            "X-Version":      "3.0",            "X-Device-FP":    _device_fp(),            "X-Local-IP":     self._local_ip,            "X-Default-Node": "true" if self.is_default else "false",        }        if self.secret:            headers["Authorization"] = f"Bearer {self.secret}"        logger.info(            f"连接服务端  url={self.server_url}  "            f"platform={PLATFORM}  local_ip={self._local_ip}  "            f"node_id={self.node_id[:8]}"        )        # Android 上 aiohttp 需要明确传入 ssl context 或 False        ws_kwargs: dict = dict(            headers=headers,            heartbeat=30,            max_msg_size=0,        )        if self._ssl_ctx is not None:            ws_kwargs["ssl"] = self._ssl_ctx        elif self.server_url.startswith("wss://"):            ws_kwargs["ssl"] = True   # fallback: 使用系统默认        async with aiohttp.ClientSession() as sess:            async with sess.ws_connect(self.server_url, **ws_kwargs) as ws:                logger.info(                    f"✅ 已连接  url={self.server_url}  "                    f"local_ip={self._local_ip}  node_id={self.node_id[:8]}"                )                send_task = asyncio.create_task(self._ws_sender(ws))                try:                    await self._ws_receiver(ws)                finally:                    send_task.cancel()                    for t in list(self._tunnels.values()):                        t.close()                    self._tunnels.clear()                    logger.info(                        f"连接断开  tunnels={self._total_tunnels}  "                        f"↑{_fmt_bytes(self._total_tx)} ↓{_fmt_bytes(self._total_rx)}"                    )    async def _ws_sender(self, ws):        while True:            frame = await self._ws_queue.get()            try:                await ws.send_bytes(frame)            except Exception as e:                logger.warning(f"WS 发送失败: {e}")                break    async def _ws_receiver(self, ws):        async for msg in ws:            if msg.type == aiohttp.WSMsgType.BINARY:                await self._dispatch(msg.data)            elif msg.type == aiohttp.WSMsgType.TEXT:                try:                    d = json.loads(msg.data)                    if d.get("type") == "pong":                        flow_log.debug("heartbeat pong")                except Exception:                    pass            elif msg.type in (aiohttp.WSMsgType.ERROR, aiohttp.WSMsgType.CLOSE):                break    async def _dispatch(self, raw: bytes):        if len(raw) < 5:            return        tid, ftype, payload = unpack_frame(raw)        if ftype == TYPE_CONNECT_REQ:            host_len = payload[0]            host     = payload[1:1+host_len].decode()            port     = struct.unpack(">H", payload[1+host_len:3+host_len])[0]            self._total_tunnels += 1            logger.info(                f"[node] tid={tid:08x} | "                f"新隧道 → {host}:{port}  "                f"active={len(self._tunnels)+1}/{MAX_CONCURRENCY}"            )            asyncio.create_task(self._run_tunnel(tid, host, port))        elif ftype == TYPE_DATA:            t = self._tunnels.get(tid)            if t:                t.feed_data(payload)            else:                flow_log.debug(f"DATA tid={tid:08x} 无隧道")        elif ftype == TYPE_CLOSE:            t = self._tunnels.pop(tid, None)            if t:                t.close()    async def _run_tunnel(self, tid: int, host: str, port: int):        async with self._sem:            worker = TunnelWorker(tid, host, port, self._ws_queue, self._local_ip)            self._tunnels[tid] = worker            await worker.run()            self._tunnels.pop(tid, None)            self._total_tx += worker._tx_bytes            self._total_rx += worker._rx_bytes# ══════════════════════════════════════════════════════════#  配置加载 & CLI# ══════════════════════════════════════════════════════════DEFAULT_SERVER = "wss://dnode.qaiu.top/ws/node"def load_file_config() -> dict:    """从配置文件读取(文件不存在则创建模板)"""    defaults = {"server_url": DEFAULT_SERVER, "node_id": "", "secret": ""}    if os.path.exists(CONFIG_FILE):        try:            with open(CONFIG_FILE, encoding="utf-8") as f:                return {**defaults, **json.load(f)}        except Exception as e:            logger.warning(f"配置文件读取失败: {e},使用默认值")            return defaults    # 首次运行:写入模板(含新生成 node_id)    defaults["node_id"] = uuid.uuid4().hex    try:        os.makedirs(os.path.dirname(CONFIG_FILE), exist_ok=True)        with open(CONFIG_FILE, "w", encoding="utf-8") as f:            json.dump(defaults, f, indent=2, ensure_ascii=False)        logger.info(f"已生成配置文件: {CONFIG_FILE}")    except OSError as e:        logger.warning(f"配置文件写入失败: {e}")    return defaultsdef save_node_id(node_id: str):    """持久化自动生成的 node_id"""    try:        cfg = {}        if os.path.exists(CONFIG_FILE):            with open(CONFIG_FILE, encoding="utf-8") as f:                cfg = json.load(f)        cfg["node_id"] = node_id        with open(CONFIG_FILE, "w", encoding="utf-8") as f:            json.dump(cfg, f, indent=2, ensure_ascii=False)    except OSError:        passdef parse_args():    parser = argparse.ArgumentParser(        description="NFD 代理客户端节点",        formatter_class=argparse.RawDescriptionHelpFormatter,        epilog="""示例:  python node_client.py wss://proxy.example.com:9000/ws/node  python node_client.py wss://proxy.example.com:9000/ws/node --secret mytoken  python node_client.py --debug  NFD_SERVER=wss://... python node_client.py        """,    )    parser.add_argument(        "server_url",        nargs="?",        default=None,        metavar="SERVER_URL",        help="服务端 ws:// 或 wss:// 地址(最高优先级)",    )    parser.add_argument("--secret", default=None, help="接入密钥")    parser.add_argument("--id",     default=None, help="指定 node_id(设备标识)")    parser.add_argument("--debug",  action="store_true", help="开启 DEBUG 日志")    parser.add_argument(        "--default", action="store_true",        help="标记为默认节点(兜底分发,服务器本地部署时使用)"    )    return parser.parse_args()# ══════════════════════════════════════════════════════════#  入口# ══════════════════════════════════════════════════════════async def amain():    args    = parse_args()    _setup_logging(args.debug)    file_cfg = load_file_config()    # 服务端地址优先级: CLI arg > 环境变量 > 配置文件 > 默认    server_url = (        args.server_url        or os.environ.get("NFD_SERVER", "")        or file_cfg.get("server_url", "")        or DEFAULT_SERVER    ).strip()    # 密钥优先级: CLI > 环境变量 > 配置文件    secret = (        args.secret        or os.environ.get("NFD_SECRET", "")        or file_cfg.get("secret", "")    )    # node_id 优先级: CLI > 配置文件 > 自动生成    node_id = (        args.id        or file_cfg.get("node_id", "")        or uuid.uuid4().hex    )    if not file_cfg.get("node_id"):        save_node_id(node_id)    # 校验地址格式    if not server_url.startswith(("ws://", "wss://")):        logger.error(            f"服务端地址格式错误: {server_url!r}\n"            "    应为 ws://host:port/ws/node 或 wss://host:port/ws/node"        )        sys.exit(1)    logger.info(        f"NFD 节点启动  platform={PLATFORM}  "        f"node_id={node_id[:8]}  server={server_url}  "        f"default={'✓' if args.default else '✗'}  "        f"config={CONFIG_FILE}"    )    node = ProxyNode(server_url=server_url, node_id=node_id, secret=secret,                     is_default=args.default)    # 注册退出信号(Android SIGTERM / 桌面 SIGINT)    loop = asyncio.get_running_loop()    def _shutdown(sig_name: str):        logger.info(f"收到 {sig_name},正在退出...")        node.stop()        loop.stop()    for sig in (signal.SIGTERM, signal.SIGINT):        try:            loop.add_signal_handler(sig, _shutdown, sig.name)        except (NotImplementedError, OSError):            # Windows / 某些嵌入式 Python 不支持 add_signal_handler            pass    await node.run()if __name__ == "__main__":    try:        asyncio.run(amain())    except (KeyboardInterrupt, SystemExit):        pass

netdisk-fast-download后台配置版使用指南

2026年2月1日 09:45

netdisk-fast-download 后台配置版使用指南

文档版本: v1.0
更新日期: 2026年1月31日
适用版本: nfd-vip2 v0.1.9+


📖 目录


1. 功能简介

本系统支持 20+ 主流网盘的后台统一管理与认证信息配置。通过后台"网盘配置"功能,可为各类网盘账号集中配置认证信息,实现:

  • ✅ 批量管理多个网盘账号
  • ✅ 统一认证信息加密存储
  • ✅ 支持一键启用/禁用配置
  • ✅ 支持临时参数认证(可选)
  • ✅ 快速解析与高速下载

支持的认证方式

  • accesstoken - AccessToken认证(移动云盘、联通云盘、天翼云盘等)
  • cookie - Cookie认证(夸克、UC、QQ微云等)
  • password - 用户名密码认证(123网盘、小飞机、蓝奏优享等)
  • authorization - Authorization认证(移动云盘、123网盘等)
  • custom - 自定义认证(扩展使用)
  • none - 无需认证(蓝奏云、QQ邮箱、奶牛快传等)

2. 进入后台网盘配置界面

2.1 访问管理后台

  1. 打开浏览器,访问管理后台地址:

    http://你的ip:6432/nfdadmin/

    如果后台管理已经绑定了域名请使用

    http(s)://你的域名/nfdadmin/

    或根据实际部署的域名和端口访问。

  2. 输入管理员账号密码登录。
    【后台登录界面】

image-1769859098755


2.2 进入网盘配置页面

  1. 登录成功后,在左侧菜单栏找到 “网盘配置” 菜单项。
  2. 点击进入网盘配置管理界面。
  3. 界面包含两个标签页:
    • 配置管理 - 管理网盘认证信息
    • 解析控制 - 管理网盘解析权限、限流等

【网盘配置菜单和列表界面】
image-1769859207974


2.3 界面功能说明

配置管理界面主要功能:

  • 📋 查看列表 - 展示已配置的所有网盘账号
  • ✏️ 编辑配置 - 修改现有配置的认证信息

3. 各网盘认证信息配置说明

3. 各网盘认证信息配置说明

3.1 联通云盘(pwo)

网盘类型代码pwo
支持认证方式:AccessToken
配置难度:⭐⭐⭐

配置字段

字段名说明示例
accesstoken访问令牌2c967a63-bad7-434c-9ea6-993b49ad61ea

获取方法

  1. 使用浏览器访问联通云盘网页版:https://pan.wo.cn
  2. 登录您的账号
  3. F12 打开浏览器开发者工具
  4. 切换到 Application(应用程序) 标签
  5. 展开左侧 LocalStore
  6. 在右侧列表中找到 wocloudinfo 字段,复制其值然后解码
  7. 进行在线base64解码 打开 https://www.toolhelper.cn/EncodeDecode/Base64

【截图预留位置3:联通云盘获取 accesstoken - 开发者工具截图】
11b4da46028570a82fc154044f0960a3


打开:https://www.toolhelper.cn/EncodeDecode/Base64 -> Base64解码 -> 复制token后面的字符串
image-1769861449178

配置示例

配置名称: 我的联通云盘账号网盘类型: pwo认证方式: accesstokenToken: 2c967a63-bad7-434c-9ea6-993b49ad61ea

3.2 移动云盘 / 和彩云(p139)

网盘类型代码p139
支持认证方式:Authorization
配置难度:⭐⭐

配置字段

字段名说明示例
authorization授权令牌完整的 Authorization 头信息

获取方法

  1. 访问移动云盘网页版:https://caiyun.139.com
  2. 登录账号
  3. F12 打开开发者工具 → Network(网络) 标签
  4. 刷新页面或进行任意操作
  5. 选择任一请求,在 Headers(请求头) 中找到 authorization 字段
  6. 复制完整的 authorization 值

【移动云盘获取 Authorization - Network 截图】
image-1769859321021


3.3 天翼云盘(p189)

网盘类型代码p189
支持认证方式

  • AccessToken(大文件推荐)、
  • Cookie(长期有效推荐)、
  • 用户名密码 (内测,可能会触发验证–需要关闭设备锁)

配置难度:⭐⭐⭐

配置字段(方式一:AccessToken - 推荐)

字段名说明示例
accesstoken访问令牌从浏览器获取的 token

配置字段(方式二:Cookie)

字段名说明示例
cookie完整Cookie从浏览器复制的完整 Cookie 字符串

配置字段(方式三:用户名密码,需要关闭安全认证)

字段名说明示例
username天翼云盘手机号13800138000
password天翼云盘密码您的登录密码

重要提示:使用用户名密码方式前,需要在天翼云盘账号设置中关闭安全认证(如短信验证、扫码登录等),否则登录会失败。
关闭方式:

  1. 打开https://e.dlife.cn/portal/web/index.html 登录
  2. 关闭设备锁image-1769860879086

获取方法

  1. 访问天翼云盘网页版:https://cloud.189.cn
  2. 登录账号
  3. F12ApplicationLocal Storagehttps://cloud.189.cn
  4. 查找 accesstoken 字段并复制其值

【天翼云盘获取 accesstoken - Local Storage 】请切换移动视图
image-1769862717382


【天翼云盘获取 cookie 】xhr过滤 listFiles
image-1769860556304


注意事项

  • ⚠️ 天翼云盘 Token 有效期约 30天, cookie有效期一年左右,过期需重新获取
  • 🔗 手机端配置指南:nfd-vip配置指南

3.4 123网盘–服务器IP解析有限制 当前无法使用 仅限于本地部署服务(ye)

网盘类型代码ye
支持认证方式:用户名密码
配置难度:⭐⭐

配置字段(方式一:用户名密码)

字段名说明示例
username账号您的123网盘账号
password密码您的123网盘密码

获取方法(方式一)

直接填写您的123网盘账号和密码即可。

注意事项

  • 💡 推荐使用用户名密码方式,更稳定
  • ⚠️ 123网盘可能存在区域限制

3.5 小飞机网盘(fj)

网盘类型代码fj
支持认证方式:用户名密码
配置难度:⭐

配置字段

字段名说明示例
username账号您的小飞机账号
password密码您的小飞机密码

获取方法

直接使用您在小飞机网盘注册的账号密码。

配置示例

配置名称: 我的小飞机账号网盘类型: fj认证方式: password用户名: your_username密码: your_password

注意事项

  • ⚠️ 小飞机网盘需要代理访问,请确保已在 app-dev.yml 中配置代理
  • 📌 详见 doc/相关问题文档.md 第1章

【截图预留位置7:小飞机网盘配置示例】


3.6 蓝奏云优享(iz)

网盘类型代码iz
支持认证方式:用户名密码
配置难度:⭐

配置字段

字段名说明示例
username登录账号您的蓝奏优享账号
password登录密码您的蓝奏优享密码

获取方法

直接使用您的蓝奏云优享版账号密码。

注意事项

  • 📌 蓝奏云优享(付费版)不同于免费版蓝奏云(lz)
  • ⚠️ 同样需要代理访问

【截图预留位置8:蓝奏云优享配置示例】


3.7 夸克网盘(qk)

网盘类型代码qk
支持认证方式:Cookie
配置难度:⭐⭐

配置字段

字段名说明示例
cookie完整Cookie从浏览器复制的 Cookie 字符串

获取方法

  1. 访问夸克网盘:https://pan.quark.cn
  2. 登录账号
  3. F12ApplicationCookieshttps://pan.quark.cn
  4. 右键点击任一 Cookie → Show Cookies in Headers 或手动拼接所有 Cookie
  5. 复制完整的 Cookie 字符串(格式:key1=value1; key2=value2; ...

【夸克网盘获取 Cookie 】xhr过滤 list
image-1769861811783


3.8 UC网盘(uc)

网盘类型代码uc
支持认证方式:Cookie
配置难度:⭐⭐

配置方法与夸克网盘(qk)相同,访问 https://drive.uc.cn 获取 Cookie。


3.9 阿里云盘(pali)暂不支持


3.10 QQ微云(qqwy)

网盘类型代码qqwy
支持认证方式:Cookie
配置难度:⭐⭐

获取方法

  1. 访问 QQ 微云:https://www.weiyun.com
  2. 登录 QQ 账号
  3. 按前述方法获取 Cookie

【截图预留位置11:QQ微云获取 Cookie 截图】


3.11 免认证网盘

以下网盘无需配置认证信息,系统默认支持:

网盘名称类型代码说明
蓝奏云lz免费版无需认证
QQ邮箱中转站qq无需认证
QQ邮箱网盘qqw无需认证
奶牛快传cow无需认证
移动云空间ec无需认证
联想乐云le无需认证
微雨云pvyy无需认证
城通网盘ct无需认证
115网盘p115无需认证
118网盘p118无需认证
文叔叔ws无需认证

配置方式

  • 在后台新增配置时,选择对应网盘类型
  • 认证方式选择 none
  • 无需填写其他认证字段
  • 直接保存即可

4. 详细配置步骤

  1. 点击“新增网盘配置”。
  2. 选择网盘类型(如天翼云盘 p189)。
  3. 按需填写认证信息(如 accesstoken、cookie、用户名/密码等)。
  4. 可填写备注,便于区分。
  5. 保存后即可生效。

【截图预留:新增网盘配置表单填写示例】


5. 常见问题与排查

  • Token 失效:请重新获取并更新认证信息。
  • 解析失败:检查认证信息是否正确、是否需要代理等。
  • 详细排查见“doc/相关问题文档.md”。

如需详细配置示例或遇到特殊网盘类型,请参考官方文档或联系技术支持。


nfd-vip配置指南

2025年8月6日 02:09

nfd-vip(netdisk-fast-download专属版)配置指南

支持电脑端和安卓手机端
安卓手机端需要via浏览器和插件

电脑端

配置域名和预览URL

配置大文件解析Token

当前大文件支持 蓝奏优享、123、小飞机、天翼云盘、移动云盘、联通云盘

手机端配置指南

  1. 下载via浏览器 https://viayoo.com/zh-cn/

  2. 安装vConsole插件 设置-脚本-添加脚本,复制下面脚本添加到via中,完成后打开任意网站如果出现vConsole绿色图标即配置成功

// ==UserScript==// @name         vConsolev// @namespace    https://viayoo.com/ldqu2n// @version      0.2// @description  via vConsole// @author       You// @run-at       document-start// @match        *://*/*// @grant        none// ==/UserScript==(function() {    'use strict';    var s = document.createElement('script');    s.src = 'https://cdnjs.cloudflare.com/ajax/libs/vConsole/3.15.1/vconsole.min.js';    s.onload = function() {        new VConsole();        console.info('vConsole 3.15.1 ready');    };    document.head.appendChild(s);})();
  1. 登录相关网盘获取认证信息

天翼云盘AccessToken获取方式:

登录天翼云盘:
https://h5.cloud.189.cn/home.html
Screenshot_2025-09-14-22-46-39-745_mark.via-edit
打开via vConsole控制台 在storage里找到accessToken复制即可
IMG_20250914_224741

常见问题

NFD网盘直链解析已添加对目录解析支持

2025年7月14日 11:32

🚀 NFD 网盘直链解析更新:支持文件夹解析与文件预览啦!

📅 发布于:2025-07-13
📌 项目地址:GitHub - qaiu/netdisk-fast-download
🔗 在线演示:http://www.722shop.top:6401/


最近更新了下我的开源项目 NFD 网盘直链解析,带来两个实用的新功能:

✅ 文件夹目录解析(目前仅支持部分网盘)

现在可以直接解析部分网盘的 文件夹分享链接,列出其中的所有文件,支持一键下载、复制链接等操作。

当前支持文件夹解析的网盘包括:

  • ✅ 小飞机网盘
  • ✅ 123 云盘
  • ✅ 蓝奏云 / 蓝奏优享

✅ 文件预览功能上线

除了直链下载,现在还能在线预览部分常见格式的文件,例如 PDF 和图片,打开即看,无需下载,体验更丝滑。


📦 文件解析兼容网盘平台(持续更新中)

当前项目对大部分主流网盘都已支持 文件解析(即单文件直链获取),包括但不限于:

  • 小飞机网盘
  • 蓝奏云 / 蓝奏优享
  • 123 云盘
  • 奶牛快传
  • 移动云空间
  • 亿方云
  • 文叔叔
  • QQ邮箱中转站
  • ……

❗ 大文件解析说明

目前 开源版本暂不支持大文件(例如 1GB+ 的视频、压缩包)解析

如有此类需求,可联系我进行 定制开发,或等待 专属版本 后续开放支持。


🔍 演示截图

随便找了个小飞机网盘的资源链接,直接丢进系统解析了一下,效果如下图所示:
Screenshot_2025-07-13-21-20-18-879_com.android.chrome-edit

文件夹结构自动展开,文件详情一目了然,支持在线打开和下载,体验良好。

(顺带一提,site:feijipan.com 搜起来还挺香的 😎)


🧭 项目导航


欢迎大家使用、Star 支持,有建议/PR/定制需求也可以随时联系!

如需打包部署或本地使用,也可以参考 GitHub 上的说明文档,部署非常简单(一个 Docker 命令搞定)。


C4droid8.0自动补全优化版

2024年7月11日 01:21

该本版基于C4droid8.0中文版对自动补全功能做了增强
无需手动点击补全而自动触发函数提示. 虽然依然很鸡肋, 但比原版稍微好一些. 建议大家入坑Cxxdroid除了不支持导出, 其他功能完爆C4droid
该版本为aarch64 (arm64位架构)不支持X86电脑和arm32的手机

下载地址

C4droid自动补全优化版

直接下载
蓝奏下载

C4droid-SDL插件

直接下载
蓝奏下载

安装说明

  1. 之前未安装过任何版本的C4droid可直接安装
  2. 之前安装过原版(GooglePlay或其他渠道下载的英文版)需要卸载原版和插件.
  3. 之前安装过本站下载的汉化版或重新签名的原版可以直接升级安装.
  4. 安装时如果报签名冲突请卸载旧版和插件后重新安装, 插件需要去应用管理器里找SDL和GCC卸载.
  5. 安装时提示风险应用为正常现象(早期MT签名导致, 现只要识别到C4droid的包名就会报毒!), 有些银行APP可能受影响无法打开, 介意的话请酌情下载安装.
  6. 内置GCC10 无需额外安装GCC插件, 有图形化编程的需求可以下载SDL插件.

界面展示

Screenshot_2024-07-10-11-17-13-691_com.n0n3m4.droidc-edit

运行效果:
Screenshot_2024-07-10-11-17-29-894_com.n0n3m4.droidsdl-edit

Pydroid3 7.2中文整合版 (汉化+内置所有依赖)安装教程

2024年3月31日 17:44

声明

Pydroid7.2中文整合版基于Google play的pydroid7.2修改,解锁高级功能参考了云中龙++发布的pydroid3v7.0DIC

该版本仅供学习参考使用,禁止任何二次售卖行为(APP关于界面提供打赏入口,打赏支持,不胜感激!),如果条件允许,建议付费支持一下官方正版。

教程更新日志

2024-03-31 发布7.2汉化整合版, 打包了插件提供的所有依赖, 直接安装即可,本次更新修复了pydroid3无法访问全部文件的问题。

2023-11-18 发布7.0汉化整合版, 打包了插件提供的所有依赖, 直接安装即可(为了表述方便,以后包含所有obb依赖的全量版统一称之为整合版)

2023-07-19 发布6.2.1汉化整合版, 打包了插件提供的所有依赖, 直接安装即可

2023-04-28 发布6.2汉化版, 使用云安装脚本简化安装流程; 之前的版本安装繁琐不建议使用

2023-04-22 网盘直链下载解析器重构完成, 测试应该没啥问题, 如果遇到无法下载的问题, 请及时和我联系

微信图片_20230719105021

版本说明(v7.2)

Screenshot_2024-03-31-01-04-36-467_com.miui.securitycenter-edit

  • Pydroid3v7.2汉化整合版需要安装2个Apk分别是Pydroid3v7.2中文整合版主程序Pydroid 3_7.2_arm64_q_cn.apk、Pydroid3权限插件Pydroid Permissions Plugin_2.2_sign.apk,都是在原版基础上重新签名如果存在签名冲突,需要卸载之前版本和插件重新安装。

  • 该版本和原版的区别:

    • 内置了预制库插件提供Whl库因此APK体积膨胀到了300+M安装后2.3g左右,如人工智能机器学习相关领域开发的TensorFlow和PyTorch,图像识别相关的OpenCV,QT组件库等等,如果只是基于Console学习Python入门可以不必安装整合版, 安装精简版即可, 体积更小(60M)。

    • 解释所有高级版特性。

    • 默认主题改为黑色,默认字体改为12号,默认关闭信息收集,去除订阅管理以及所有订阅相关菜单项,默认允许键盘建议(防止出现输入法为安全键盘问题)。

  • 该版本同时提供汉化版和英文版,由于精力有限,仅提供aarch64架构版本,其他x86或者arm等需求可付费定制。

  • 从7.0完整版开始可以升级安装7.2的完整版,不必重新安装,权限插件无需升级。

  • 新安装后首次启动会解压资源包,耗时比较长(1-3分钟)。

  • 为什么要制作整合版本:开箱即用,免去用户手动安装各类依赖的麻烦,避免了有些依赖安装失败导致的各类问题,使用jupyter仅需一行命令:jupyter notebook

视频讲解:

下载地址

Pydroid3v7.2中文整合版主程序

Pydroid3v7.2英文整合版主程序

Pydroid3权限插件

备用下载地址

移动云空间网盘分享_Pydroid3v7.2中文整合版主程序

移动云空间网盘分享_Pydroid3v7.2英文整合版主程序

移动云空间网盘分享_Pydroid3权限插件

安装指南

  1. 根据需求下载安装一个中文版或者英文版主程序和一个插件,如果之前安装过7.0整合版可以只安装主程序。

  2. 初次打开Pydroid会进行Python初始安装, 因为是整合版所以安装会比较慢一般不会超过3分钟(视手机性能而定)。

常见问题

  1. 安装失败:
  • 签名冲突 卸载旧版本和插件, 插件没有图标需要在系统设置-应用管理卸载

  • 不兼容: 当前只支持aarch64架构

  1. pyzstd安装报错:终端下运行
pip install pyzstd==0.15.6
  1. pip安装某些依赖库失败: 这个问题比较普遍, Pydroid能力有限, 如果指定旧版本安装依旧报错的话也没办法.

  2. 代码运行报错或者其他疑难杂症,Google/Bing/百度/一下,或者进去QQ群(1026766509)讨论,或者留言评论,或者去问题反馈平台截图提问,由于博主精力有限加QQ视问题难度提供付费解答。

  3. 为了防止后台切换时软件重启导致丢失代码,建议关闭电量优化:MIUI-省电策略-无限制。

Pydroid3 v7.0整合版(汉化+内置所有依赖)安装教程

2023年11月19日 13:04

声明

当前版本基于云中龙++发布pydroid3v7.0DIC版本汉化修改而来
该版本仅供学习参考使用,禁止任何二次售卖行,为如果条件允许,建议付费支持一下官方正版(DIC版可以在奇妙应用平台搜索下载,正版需要在GooglePlay下载然后内购)。

教程更新日志

2023-11-18 发布7.0汉化整合版, 打包了插件提供的所有依赖, 直接安装即可(为了表述方便,以后包含所有obb依赖的全量版统一称之为整合版)
2023-07-19 发布6.2.1汉化整合版, 打包了插件提供的所有依赖, 直接安装即可
2023-04-28 发布6.2汉化版, 使用云安装脚本简化安装流程; 之前的版本安装繁琐不建议使用
2023-04-22 网盘直链下载解析器重构完成, 测试应该没啥问题, 如果遇到无法下载的问题, 请及时和我联系

微信图片_20230719105021

版本说明

Screenshot_2023-11-18-22-53-49-805_com.miui.securitycenter-edit

  • Pydroid3 v7.0汉化整合版需要安装2个Apk分别是Pydroid7.0主程序Pydroid权限插件,都是在原版基础上重新签名,安装时请保证原版包括插件已卸载干净。

  • 该版本和原DIC版唯一区别是内置了预制库插件提供Whl库因此APK体积膨胀到了300+M安装后2.3g左右,如人工智能机器学习相关领域开发的TensorFlow和PyTorch,图像识别相关的OpenCV,QT组件库等等,如果只是基于Console学习Python入门可以不必安装全量版, 安装7.0DIC版即可, 安装体积更小(50M)。

  • 从6.2版可以升级安装7.0的完整版(包括插件),不必重新安装,安装后第一次启动会解压资源包,且耗时比较长(1-5分钟)。

  • 为什么要制作整合版本:虽然pydroid3一直在Google商店更新,但二进制2年多没啥变化了,其轮子(whl)插件内置的依赖越来越难自洽,出现了各种版本导致依赖安装失败问题,开始还能通过降低版本解决,但最近发现TensorFlow和jupyter都安装不了了,于是干脆将依赖全部打包

视频讲解:

下载地址

Pydroid3v7.0汉化整合版主程序

Pydroid3权限插件

备用下载地址

移动云空间网盘分享_Pydroid3v7.0汉化整合版主程序

[移动云空间网盘分享_Pydroid3权限插件] (https://www.ecpan.cn/web/#/yunpanProxy?path=%2F%23%2Fdrive%2Foutside&data=e7f868d1d5c5f6661de9f7a0e558c892efCU&isShare=1)

安装指南

  1. 分别下载两个Apk安装包,

  2. 安装主程序一个插件

  3. 初次打开Pydroid会进行Python初始安装, 因为是全量包所以安装会比较慢, 一般进度条到100%后等个一两分钟就会安装完毕(视手机性能而定, RedmiK40一分钟左右)

总结一下:

下载并一个主程序和一个插件安装即可

常见问题

  1. 安装失败:
  • 签名冲突 卸载旧版本和插件, 插件没有图标需要在系统设置-应用管理卸载

  • 不兼容: 当前只支持aarch64架构

  1. pyzstd安装报错:终端下运行
pip install pyzstd==0.15.6
  1. pip安装某些依赖库失败: 这个问题比较普遍, Pydroid能力有限, 如果指定旧版本安装依旧报错的话也没办法.

  2. 代码运行报错: Google/Bing/百度一下吧

我用的idea插件

2021年9月12日 15:57

image.png

重装idea时必备插件

  • IDE Eval Rest 白嫖用的 需要添加插件源 https://plugins.zhile.io
  • GitToolBox inline blame annotation
  • CamelCase 切换命名风格–比如驼峰<->下划线 CTRL+ALT+U
  • CodeGlance 略缩图 CTRL+SHIFT+G
  • Codota AI Autocomplete for Java 代码提示补全工具
  • GitHub Copilot 代码提示补全工具(比较逆天 慎用)
  • Jrebel 热部署(付费, 需要POJIE)
  • 主题相关
    • Dark purple
    • Dracula
    • One Dark
    • Atom Material Icons
  • PlantUML 通过coding自动生成UML图 需要安装额外的EXE
  • Rainbow Brackets 彩虹括号, 字面意思, 美化回调地狱下的括号 使之更有辨识度
  • statistic 代码统计, 可以看到你今天敲了几行代码
  • 翻译相关:
    • Chinese 中文语言包 idea官方出的中文插件
    • Translation 翻译文档注释 代码等等
  • 语言增强
    • vue
    • python
    • AsciiDoc
    • bat支持, shell支持等
  • 其他
    • Sudoku Plugin 摸鱼不解释
    • Leetcode editor 搬砖不忘刷题
  1. 未完待续…随缘更新
    image
    image.png
    image.png
    image.png

天翼云使用体验--对比阿里腾讯云: 上下行带宽都限速

2023年6月22日 06:31

测试命令

  1. 网盘下载
# jdk-8u202-linux-x86.tar.gzcurl -L   https://lz.qaiu.top/cow/dab06dd8cf8b42 > /dev/null
  1. 镜像源下载
curl https://mirrors.aliyun.com/centos/7.9.2009/isos/x86_64/CentOS-7-x86_64-DVD-2009.iso -o /dev/null

1. 天翼云1Mbps(华东1-扬州)

网盘下载  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current                                 Dload  Upload   Total   Spent    Left  Speed  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0  0  185M    0  958k    0     0   115k      0  0:27:20  0:00:08  0:27:12  118k镜像源下载  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current                                 Dload  Upload   Total   Spent    Left  Speed  0 4494M    0  545k    0     0   134k      0  9:30:04  0:00:04  9:30:00  134k^

2. 天翼云5Mbps (华东1-扬州)

网盘下载  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current                                 Dload  Upload   Total   Spent    Left  Speed  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0  1  185M    1 3125k    0     0   574k      0  0:05:29  0:00:05  0:05:24  563k^ 镜像源下载  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current                                 Dload  Upload   Total   Spent    Left  Speed  0 4494M    0 5938k    0     0   610k      0  2:05:37  0:00:09  2:05:28  564k

3 天翼云5Mbps-windows (山东-青岛1)

image-1687335895817

4. 腾讯云6Mbps(北京)

[root@VM-0-3-centos ~]# curl -L  http://lz.qaiu.top/cow/dab06dd8cf8b42 > /dev/null  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current                                 Dload  Upload   Total   Spent    Left  Speed100   178  100   178    0     0   1327      0 --:--:-- --:--:-- --:--:--  1328  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0100  185M  100  185M    0     0  11.9M      0  0:00:15  0:00:15 --:--:-- 12.1M

5. 阿里云1Mbps(乌兰察布)

#[root@iZ0jlc8zj9cfcvxa8e6lpcZ ~]# curl https://mirrors.aliyun.com/centos/7.9.2009/isos/x86_64/CentOS-7-x86_64-DVD-2009.iso -o /dev/null  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current                                 Dload  Upload   Total   Spent    Left  Speed  0 4494M    0 3777k    0     0   314k      0  4:04:10  0:00:12  4:03:58  327k[root@iZ0jlc8zj9cfcvxa8e6lpcZ ~]# curl -L   https://lz.qaiu.top/cow/dab06dd8cf8b42 > /dev/null  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current                                 Dload  Upload   Total   Spent    Left  Speed  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0 14  185M   14 27.0M    0     0  3569k      0  0:00:53  0:00:07  0:00:46 4475k

总结

  1. 天翼华东1-扬州上下行均限速 带宽为实际分配公网带宽, 青岛区下行不限速
  2. 腾讯云,阿里云 仅上行(出口)限速 下行不限速

Excel 提取姓名首字母公式

2023年1月14日 05:54

#Excel 提取姓名首字母公式

1. 公式

  1. 无法区分多音字
  2. 个别字和生僻字识别有误
    因此需要手动校对
=VLOOKUP(MID(C2,1,1),{"",0;"吖","A";"八","B";"攃","C";"咑","D";"鵽","E";"发","F";"旮","G";"哈","H";"丌","J";"咔","K";"垃","L";"妈","M";"乸","N";"噢","O";"帊","P";"七","Q";"冄","R";"仨","S";"他","T";"屲","W";"夕","X";"丫","Y";"帀","Z"},2)&VLOOKUP(MID(C2,2,1),{"",0;"吖","A";"八","B";"攃","C";"咑","D";"鵽","E";"发","F";"旮","G";"哈","H";"丌","J";"咔","K";"垃","L";"妈","M";"乸","N";"噢","O";"帊","P";"七","Q";"冄","R";"仨","S";"他","T";"屲","W";"夕","X";"丫","Y";"帀","Z"},2)&(IF(LEN(C2)>2,VLOOKUP(MID(C2,3,1),{"",0;"吖","A";"八","B";"攃","C";"咑","D";"鵽","E";"发","F";"旮","G";"哈","H";"丌","J";"咔","K";"垃","L";"妈","M";"乸","N";"噢","O";"帊","P";"七","Q";"冄","R";"仨","S";"他","T";"屲","W";"夕","X";"丫","Y";"帀","Z"},2),""))

2. VBS宏

不支持WPS个人版(免费)

Function Getpychar(char)temp = 65536 + Asc(char)If (temp >= 45217 And temp <= 45252) ThenGetpychar = "A"ElseIf (temp >= 45253 And temp <= 45760) ThenGetpychar = "B"ElseIf (temp >= 45761 And temp <= 46317) ThenGetpychar = "C"ElseIf (temp >= 46318 And temp <= 46825) ThenGetpychar = "D"ElseIf (temp >= 46826 And temp <= 47009) ThenGetpychar = "E"ElseIf (temp >= 47010 And temp <= 47296) ThenGetpychar = "F"ElseIf (temp >= 47297 And temp <= 47613) ThenGetpychar = "G"ElseIf (temp >= 47614 And temp <= 48118) ThenGetpychar = "H"ElseIf (temp >= 48119 And temp <= 49061) ThenGetpychar = "J"ElseIf (temp >= 49062 And temp <= 49323) ThenGetpychar = "K"ElseIf (temp >= 49324 And temp <= 49895) ThenGetpychar = "L"ElseIf (temp >= 49896 And temp <= 50370) ThenGetpychar = "M"ElseIf (temp >= 50371 And temp <= 50613) ThenGetpychar = "N"ElseIf (temp >= 50614 And temp <= 50621) ThenGetpychar = "O"ElseIf (temp >= 50622 And temp <= 50905) ThenGetpychar = "P"ElseIf (temp >= 50906 And temp <= 51386) ThenGetpychar = "Q"ElseIf (temp >= 51387 And temp <= 51445) ThenGetpychar = "R"ElseIf (temp >= 51446 And temp <= 52217) ThenGetpychar = "S"ElseIf (temp >= 52218 And temp <= 52697) ThenGetpychar = "T"ElseIf (temp >= 52698 And temp <= 52979) ThenGetpychar = "W"ElseIf (temp >= 52980 And temp <= 53640) ThenGetpychar = "X"ElseIf (temp >= 53689 And temp <= 54480) ThenGetpychar = "Y"ElseIf (temp >= 54481 And temp <= 62289) ThenGetpychar = "Z"ElseGetpychar = charEnd IfEnd FunctionFunction Getpy(str)For a = 1 To Len(str)Getpy = Getpy & Getpychar(Mid(str, a, 1))Next aEnd Function

CxxdroidPydroidJvdroid三件套原版

2022年5月3日 02:29

CxxdroidPydroidJvdroid三件套原版下载

这三个app是截止到目前(2022-05-02)为止的最新版,已解锁全部功能,未汉化,原滋原味
IMG_20220502_121743

1. Pydroid(已修复不能运行的bug)

  • 直接下载 备用地址
  • 安装插件参考
  • TensorFlow安装报错请使用 pip install keras==2.6
    ================================
    IMG_20220721_135337
  • 版本: 5.0_arm64
  • 原版更新日期: 2021-10-30 (Google Play Store)
  • 语言: 英文
  • 特性: 解锁高级版功能, Python3.9 内置多种机器学习, 视觉库, pip包管理器
  • 测试机型: Redmi K40-Android12-MIUI13

2. Cxxdroid

直接下载 备用地址

IMG_20220721_135242

  • 版本: 5.0_arm64
  • 原版更新日期: 2022-01-09 (Google Play Store)
  • 语言: 英文
  • 特性: 解锁高级版功能, Clang编译器+自动语法补全,内置多种常用依赖包,SDL2,Cmake项目管理, 不支持APK导出
  • 测试机型: Redmi K40-Android12-MIUI13

3. Jvdroid

直接下载 备用地址

IMG_20220721_135207

  • 版本: 5.0_arm64
  • 原版更新日期: 2022-01-08 (Google Play Store)
  • 语言: 英文
  • 特性: 解锁高级版功能, OpenJDK11 + Maven包管理, 多种JVM方言如Kotlin, Scala
  • 测试机型: Redmi K40-Android12-MIUI13

C4droid8.0汉化版下载

2021年12月9日 16:33

其他版本

C4droid优化版下载

QQ截图20200308220630

下载链接-蓝奏线路

8.0版本(安装8.0请先卸载旧版本!!!)

直接下载使用本站提供的蓝奏云解析功能一键获取直链并下载,为防止失效,提供原蓝奏云地址作为备用地址

C4droid8-aarch64(arm64位)+SDL插件:
直接下载 备用地址

C4droid8共存版-aarch64(arm64位)+SDL插件:
直接下载 备用地址

7.0版本

C4droid7.0-aarch64(arm64位):
直接下载 备用地址
C4droid7.0-i386(x86)
下载链接 备用地址
C4droid7.0-armeabi(arm32位)
直接下载 备用地址
C4droid7.0-SDL插件-通用
直接下载 备用地址

C4droid7.0-aarch64-arm64位共存版
直接下载 备用地址
C4droid-SDL插件-共存版
直接下载 备用地址

通用插件

QT插件(所有版本通用)
直接下载 备用地址

百度网盘(C4droid7.0版)

百度网盘下载 提取码:678b

💓 食用指南(必读):

  • 0x0. 原版来源于谷歌商店 更新日期:2020-10-06(确认停更,目前作者只维护Cxxdroid三件套)
  • 💟 0x1. C4droid8系列的GCC版本是10.2,6.97版的GCC为9.1
  • 💝 0x2. 所有版本自动整合了GCC插件, 所以不需要额外下载GCC
  • 💛 0x3. 根据系统及CPU架构选择相应的版本, 安装前必须卸载原版(参考第9条)
  • 💘 0x4. QT插件Cuteload需要自启动(不要阻止唤醒)权限
  • 💖 0x5. 为避免签名冲突,如果已安装其他人的汉化版本或原版请先卸载包括插件
  • 💗 0x6. QAIU编程辅助工具制作中, 可一键卸载历史版本, 安装应用等敬请期待
  • 💞 0x8. 内置示例下载 点击下载
  • 🐱 0x9 博主整理的C4droid各种栗子,初学者强烈推荐!
  • 😪 0xa 由于汉化过程中不当处理导致QT项目级别无法正常编译, 有QT相关需要的话请下载C4droid8.0原版

更新日志:

8.01

  • QT不在依赖于第三方应用(不建议使用QT)
  • GCC更新为10.2 支持中文标识符和cpp20部分特性
  • 修复了光标遇到括号乱跳问题

7.00,6.97,6.95

  • 添加了Android 9支持
  • 添加了SFML,FLTK和Allegro图形库
  • 添加了C++类成员代码补全
  • 添加了CMake支持
  • 从Ministro II迁移Qt到CuteLoader
  • 将GCC更新至9.1.0
  • 内置示例NativeActivity里增加vulkan图形渲染例子
  • 修复了一些BUG

汉化记录

  1. 两个版本都是完全汉化版,各自独立。原版来源于谷歌商店,付费购买。都是64位。其中,中文版和原版包名一致,安装时应避免签名冲突(安装需要卸载原版及插件)。共存版修改了包名,不会存在任何签名问题,可以和原版,原汉化版,此中文版一起使用。
  2. 汉化并解决了原版存在的部分问题,增加了一些常用库文件,包括libiconv,libmad,libxvidcore等等。
  3. 解决了原版中文导出包和中文断点调试乱码的bug
  4. 修改了默认编译参数,修改gcc参数-std=c11(原版为c99) ;g++改为c++17并解决了c++17的异常抛出bug。
  5. 修改了默认设置,包括字体,字号,标签栏,默认显示终端模拟器按钮等等。
    设置里加入了两个教程网站,和c4droid群的加群链接。
  6. 增加了两个命令,zip命令行压缩工具,和lua命令。
  7. 重新编译了ncursesw替换掉原版的ncurses以支持中文。
  8. 经测试v6.97使用了busybox的sh命令为默认shell,可以直接运行/sdcard下的可执行文件,这是个不错的改进。
  9. 很多时候./configure编译库会出现mkdir /temp/xxx 没有此目录的错误,蜜汁bug,怎么能在根目录下直接读写文件呢(起码也要挂载读写分区)。不过最近找到了一个临时方案:
  • ①首先有root权限(命令行挂载分区命令有点麻烦,故使用re管理器
  • ②然后打开re管理器,在sdcard下新建一个tmp目录,然后链接到系统根目录下为tmp。
  • ③最后你会发现./configure一路顺畅 OK完美解决

常见问题(Q&A):

1. Q:安装不上,安装失败签名错误等     A:卸载原版和插件,建议使用一键卸载c4droid工具卸载,共存版安装不上请加QQ  2. Q:安装后打不开(闪退)     A:安装之前使用手机类型查看器查看系统架构 3. Q:无法开启断点调试,断点调试没反应   A:给c4droid悬浮窗权限,具体操作因系统而异4. QT插件问题   Q:无法运行qt应用程序   A:检查是否安装了cubeLoader插件,如果已经安装了插件还是运行不了,请检查cubeLoader是否有自启动权限(重要),有些系统需要允许被第三方应用唤醒,或者禁用应用阻断唤醒 5. 导出应用问题   Q:导出失败   A:检查文件名是否合法,检查资源路径是否合法,检查代码是否可以运行   Q:导出包,解析失败无法安装   A:导出时是否使用了中文(全角)字符包名,必须使用英文(半角)包名  6. 外观问题   Q:没有自动换行;A:设置->自动换行   Q:没有代码补全? A:设置->代码补全   ps:调整编辑器字体和调整终端字体是两个不同的概念不要混淆,前者是写代码时的字体,后者是运行后的字体 7. 语法错误和其他问题     语法算法问题去C语言吧     其他问题,请加我QQ736226400

免责声明

  1. 本软件汉化工作未经原作者授权
    如果原作者看到并不希望他人汉化,
    请联系本人,立即删除
  2. 本软件的汉化版本仅供个人学习之用,
    不得用于任何商业目的,
    不得以任何方式修改本软件,
    基于此产生的法律责任本人不承担连带责任。
  3. 本人不保证软件安全性,
    不保证教程内容的正确性。
    通过使用本软件带来的风险和后果与本人无关
❌
❌