一、制作build.py文件
先制作build.py文件如下:
#!/usr/bin/python
# -*- coding: UTF-8 -*-
import sys
import re
import os
import math
import copy
def usage():
# 根据实际修改网关地址,就是你本地用的路由器网关地址
print('./build [route_file] [add_file] [del_file] [gateway]')
print('./build route.text add_route.bat del_route.bat 192.168.0.1')
#合并子网
def marge_subnet(ip_tables):
count = 2
start_i, end_i, prev_i = 0, -1, 0
new_ip_tables = []
serials = [ip_tables[0]]
for i in range(1, len(ip_tables)):
if ip_tables[i-1].is_serial(ip_tables[i]):
serials.append(ip_tables[i])
continue
flag = False
while len(serials) > 0:
count = 2
while len(serials) >= count and serials[0].get_last_net_no() % count == 0:
serials[0] = serials[0] << 1
count = count * 2
count = 1 if count == 2 else int(count / 2)
new_ip_tables.append(serials[0])
serials = serials[count:]
if len(serials) > count:
new_ip_tables = new_ip_tables + serials[count:]
serials = [ip_tables[i]]
new_ip_tables = new_ip_tables + serials
return new_ip_tables
#IP和MASK
class ip_mask:
def __init__(self, ip):
self.start = {}
self.ip = copy.deepcopy(ip)
self.mask = []
self.last_mask_index = 0
def __lt__(self, other):
return self.ip < other.ip
def __eq__(self, other):
return self.ip == other.ip
def __lshift__(self, value):
while value >= 8 and self.last_mask_index >= 0:
self.mask[self.last_mask_index] = (self.mask[self.last_mask_index] << 8 & 255)
value = value - 8
self.last_mask_index = self.last_mask_index - 1
if self.last_mask_index >= 0 and value > 0:
self.mask[self.last_mask_index] = (self.mask[self.last_mask_index] << value & 255)
return self
def set_mask(self, mask):
self.mask = copy.deepcopy(mask)
for i in range(len(self.mask) - 1, -1, -1):
if mask[i] != 0:
self.last_mask_index = i
break
def is_serial(self, other):
flag = False
for i in range(len(self.ip)):
if self.ip[i] + 1 == other.ip[i] or self.ip[i] - 1 == other.ip[i]:
flag = True
elif self.ip[i] != other.ip[i]:
return False
elif self.ip[i] != 0:
if flag:
return False
return flag
def get_last_net_no(self):
return self.ip[self.last_mask_index]
#解析IP地址
def parse_ip_table(content):
lines = content.split('\n')
ip_tables = []
for line in lines:
line = line.split('/')
if len(line) != 2:
continue
ip = list(map(int, line[0].split('.')))
im = ip_mask(ip)
im.set_mask([255,255,255,255])
im = im << (32 - int(line[1]))
ip_tables.append(im)
return ip_tables
#添加路由
def add_route(file, ip_tables, gateway):
f = open(file, 'w')
for ip_mask in ip_tables:
f.write('route add %d.%d.%d.%d mask %d.%d.%d.%d %s\n' %
(ip_mask.ip[0], ip_mask.ip[1], ip_mask.ip[2], ip_mask.ip[3], ip_mask.mask[0], ip_mask.mask[1], ip_mask.mask[2], ip_mask.mask[3], gateway))
f.write('ipconfig /flushdns\n')
f.write('pause\n')
#删除路由
def del_route(file, ip_tables):
f = open(file, 'w')
for ip_mask in ip_tables:
f.write('route delete %d.%d.%d.%d\n' % (ip_mask.ip[0], ip_mask.ip[1], ip_mask.ip[2], ip_mask.ip[3]))
f.write('ipconfig /flushdns\n')
f.write('pause\n')
def main():
if len(sys.argv) != 5:
usage()
return
#####
route_file = sys.argv[1]
add_file = sys.argv[2]
del_file = sys.argv[3]
gateway = sys.argv[4]
#####
route_content = open(route_file, 'r+').read()
ip_tables = parse_ip_table(route_content);
ip_tables.sort()
sub_net = len(ip_tables)
ip_tables = marge_subnet(ip_tables)
#####
add_route(add_file, ip_tables, gateway)
del_route(del_file, ip_tables)
#####
main()
二、下载IP地址池
用到的IP地址池:
浏览器请求,保存为all_cn_cidr.txt就可以了。
https://ispip.clang.cn/all_cn_cidr.txt
三、如何使用
- 首先确保机器可以运行python代码,不能的先装一下python
- 把
build.py
和all_cn_cidr.txt
放在同一个目录如ip_route_tools
下 - 进入目录
ip_route_tools
目录,右键使用管理员运行终端:
以上完成以后,就执行命令:
python .\build.py .\all_cn_cidr.txt add_route.bat del_route.bat 192.168.0.1
- 提示:根据实际修改网关地址,就是你本地实际使用的路由器网关地址,比如
192.168.0.1
这样就可以路由分流,提高访问效率。
执行完成后,会生成两个文件:add_route.bat
和del_route.bat
,然后同样用管理员权限右键选择运行。add_route.bat就是添加路由,del_route.bat就是删除路由。
以上,完成后,就可以做到不同低于的IP进行分流请求。效率马上提高了很多,再也不用来回切换代理了。