python通过不同的网卡去做网络请求
为什么会有这种需求呢,很多的公司都会有内网和外网,而现在的电脑都会有双网卡,而电脑都会默认用你的以太网,现在刚好有这么一个场景,你写了一个程序要去做网络请求,而你的以太网又访问不到,刚好你可以用wlan网卡去做这个网络请求,那怎么办呢,现在就可以通过下面的办法,去选择你需要的网卡访问。
工具类
from netifaces import interfaces, ifaddresses, AF_INET, AF_INET6
import winreg
import platform
# 获取ipv4地址
def get_ipv4_address(key_name):
if platform.system() == "Linux":
try:
return ifaddresses(key_name)[AF_INET][0]['addr'] # 返回ipv4地址信息
except ValueError:
return None
elif platform.system() == "Windows":
key = get_key(key_name) # 获取网卡的键值
if not key:
return
else:
return ifaddresses(key)[AF_INET][0]['addr'] # 返回ipv4地址信息
else:
print('您的系统本程序暂时不支持')
# 获取ipv6地址
def get_ipv6_address(key_name):
if platform.system() == "Linux":
try:
return ifaddresses(key_name)[AF_INET6][0]['addr']
except ValueError:
return None
elif platform.system() == "Windows":
key = get_key(key_name)
if not key:
return
else:
return ifaddresses(key)[AF_INET6][0]['addr']
else:
print('您的系统本程序暂时不支持')
# 获取Windows系统网卡接口在注册表的键值
def get_key(key_name):
keys = interfaces() # 获取所有网卡的键值
key_name_dict = {} # 存放网卡键值与键值名称的字典
try:
reg = winreg.ConnectRegistry(None, winreg.HKEY_LOCAL_MACHINE) # 建立注册表链接
reg_key = winreg.OpenKey(reg , r'SYSTEM\CurrentControlSet\Control\Network\{4d36e972-e325-11ce-bfc1-08002be10318}')
except Exception as e:
return '路径出错或者其他问题,请仔细检查'
for key in keys:
try:
reg_subkey = winreg.OpenKey(reg_key , key + r'\Connection') # 读取网卡键值的Name
key_name_dict[winreg.QueryValueEx(reg_subkey , 'Name')[0]] = key # 写入key_name字典
except FileNotFoundError:
pass
# print('所有接口信息字典列表: ' + str(key_name_dict))
return key_name_dict[key_name]
具体使用方法
import requests
from requests_toolbelt.adapters.source import SourceAddressAdapter
session = requests.Session()
# 使用以太网的网卡访问
yitai_ip = get_ipv4_address('以太网')
session.mount('http://', SourceAddressAdapter(yitai_ip))
session.mount('https://', SourceAddressAdapter((yitai_ip, 8999)))
session.get(url="https://www.baidu.com")
# 使用wlan的网卡访问
wlan_ip = get_ipv4_address('WLAN')
session.mount('http://', SourceAddressAdapter(wlan_ip))
session.mount('https://', SourceAddressAdapter((wlan_ip, 8999)))
session.get(url="https://www.baidu.com")
|