# Net Utils KY
一个实用的 Python 网络工具包,提供各种网络相关的功能。
## 功能特性
- 🔗 HTTP 请求工具
- 🌐 网络连接检测
- 📡 端口扫描
- 🔍 DNS 查询
- 📊 网络状态监控
- 🛡️ 代理支持
- ⚡ 异步支持
## 安装
```bash
pip install net_utils_ky
```
## 快速开始
### 基本使用
```python
from net_utils_ky import NetworkUtils
# 创建网络工具实例
net_utils = NetworkUtils()
# 检查网络连接
if net_utils.is_connected():
print("网络连接正常")
# 发送HTTP请求
response = net_utils.get("https://api.github.com")
print(f"状态码: {response.status_code}")
print(f"响应内容: {response.text[:100]}...")
```
### 命令行使用
```bash
# 检查网络连接
net-utils check-connection
# 发送GET请求
net-utils get https://api.github.com
# 扫描端口
net-utils scan-ports example.com 80,443,8080
```
## 主要功能
### 1. HTTP 请求工具
```python
from net_utils_ky import HTTPClient
client = HTTPClient()
# GET请求
response = client.get("https://api.example.com/data")
# POST请求
data = {"name": "test", "value": 123}
response = client.post("https://api.example.com/submit", json=data)
# 带认证的请求
response = client.get("https://api.example.com/private",
auth=("username", "password"))
```
### 2. 网络连接检测
```python
from net_utils_ky import NetworkChecker
checker = NetworkChecker()
# 检查基本网络连接
if checker.is_connected():
print("网络连接正常")
# 检查特定网站连接
if checker.can_reach("https://www.google.com"):
print("可以访问Google")
# 检查DNS解析
if checker.dns_works():
print("DNS解析正常")
```
### 3. 端口扫描
```python
from net_utils_ky import PortScanner
scanner = PortScanner()
# 扫描单个端口
if scanner.is_port_open("example.com", 80):
print("端口80开放")
# 扫描端口范围
open_ports = scanner.scan_ports("example.com", range(80, 90))
print(f"开放的端口: {open_ports}")
```
### 4. 异步支持
```python
import asyncio
from net_utils_ky import AsyncNetworkUtils
async def main():
async_utils = AsyncNetworkUtils()
# 异步HTTP请求
response = await async_utils.get("https://api.example.com")
print(f"异步响应: {response.status_code}")
# 并发请求
urls = ["https://api1.example.com", "https://api2.example.com"]
responses = await async_utils.get_all(urls)
for url, response in zip(urls, responses):
print(f"{url}: {response.status_code}")
asyncio.run(main())
```
## 配置
### 代理设置
```python
from net_utils_ky import NetworkUtils
# 设置HTTP代理
net_utils = NetworkUtils(proxy="http://proxy.example.com:8080")
# 设置SOCKS代理
net_utils = NetworkUtils(proxy="socks5://proxy.example.com:1080")
```
### 超时设置
```python
from net_utils_ky import NetworkUtils
# 设置连接超时和读取超时
net_utils = NetworkUtils(timeout=(5, 30)) # (连接超时, 读取超时)
```
## 开发
### 安装开发依赖
```bash
pip install -e ".[dev]"
```
### 运行测试
```bash
pytest
```
### 代码格式化
```bash
black .
```
### 类型检查
```bash
mypy net_utils_ky
```
## 贡献
欢迎提交 Issue 和 Pull Request!
1. Fork 项目
2. 创建功能分支 (`git checkout -b feature/amazing-feature`)
3. 提交更改 (`git commit -m 'Add some amazing feature'`)
4. 推送到分支 (`git push origin feature/amazing-feature`)
5. 打开 Pull Request
## 许可证
本项目采用 MIT 许可证 - 查看 [LICENSE](LICENSE) 文件了解详情。
## 更新日志
### 0.1.0 (2024-01-01)
- 初始版本发布
- 基本 HTTP 请求功能
- 网络连接检测
- 端口扫描功能
- 异步支持
## 支持
如果您遇到问题或有建议,请:
1. 查看 [文档](https://github.com/yourusername/net_utils_ky#readme)
2. 搜索 [现有 Issue](https://github.com/yourusername/net_utils_ky/issues)
3. 创建新的 Issue
## 致谢
感谢所有为这个项目做出贡献的开发者!
Raw data
{
"_id": null,
"home_page": "https://github.com/yourusername/net_utils_ky",
"name": "net-utils-ky",
"maintainer": null,
"docs_url": null,
"requires_python": ">=3.7",
"maintainer_email": "Your Name <your.email@example.com>",
"keywords": "network, utils, tools, http, requests",
"author": "Your Name",
"author_email": "Your Name <your.email@example.com>",
"download_url": "https://files.pythonhosted.org/packages/c7/ae/4cca2d4550238ac63093fb289e57c5feb8bcbde38809fee5f1c616e63d00/net_utils_ky-0.2.0.tar.gz",
"platform": null,
"description": "# Net Utils KY\r\n\r\n\u4e00\u4e2a\u5b9e\u7528\u7684 Python \u7f51\u7edc\u5de5\u5177\u5305\uff0c\u63d0\u4f9b\u5404\u79cd\u7f51\u7edc\u76f8\u5173\u7684\u529f\u80fd\u3002\r\n\r\n## \u529f\u80fd\u7279\u6027\r\n\r\n- \ud83d\udd17 HTTP \u8bf7\u6c42\u5de5\u5177\r\n- \ud83c\udf10 \u7f51\u7edc\u8fde\u63a5\u68c0\u6d4b\r\n- \ud83d\udce1 \u7aef\u53e3\u626b\u63cf\r\n- \ud83d\udd0d DNS \u67e5\u8be2\r\n- \ud83d\udcca \u7f51\u7edc\u72b6\u6001\u76d1\u63a7\r\n- \ud83d\udee1\ufe0f \u4ee3\u7406\u652f\u6301\r\n- \u26a1 \u5f02\u6b65\u652f\u6301\r\n\r\n## \u5b89\u88c5\r\n\r\n```bash\r\npip install net_utils_ky\r\n```\r\n\r\n## \u5feb\u901f\u5f00\u59cb\r\n\r\n### \u57fa\u672c\u4f7f\u7528\r\n\r\n```python\r\nfrom net_utils_ky import NetworkUtils\r\n\r\n# \u521b\u5efa\u7f51\u7edc\u5de5\u5177\u5b9e\u4f8b\r\nnet_utils = NetworkUtils()\r\n\r\n# \u68c0\u67e5\u7f51\u7edc\u8fde\u63a5\r\nif net_utils.is_connected():\r\n print(\"\u7f51\u7edc\u8fde\u63a5\u6b63\u5e38\")\r\n\r\n# \u53d1\u9001HTTP\u8bf7\u6c42\r\nresponse = net_utils.get(\"https://api.github.com\")\r\nprint(f\"\u72b6\u6001\u7801: {response.status_code}\")\r\nprint(f\"\u54cd\u5e94\u5185\u5bb9: {response.text[:100]}...\")\r\n```\r\n\r\n### \u547d\u4ee4\u884c\u4f7f\u7528\r\n\r\n```bash\r\n# \u68c0\u67e5\u7f51\u7edc\u8fde\u63a5\r\nnet-utils check-connection\r\n\r\n# \u53d1\u9001GET\u8bf7\u6c42\r\nnet-utils get https://api.github.com\r\n\r\n# \u626b\u63cf\u7aef\u53e3\r\nnet-utils scan-ports example.com 80,443,8080\r\n```\r\n\r\n## \u4e3b\u8981\u529f\u80fd\r\n\r\n### 1. HTTP \u8bf7\u6c42\u5de5\u5177\r\n\r\n```python\r\nfrom net_utils_ky import HTTPClient\r\n\r\nclient = HTTPClient()\r\n\r\n# GET\u8bf7\u6c42\r\nresponse = client.get(\"https://api.example.com/data\")\r\n\r\n# POST\u8bf7\u6c42\r\ndata = {\"name\": \"test\", \"value\": 123}\r\nresponse = client.post(\"https://api.example.com/submit\", json=data)\r\n\r\n# \u5e26\u8ba4\u8bc1\u7684\u8bf7\u6c42\r\nresponse = client.get(\"https://api.example.com/private\",\r\n auth=(\"username\", \"password\"))\r\n```\r\n\r\n### 2. \u7f51\u7edc\u8fde\u63a5\u68c0\u6d4b\r\n\r\n```python\r\nfrom net_utils_ky import NetworkChecker\r\n\r\nchecker = NetworkChecker()\r\n\r\n# \u68c0\u67e5\u57fa\u672c\u7f51\u7edc\u8fde\u63a5\r\nif checker.is_connected():\r\n print(\"\u7f51\u7edc\u8fde\u63a5\u6b63\u5e38\")\r\n\r\n# \u68c0\u67e5\u7279\u5b9a\u7f51\u7ad9\u8fde\u63a5\r\nif checker.can_reach(\"https://www.google.com\"):\r\n print(\"\u53ef\u4ee5\u8bbf\u95eeGoogle\")\r\n\r\n# \u68c0\u67e5DNS\u89e3\u6790\r\nif checker.dns_works():\r\n print(\"DNS\u89e3\u6790\u6b63\u5e38\")\r\n```\r\n\r\n### 3. \u7aef\u53e3\u626b\u63cf\r\n\r\n```python\r\nfrom net_utils_ky import PortScanner\r\n\r\nscanner = PortScanner()\r\n\r\n# \u626b\u63cf\u5355\u4e2a\u7aef\u53e3\r\nif scanner.is_port_open(\"example.com\", 80):\r\n print(\"\u7aef\u53e380\u5f00\u653e\")\r\n\r\n# \u626b\u63cf\u7aef\u53e3\u8303\u56f4\r\nopen_ports = scanner.scan_ports(\"example.com\", range(80, 90))\r\nprint(f\"\u5f00\u653e\u7684\u7aef\u53e3: {open_ports}\")\r\n```\r\n\r\n### 4. \u5f02\u6b65\u652f\u6301\r\n\r\n```python\r\nimport asyncio\r\nfrom net_utils_ky import AsyncNetworkUtils\r\n\r\nasync def main():\r\n async_utils = AsyncNetworkUtils()\r\n\r\n # \u5f02\u6b65HTTP\u8bf7\u6c42\r\n response = await async_utils.get(\"https://api.example.com\")\r\n print(f\"\u5f02\u6b65\u54cd\u5e94: {response.status_code}\")\r\n\r\n # \u5e76\u53d1\u8bf7\u6c42\r\n urls = [\"https://api1.example.com\", \"https://api2.example.com\"]\r\n responses = await async_utils.get_all(urls)\r\n\r\n for url, response in zip(urls, responses):\r\n print(f\"{url}: {response.status_code}\")\r\n\r\nasyncio.run(main())\r\n```\r\n\r\n## \u914d\u7f6e\r\n\r\n### \u4ee3\u7406\u8bbe\u7f6e\r\n\r\n```python\r\nfrom net_utils_ky import NetworkUtils\r\n\r\n# \u8bbe\u7f6eHTTP\u4ee3\u7406\r\nnet_utils = NetworkUtils(proxy=\"http://proxy.example.com:8080\")\r\n\r\n# \u8bbe\u7f6eSOCKS\u4ee3\u7406\r\nnet_utils = NetworkUtils(proxy=\"socks5://proxy.example.com:1080\")\r\n```\r\n\r\n### \u8d85\u65f6\u8bbe\u7f6e\r\n\r\n```python\r\nfrom net_utils_ky import NetworkUtils\r\n\r\n# \u8bbe\u7f6e\u8fde\u63a5\u8d85\u65f6\u548c\u8bfb\u53d6\u8d85\u65f6\r\nnet_utils = NetworkUtils(timeout=(5, 30)) # (\u8fde\u63a5\u8d85\u65f6, \u8bfb\u53d6\u8d85\u65f6)\r\n```\r\n\r\n## \u5f00\u53d1\r\n\r\n### \u5b89\u88c5\u5f00\u53d1\u4f9d\u8d56\r\n\r\n```bash\r\npip install -e \".[dev]\"\r\n```\r\n\r\n### \u8fd0\u884c\u6d4b\u8bd5\r\n\r\n```bash\r\npytest\r\n```\r\n\r\n### \u4ee3\u7801\u683c\u5f0f\u5316\r\n\r\n```bash\r\nblack .\r\n```\r\n\r\n### \u7c7b\u578b\u68c0\u67e5\r\n\r\n```bash\r\nmypy net_utils_ky\r\n```\r\n\r\n## \u8d21\u732e\r\n\r\n\u6b22\u8fce\u63d0\u4ea4 Issue \u548c Pull Request\uff01\r\n\r\n1. Fork \u9879\u76ee\r\n2. \u521b\u5efa\u529f\u80fd\u5206\u652f (`git checkout -b feature/amazing-feature`)\r\n3. \u63d0\u4ea4\u66f4\u6539 (`git commit -m 'Add some amazing feature'`)\r\n4. \u63a8\u9001\u5230\u5206\u652f (`git push origin feature/amazing-feature`)\r\n5. \u6253\u5f00 Pull Request\r\n\r\n## \u8bb8\u53ef\u8bc1\r\n\r\n\u672c\u9879\u76ee\u91c7\u7528 MIT \u8bb8\u53ef\u8bc1 - \u67e5\u770b [LICENSE](LICENSE) \u6587\u4ef6\u4e86\u89e3\u8be6\u60c5\u3002\r\n\r\n## \u66f4\u65b0\u65e5\u5fd7\r\n\r\n### 0.1.0 (2024-01-01)\r\n\r\n- \u521d\u59cb\u7248\u672c\u53d1\u5e03\r\n- \u57fa\u672c HTTP \u8bf7\u6c42\u529f\u80fd\r\n- \u7f51\u7edc\u8fde\u63a5\u68c0\u6d4b\r\n- \u7aef\u53e3\u626b\u63cf\u529f\u80fd\r\n- \u5f02\u6b65\u652f\u6301\r\n\r\n## \u652f\u6301\r\n\r\n\u5982\u679c\u60a8\u9047\u5230\u95ee\u9898\u6216\u6709\u5efa\u8bae\uff0c\u8bf7\uff1a\r\n\r\n1. \u67e5\u770b [\u6587\u6863](https://github.com/yourusername/net_utils_ky#readme)\r\n2. \u641c\u7d22 [\u73b0\u6709 Issue](https://github.com/yourusername/net_utils_ky/issues)\r\n3. \u521b\u5efa\u65b0\u7684 Issue\r\n\r\n## \u81f4\u8c22\r\n\r\n\u611f\u8c22\u6240\u6709\u4e3a\u8fd9\u4e2a\u9879\u76ee\u505a\u51fa\u8d21\u732e\u7684\u5f00\u53d1\u8005\uff01\r\n",
"bugtrack_url": null,
"license": null,
"summary": "\u4e00\u4e2a\u5b9e\u7528\u7684\u7f51\u7edc\u5de5\u5177\u5305\uff0c\u63d0\u4f9b\u5404\u79cd\u7f51\u7edc\u76f8\u5173\u7684\u529f\u80fd",
"version": "0.2.0",
"project_urls": {
"Bug Tracker": "https://github.com/yourusername/net_utils_ky/issues",
"Documentation": "https://github.com/yourusername/net_utils_ky#readme",
"Homepage": "https://github.com/yourusername/net_utils_ky",
"Repository": "https://github.com/yourusername/net_utils_ky.git"
},
"split_keywords": [
"network",
" utils",
" tools",
" http",
" requests"
],
"urls": [
{
"comment_text": null,
"digests": {
"blake2b_256": "4aded3867dcaed986bced78e13dae04b06bfdd60d31f72784acfbc76a0171d7c",
"md5": "f250f6d782b6c8839d586ee15ea87d0d",
"sha256": "0cca356c078c032794ee434718b468a53b35c9ec0920f8a726079422ed3a9d6c"
},
"downloads": -1,
"filename": "net_utils_ky-0.2.0-py3-none-any.whl",
"has_sig": false,
"md5_digest": "f250f6d782b6c8839d586ee15ea87d0d",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": ">=3.7",
"size": 22308872,
"upload_time": "2025-07-10T06:30:52",
"upload_time_iso_8601": "2025-07-10T06:30:52.176119Z",
"url": "https://files.pythonhosted.org/packages/4a/de/d3867dcaed986bced78e13dae04b06bfdd60d31f72784acfbc76a0171d7c/net_utils_ky-0.2.0-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "c7ae4cca2d4550238ac63093fb289e57c5feb8bcbde38809fee5f1c616e63d00",
"md5": "ec5bf05d510fd99ffe922930d3c49148",
"sha256": "040233fbe6fa141a5d909706239f8653a337cd517898080bc16925816c6e365e"
},
"downloads": -1,
"filename": "net_utils_ky-0.2.0.tar.gz",
"has_sig": false,
"md5_digest": "ec5bf05d510fd99ffe922930d3c49148",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=3.7",
"size": 22143468,
"upload_time": "2025-07-10T06:31:00",
"upload_time_iso_8601": "2025-07-10T06:31:00.705445Z",
"url": "https://files.pythonhosted.org/packages/c7/ae/4cca2d4550238ac63093fb289e57c5feb8bcbde38809fee5f1c616e63d00/net_utils_ky-0.2.0.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2025-07-10 06:31:00",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "yourusername",
"github_project": "net_utils_ky",
"github_not_found": true,
"lcname": "net-utils-ky"
}