logo
1
0
WeChat Login
feat: add proxy client helper and clean readme

mihomo-proxy

把订阅节点写入本地数据库,生成 mihomo 多端口监听池,并通过 Go 网关提供:

  • HTTP 代理:3480
  • SOCKS5 代理:3482
  • 后台与 API:3481

当前支持两种代理入口:

  • 节点端口
  • 分组端口

项目结构

前置要求

  • Docker / Docker Compose
  • Ruby
  • Python 3

快速开始

1. 生成运行数据

ruby scripts/generate_mihomo_config.rb \ --subscription-url "你的订阅地址"

会生成:

  • generated/config.yaml
  • generated/node-port-map.csv
  • generated/proxy.db

2. 配置后台口令

cp .env.example .env

.env.example 里当前只有一项:

ADMIN_KEY=visual2010

你可以自行改成自己的后台口令。

3. 启动

详细部署说明请看:

docker compose up -d --build

如果是生产环境,想直接使用已构建好的镜像:

docker compose -f docker-compose.prod.yml up -d

如果是 NAS 环境,优先使用:

docker compose -f docker-compose.nas.yml up -d --build

说明:

  • gatewaymihomo 在同一个 Docker network 内通信
  • mihomo 不对宿主机暴露端口
  • 后台登录由 ADMIN_KEY 控制

本地直接运行

如果只想本地联调 Go 服务:

ADMIN_KEY=visual2010 GOCACHE=/tmp/mihomo-go-build go run ./cmd/proxy-gateway

如果只联调后台,不开代理端口:

ADMIN_ONLY=true ADMIN_KEY=visual2010 GOCACHE=/tmp/mihomo-go-build go run ./cmd/proxy-gateway

端口说明

  • 3480
    • HTTP 代理端口
  • 3482
    • SOCKS5 代理端口
  • 3481
    • 后台页面、公开接口、后台管理接口

接口说明

项目接口分成两类:

  • Public
    • 对外消费接口
    • 不需要后台登录
  • Admin
    • 后台管理接口
    • 统一走 /api/v1/admin/*
    • 需要先登录后台
    • 包含订阅管理、节点管理、分组管理、配置中心等接口

完整接口说明与 curl 示例请看:

代理使用示例

节点代理 HTTP:

curl --proxy "http://40089:x@127.0.0.1:3480" https://ipinfo.io/ip

节点代理 SOCKS5:

curl --proxy "socks5h://40089:x@127.0.0.1:3482" https://ipinfo.io/ip

分组代理 HTTP:

curl --proxy "http://45400:x@127.0.0.1:3480" https://ip.123408.xyz/info

分组代理 SOCKS5:

curl --proxy "socks5h://45400:x@127.0.0.1:3482" https://ip.123408.xyz/info

Python 示例:

import json import urllib.request proxy_port = 45400 # 也可以替换成公开接口返回的节点端口 proxy = f"http://{proxy_port}:x@127.0.0.1:3480" opener = urllib.request.build_opener( urllib.request.ProxyHandler({ "http": proxy, "https": proxy, }) ) req = urllib.request.Request( "https://ip.123408.xyz/info", headers={"User-Agent": "mihomo-proxy-demo/1.0"}, ) with opener.open(req, timeout=15) as resp: data = json.loads(resp.read().decode("utf-8")) print(json.dumps(data, ensure_ascii=False, indent=2))

Python requests 示例:

import requests proxy_port = 45400 # 也可以替换成公开接口返回的节点端口 proxy = f"http://{proxy_port}:x@127.0.0.1:3480" resp = requests.get( "https://ip.123408.xyz/info", proxies={ "http": proxy, "https": proxy, }, headers={"User-Agent": "mihomo-proxy-demo/1.0"}, timeout=15, ) resp.raise_for_status() print(resp.json())

说明:

  • 用户名可以是目标节点本地端口,也可以是分组端口
  • 密码当前可随意填一个占位值
  • 3480 是 HTTP 代理入口
  • 3482 是 SOCKS5 代理入口
  • 本机如果配置了 HTTP_PROXY / HTTPS_PROXY / ALL_PROXY,测试前建议先清空

测试脚本

随机取一个节点并访问目标站:

python3 scripts/check_google_via_random_proxy.py

可选参数:

python3 scripts/check_google_via_random_proxy.py \ --control-url http://127.0.0.1:3481 \ --gateway-host 127.0.0.1 \ --gateway-port 3480 \ --target-url https://google.com