一、脚本功能
1.获取主机名
2.获取外网ip(通过多个公共api尝试) ipv4和ipv6
3.获取所有网络接口的内网ip
4.保存至文件并打印信息
输出示例:
主机名: mycomputer
内网ipv4地址:
- 192.168.1.100
- 192.168.56.1
内网ipv6地址:
- 2001:0db8:85a3:0000:0000:8a2e:0370:7334
外网ipv4: 203.0.113.1
外网ipv6: 2001:0db8:85a3:0000:0000:8a2e:0370:7334
二、注意事项
1.获取外网ip需要网络连接
2.某些网络环境可能会阻止访问ip查询服务
3.如果在代理或vpn环境下,获取的外网ip可能是代理或vpn的ip
4.内网ip可能会有多个,特别是在有多个网络接口的情况下
5.考虑暂时关闭防火墙
6.如果你的网络不支持 ipv6,那么相关的 ipv6 地址将显示为"无法获取"
7.某些系统可能需要管理员权限才能获取完整的网络接口信息
三、准备工作
导入库:
import socket import requests import json import time from datetime import datetime
四、完整代码
import socket import requests import json import time from datetime import datetime def get_external_ipv4(): """获取外网ipv4地址""" apis = [ { 'url': 'https://api.ipify.org?format=json', 'timeout': 5, 'headers': {'user-agent': 'mozilla/5.0'}, 'json': true, 'key': 'ip' }, { 'url': 'https://api4.ipify.org?format=json', 'timeout': 5, 'headers': {'user-agent': 'mozilla/5.0'}, 'json': true, 'key': 'ip' }, { 'url': 'https://ipv4.icanhazip.com', 'timeout': 5, 'headers': {'user-agent': 'curl/7.64.1'} } ] for api in apis: try: print(f"尝试从 {api['url']} 获取外网ipv4...") response = requests.get( url=api['url'], timeout=api['timeout'], headers=api['headers'] ) if response.status_code == 200: if api.get('json'): data = response.json() return data[api['key']] else: return response.text.strip() except exception as e: print(f"当前接口请求失败: {str(e)}") continue return "无法获取ipv4地址" def get_external_ipv6(): """获取外网ipv6地址""" apis = [ { 'url': 'https://api6.ipify.org?format=json', 'timeout': 5, 'headers': {'user-agent': 'mozilla/5.0'}, 'json': true, 'key': 'ip' }, { 'url': 'https://ipv6.icanhazip.com', 'timeout': 5, 'headers': {'user-agent': 'curl/7.64.1'} } ] for api in apis: try: print(f"尝试从 {api['url']} 获取外网ipv6...") response = requests.get( url=api['url'], timeout=api['timeout'], headers=api['headers'] ) if response.status_code == 200: if api.get('json'): data = response.json() return data[api['key']] else: return response.text.strip() except exception as e: print(f"当前接口请求失败: {str(e)}") continue return "无法获取ipv6地址" def get_internal_ips(): """获取内网ip地址(同时获取ipv4和ipv6)""" internal_ips = {'ipv4': [], 'ipv6': []} try: # 获取所有网络接口的所有ip hostname = socket.gethostname() addrs = socket.getaddrinfo(hostname, none) for addr in addrs: ip = addr[4][0] # 判断是否为ipv6地址 if ':' in ip: if not ip.startswith('fe80:') and not ip.startswith('::1'): if ip not in internal_ips['ipv6']: internal_ips['ipv6'].append(ip) else: if not ip.startswith('127.'): if ip not in internal_ips['ipv4']: internal_ips['ipv4'].append(ip) # 使用备用方法获取ipv4 if not internal_ips['ipv4']: try: s = socket.socket(socket.af_inet, socket.sock_dgram) s.connect(("8.8.8.8", 80)) ip = s.getsockname()[0] s.close() if ip not in internal_ips['ipv4']: internal_ips['ipv4'].append(ip) except: pass except exception as e: print(f"获取内网ip出错: {str(e)}") return internal_ips def save_to_file(data): """保存信息到文件""" try: with open('../办公与多媒体/ip_info.txt', 'a', encoding='utf-8') as f: f.write(f"\n{'=' * 50}\n") f.write(f"检测时间: {datetime.now().strftime('%y-%m-%d %h:%m:%s')}\n") f.write(f"主机名: {data['hostname']}\n\n") f.write("内网ipv4地址:\n") for ip in data['internal_ipv4']: f.write(f" - {ip}\n") f.write("\n内网ipv6地址:\n") for ip in data['internal_ipv6']: f.write(f" - {ip}\n") f.write(f"\n外网ipv4: {data['external_ipv4']}\n") f.write(f"外网ipv6: {data['external_ipv6']}\n") f.write(f"{'=' * 50}\n") except exception as e: print(f"保存文件时出错: {str(e)}") def main(): try: print("开始获取网络信息...\n") # 获取主机名 hostname = socket.gethostname() print(f"主机名: {hostname}\n") # 获取内网ip internal_ips = get_internal_ips() print("内网ipv4地址:") for ip in internal_ips['ipv4']: print(f" - {ip}") print("\n内网ipv6地址:") for ip in internal_ips['ipv6']: print(f" - {ip}") # 获取外网ip print("\n正在获取外网ip...") external_ipv4 = get_external_ipv4() external_ipv6 = get_external_ipv6() print(f"\n外网ipv4: {external_ipv4}") print(f"外网ipv6: {external_ipv6}") # 保存信息到文件 data = { 'hostname': hostname, 'internal_ipv4': internal_ips['ipv4'], 'internal_ipv6': internal_ips['ipv6'], 'external_ipv4': external_ipv4, 'external_ipv6': external_ipv6 } save_to_file(data) print("\n信息已保存到 ip_info.txt 文件") except exception as e: print(f"程序执行出错: {str(e)}") if __name__ == "__main__": # 确保已安装requests库 # pip install requests main() # 等待用户按键退出 input("\n按回车键退出...")
以上就是python脚本实现获取ip地址的详细内容,更多关于python获取ip地址的资料请关注代码网其它相关文章!
发表评论