背景:
家里使用主路由 + 旁路由的组网方式,因为某些原因需要频繁切换网关;但是每次在电脑右下角找到网络,进入设置面板,手动更改网关非常的麻烦,因此搭建了一个一键切换网关的小程序。

另:如果大家想配置不同的组网方式,建议看https://www.youtube.com/watch?v=OPG47_wT3XI,这个链接,包含多种组网,可以根据自己的喜好配置;

接下来给出配置流程:

1.先放键盘监听的python源代码:

from pynput import keyboard
import os
import time
import wmi
import re
import ctypes, sys

def on_press(key):
    if key == keyboard.Key.f20:
        print("切换到旁路由模式,翻墙")
        GateWay = '192.168.101.10'
        os.popen(r'C:\Users\overs\Desktop\程序\网关修改为旁路由_科学上网.py')

    elif key == keyboard.Key.f19:
        print("切换到主路由模式")
        GateWay = '192.168.101.1'
        os.popen(r'C:\Users\overs\Desktop\程序\网关修改为主路由_玩游戏.py')

    else:
        pass

def on_release(key):
    pass
with keyboard.Listener(on_press = on_press, on_release = on_release) as listener:
    listener.join()

解释:
第一个函数检测键盘按键,如果按住f20的按键,则切换到旁路由模式,执行科学上网脚本;如果按住f19则切换到主路由网关,正常上网;如果按住其他按键,不做任何处理;
最下面的with XXX,是持续监听键盘的按键,然后将监听的数据传入on_press函数;

其中对每个键盘的key,都能在函数keyborad.Key里面找到对应的值;如果想要设置不同的按键反馈,修改==后面的值即可;

注意!!!wmi,ctypes的导入可能出错,注意python版本和包的版本;

2.接下来放网关切换的python源代码:

import os
import time
import wmi
import re
import ctypes, sys

def main():
    IP = '192.168.101.16'
    GateWay = '192.168.101.10'

    nic_configs = wmi.WMI().Win32_NetworkAdapterConfiguration(IPEnabled=True)
    nic = None
    for obj in nic_configs:
        ip = re.findall("192.\\d+.\\d+.\\d+", obj.IPAddress[0])
        print(ip)
        if ip[0] == IP:
            nic = obj
    if not nic:
        print('未找到本机IP,请确认IP地址无误')
    else: 
        #nic = nic_configs[0]
        res = nic.SetGateways(DefaultIPGateway = [GateWay],GatewayCostMetric=[1])
        if res[0] == 0:
            print('网关已修改至:', GateWay)
        else:
            print('返回码:',res[0])
            print('请使用管理员权限尝试')
        input('Press Enter to exit...')

def is_admin():
    try:
        return ctypes.windll.shell32.IsUserAnAdmin()
    except:
        return False

if is_admin():
    main()
else:
    # Re-run the program with admin rights
    ctypes.windll.shell32.ShellExecuteW(None, "runas", sys.executable, __file__, None, 1)

整体的逻辑是,先判断当前程序是否是以管理员运行,如果不是的话,重新以管理员权限运行函数;
接下来,使用wmi函数获取网络的配置信息;并将本机配置的IP地址对应的网关修改至目标网关;
这里要求预先输入本机的IP和目标网关,写死在main函数里面了,主要还是图方便,因为这两个值一般不会变化;如果想切换到不同的网关,把GateWay里面的变量修改即可;

3.将1的源代码复制,修改后缀由py变成pyw,这样可以使python程序不在前台显示运行,在后台运行的话更为方便;

4.创建开机自启的任务:
a.本地按win + r,打开命令框,输入taskschd.msc进入任务计划程序;创建一个开机自启的基本任务即可
b.在C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Startup 文件夹中,新增NetGateSwitch.bat文件,文件内容是

f:
cd F:\Script
start NetGateSwitch.pyw

两种方式都可以让程序开机自启

最终效果:
点击F20,网关自动切换到旁路由网关;点击F19,网关切换回主路由网关

标签: none

添加新评论