#!/usr/bin/python # -*- coding:utf-8 -*- import json logLevel = 'warning' def __baseConfig(socksPort: int, outboundObject: dict) -> dict: # v2ray配置生成 return { 'log': { 'loglevel': logLevel }, 'inbounds': [ { 'port': socksPort, 'listen': '127.0.0.1', 'protocol': 'socks', 'settings': { 'udp': True, 'auth': 'noauth' } } ], 'outbounds': [ outboundObject ] } def __secureConfig(secureInfo: dict or None) -> dict: # TLS加密传输配置 if secureInfo is None: return {} return { 'security': 'tls', 'tlsSettings': { 'allowInsecure': not secureInfo['verify'] # sni # alpn } } def __tcpConfig(streamInfo: dict) -> dict: # TCP传输方式配置 tcpObject = {} return {**{ 'network': 'tcp', 'tcpSettings': tcpObject }, **__secureConfig(streamInfo['secure'])} def __kcpConfig(streamInfo: dict) -> dict: # mKCP传输方式配置 kcpObject = {} return {**{ 'network': 'kcp', 'kcpSettings': kcpObject }, **__secureConfig(streamInfo['secure'])} def __wsConfig(streamInfo: dict) -> dict: # WebSocket传输方式配置 wsObject = {} return {**{ 'network': 'ws', 'wsSettings': wsObject }, **__secureConfig(streamInfo['secure'])} def __h2Config(streamInfo: dict) -> dict: # HTTP/2传输方式配置 h2Object = {} return {**{ 'network': 'h2', 'httpSettings': h2Object }, **__secureConfig(streamInfo['secure'])} def __quicConfig(streamInfo: dict) -> dict: # QUIC传输方式配置 quicObject = {} return {**{ 'network': 'quic', 'quicSettings': quicObject }, **__secureConfig(streamInfo['secure'])} def __grpcConfig(streamInfo: dict) -> dict: # gRPC传输方式配置 grpcObject = {} return {**{ 'network': 'grpc', 'grpcSettings': grpcObject }, **__secureConfig(streamInfo['secure'])} def __vmessConfig(proxyInfo: dict) -> dict: # VMess节点配置 streamType = proxyInfo['stream']['type'] if streamType == 'tcp': streamObject = __tcpConfig(proxyInfo['stream']) elif streamType == 'kcp': streamObject = __kcpConfig(proxyInfo['stream']) elif streamType == 'ws': streamObject = __wsConfig(proxyInfo['stream']) elif streamType == 'h2': streamObject = __h2Config(proxyInfo['stream']) elif streamType == 'quic': streamObject = __quicConfig(proxyInfo['stream']) elif streamType == 'grpc': streamObject = __grpcConfig(proxyInfo['stream']) else: raise Exception('Unknown stream type') return { 'protocol': 'vmess', 'settings': { 'vnext': [ { 'address': proxyInfo['server'], 'port': proxyInfo['port'], 'users': [ { 'id': proxyInfo['id'], 'alterId': proxyInfo['aid'], 'security': proxyInfo['method'] } ] } ] }, 'streamSettings': streamObject } def load(proxyInfo: dict, socksPort: int, configFile: str) -> tuple[list or None, str or None, dict or None]: """ VMess配置载入 proxyInfo: 节点信息 socksPort: 本地通讯端口 configFile: 配置文件路径 节点有误: return None, None, None 载入成功: return startCommand, fileContent, envVar """ config = __baseConfig(socksPort, __vmessConfig(proxyInfo)) return ['v2ray', '-c', configFile], json.dumps(config), {} info = { 'server': '1.1.1.1', 'port': 12345, 'method': 'aes-128-gcm', 'id': 'eb6273f1-a98f-59f6-ba52-945f11dee100', 'aid': 64, 'stream': { 'type': 'tcp', 'obfs': None, 'secure': { 'sni': '', 'alpn': 'h2,http/1.1', 'verify': True } } } ret = load(info, 1080, '/tmp/ProxyC/test.json') print(ret[1])