Skip to content

自动启动代理程序V2rayN

1. 需求说明

我们有一个科学代理程序V2rayN,使用的规则是每天动态修改端口号,避免被墙。正常情况下,可以每天手动修改代理程序的端口号,然后重启程序。但每次手动修改并启动程序有点麻烦,因此想通过Python脚本自动启动程序。

2. 程序说明

2.1 程序目录结构

sh
$ find . -maxdepth 1
.
./.gitignore
./.idea
./.venv
./config.yaml
./guiNConfig.json
./logs
./main.py
./Pipfile
./Pipfile.lock
./requirements.txt
  • main.py程序主文件。
  • config.yaml程序配置文件,与代理程序V2rayN相关的配置。
  • requirements.txt依赖包配置文件。
  • guiNConfig.json,代理程序V2rayN的配置文件备份文件,不要将该文件上传到git仓库,避免信息泄露。

2.2 依赖包安装说明

可以使用以下命令直接安装依赖包:

sh
pip install -r requirements.txt

2.3 主程序

主程序main.py内容如下:

python
#!/usr/bin/python3
# filename: main.py
# author: meizhaohui
# date: 2023-12-11
# desc: auto change v2rayN-Core config file.
import os
import shutil
import json
import datetime
from collections import OrderedDict
import subprocess

# 第三方包
# pip install -r requirements.txt
# 日志模块
from loguru import logger
import yaml

# 当前文件所在目录
BASE_DIR = os.path.dirname(os.path.abspath(__file__))

# 日志文件夹
LOG_FILE = f'{BASE_DIR}{os.sep}logs{os.sep}auto_start.log'
# 设置日志文件,目录会自动创建
logger.add(LOG_FILE)

# V2rayN的配置文件
YAML_CONFIG = f'{BASE_DIR}{os.sep}config.yaml'
logger.info(f'V2rayN胡配置文件:{YAML_CONFIG}')
today = datetime.datetime.today()
today_str = today.strftime('%m%d')
logger.info(f'今天日期:{today_str}')


class V2RAY:
    def __init__(self):
        """构造函数"""
        with open(YAML_CONFIG, encoding='utf-8') as yaml_file:
            self._v2ray = yaml.safe_load(yaml_file)
            logger.info(f'代理程序配置:{self._v2ray}')
        # 代理程序配置信息
        self._v2ray_info = self._v2ray.get('v2rayn_info')
        logger.info(f'代理程序配置信息:{self._v2ray_info}')
        self.exe_path = self._v2ray_info.get('exe_path')
        # 代理程序名称
        self.exe_name = self._v2ray_info.get('exe_name')
        # 代理程序启动路径
        self.exe_start_path = f'{self.exe_path}{os.sep}{self.exe_name}'
        logger.info(f'代理程序启动路径:{self.exe_start_path}')
        # 代理程序配置文件
        self.default_config = f"{self.exe_path}{os.sep}{self._v2ray_info.get('config_name')}"
        logger.info(f'代理程序配置文件:{self.default_config}')
        # 代理程序备份配置文件
        self.backup_config = f"{BASE_DIR}{os.sep}{self._v2ray_info.get('config_name')}"
        logger.info(f'代理程序备份配置文件:{self.backup_config}')

    def change_config(self):
        """修改配置文件"""
        logger.info('备份配置文件')
        shutil.copyfile(self.default_config, self.backup_config)
        # 读取备份的配置文件,并写入到默认(旧的)配置文件中
        with open(self.backup_config, encoding='utf-8') as f_in, \
                open(self.default_config, mode='w', encoding='utf-8') as f_out:
            # 加载json数据时保持原来顺序
            logger.info('加载json数据时保持原来顺序')
            json_dict = json.load(f_in, object_pairs_hook=OrderedDict)
            current_port = json_dict.get('vmess')[0].get("port")
            logger.info(f'当前端口号:{current_port}')
            json_dict.get('vmess')[0]["port"] = int(f'2{today_str}')
            new_port = json_dict.get('vmess')[0].get("port")
            logger.info(f'新的端口号:{new_port}')
            logger.info('将json数据写入到配置文件中')
            json.dump(json_dict, f_out, indent=2, ensure_ascii=False)
            logger.success('配置文件修改成功')

    def start_proxy(self):
        """启动代理程序"""
        subprocess.Popen(self.exe_start_path, stdin=subprocess.PIPE,
                         stdout=subprocess.PIPE, stderr=subprocess.PIPE)
        logger.success('代理程序自动启动成功!')


if __name__ == '__main__':
    v2obj = V2RAY()
    v2obj.change_config()
    v2obj.start_proxy()

该程序主要做以下事情:

  • 自动获取当日时间字符串,如今天是2023年12月11日,则对应月份和日期的字符串为1211,用于生成新的端口号,如21211。
  • 从V2rayN的配置文件 config.yaml,读取V2rayN的路径信息D:\ProgramFiles\v2rayN-Core、可执行文件名称v2rayN.exe、配置文件名称guiNConfig.json等。
  • 备份配置文件guiNConfig.json到当前目录。
  • 读取备份配置文件guiNConfig.json内容到json_dict中,并对该字典中的端口号信息进行修改,修改完成后将字典信息写入到原始配置文件guiNConfig.json中。
  • 启动V2rayN可执行程序。

2.4 运行程序

使用pycharm运行程序:

sh
E:\data\github_data\vueblog\myblog\docs\.vuepress\public\scripts\python\auto_start_proxy\.venv\Scripts\python.exe E:/data/github_data/vueblog/myblog/docs/.vuepress/public/scripts/python/auto_start_proxy/main.py
2023-12-11 23:12:06.328 | INFO     | __main__:<module>:28 - V2rayN胡配置文件:E:\data\github_data\vueblog\myblog\docs\.vuepress\public\scripts\python\auto_start_proxy\config.yaml
2023-12-11 23:12:06.328 | INFO     | __main__:<module>:31 - 今天日期:1211
2023-12-11 23:12:06.328 | INFO     | __main__:__init__:39 - 代理程序配置:{'v2rayn_info': {'exe_path': 'D:\\ProgramFiles\\v2rayN-Core', 'exe_name': 'v2rayN.exe', 'config_name': 'guiNConfig.json'}}
2023-12-11 23:12:06.328 | INFO     | __main__:__init__:42 - 代理程序配置信息:{'exe_path': 'D:\\ProgramFiles\\v2rayN-Core', 'exe_name': 'v2rayN.exe', 'config_name': 'guiNConfig.json'}
2023-12-11 23:12:06.328 | INFO     | __main__:__init__:48 - 代理程序启动路径:D:\ProgramFiles\v2rayN-Core\v2rayN.exe
2023-12-11 23:12:06.328 | INFO     | __main__:__init__:51 - 代理程序配置文件:D:\ProgramFiles\v2rayN-Core\guiNConfig.json
2023-12-11 23:12:06.328 | INFO     | __main__:__init__:54 - 代理程序备份配置文件:E:\data\github_data\vueblog\myblog\docs\.vuepress\public\scripts\python\auto_start_proxy\guiNConfig.json
2023-12-11 23:12:06.328 | INFO     | __main__:change_config:58 - 备份配置文件
2023-12-11 23:12:06.328 | INFO     | __main__:change_config:64 - 加载json数据时保持原来顺序
2023-12-11 23:12:06.328 | INFO     | __main__:change_config:67 - 当前端口号:21209
2023-12-11 23:12:06.328 | INFO     | __main__:change_config:70 - 新的端口号:21211
2023-12-11 23:12:06.328 | INFO     | __main__:change_config:71 - 将json数据写入到配置文件中
2023-12-11 23:12:06.328 | SUCCESS  | __main__:change_config:73 - 配置文件修改成功
2023-12-11 23:12:06.343 | SUCCESS  | __main__:start_proxy:79 - 代理程序自动启动成功!

Process finished with exit code 0

运行效果图:

此时可以看到V2rayN程序成功启动,并且端口号已经是配置好了的!

3. 快速启动

可以在桌面上增加一个start_proxy.bat程序,来快速启动python程序。

其内容如下:

bash
E:\data\github_data\vueblog\myblog\docs\.vuepress\public\scripts\python\auto_start_proxy\.venv\Scripts\python.exe E:\data\github_data\vueblog\myblog\docs\.vuepress\public\scripts\python\auto_start_proxy\main.py

注意,文件应以ANSI编码、Windows格式保存。不要使用UTF-8编码、Unix格式保存。

以后直接双击该批处理脚本就可以快速启动代理程序了。

本首页参考 https://notes.fe-mm.com/ 配置而成