14. python PyCurl 检测web服务
python PyCurl检测web服务
pycurl是一个用C语言编写的libcurl的Python绑定库。pycurl是一个功能强大的库,支持多种网络协议,包括FTP、HTTP、HTTPS、FTPS、GOPHER、TELNET、DICT、FILE和LDAP。它还支持HTTPS证书、HTTP POST、FTP上传、Kerberos认证、HTTP表单上传、代理、Cookies、用户+密码认证、文件传输恢复、HTTP代理隧道等功能
安装:
sudo apt-get install libcurl4-openssl-dev
pip install pycurl
一个简单的GET示例
import pycurl
from io import BytesIO
def fetch_url(url):
buffer = BytesIO() # 创建一个缓冲区对象
curl = pycurl.Curl() # 创建 Curl 对象
curl.setopt(curl.URL, url) # 设置请求的 URL
curl.setopt(curl.WRITEDATA, buffer) #设置响应内容的存储位置(通常是文件对象或内存缓冲区)
curl.perform() # 执行请求
curl.close() #关闭Curl()对象
return buffer.getvalue().decode('utf-8') # 获取响应体并解码
print(fetch_url('https://www.baidu.com'))
发送HTTPS请求示例
import pycurl
from io import BytesIO
import certifi # 提供 SSL 证书
def fetch_url(url):
buffer = BytesIO()
curl = pycurl.Curl()
curl.setopt(curl.URL, url)
curl.setopt(curl.CAINFO, certifi.where()) # 设置证书路径
curl.setopt(curl.WRITEDATA, buffer)
curl.perform()
curl.close()
return buffer.getvalue().decode('utf-8')
print(fetch_url('https://example.com'))
常用的方法说明:
-
Curl对象的提交:
perform()
方法,无参数。 -
实现关闭、回收Curl对象:
close()
方法,无参数。 -
设置请求选项:使用
setopt()
方法设置请求的行为,如目标 URL、请求头、超时时间等。 -
获取响应信息:使用
getinfo()
方法获取请求完成后的信息,如状态码、响应时间等。 -
调试功能:通过设置
pycurl.VERBOSE
为True
,可以在终端中输出详细的请求和响应信息,便于调试。 -
使用场景:
setopt
参数通常在调用perform()
方法之前设置。getinfo
参数通常在调用perform()
方法之后使用,以获取请求的执行结果。
setopt()常用参数:
选项常量 | 描述 | 示例 |
---|---|---|
pycurl.URL |
设置请求的目标 URL。 | curl.setopt(pycurl.URL, "https://example.com") |
pycurl.HTTPHEADER |
设置自定义 HTTP 请求头。 | curl.setopt(pycurl.HTTPHEADER, ["Content-Type: application/json"]) |
pycurl.POSTFIELDS |
设置 POST 请求的正文内容。 | curl.setopt(pycurl.POSTFIELDS, "key=value¶m=123") |
pycurl.POST |
启用 POST 方法。 | curl.setopt(pycurl.POST, True) |
pycurl.FOLLOWLOCATION |
是否自动跟随 HTTP 重定向。 | curl.setopt(pycurl.FOLLOWLOCATION, True) |
pycurl.MAXREDIRS |
设置最大重定向次数。 | curl.setopt(pycurl.MAXREDIRS, 5) |
pycurl.CONNECTTIMEOUT |
设置连接超时时间(秒)。 | curl.setopt(pycurl.CONNECTTIMEOUT, 10) |
pycurl.TIMEOUT |
设置请求的总超时时间(秒)。 | curl.setopt(pycurl.TIMEOUT, 30) |
pycurl.CAINFO |
设置 SSL 证书路径,用于 HTTPS 请求。 | curl.setopt(pycurl.CAINFO, certifi.where()) |
pycurl.SSL_VERIFYPEER |
是否验证服务器的 SSL 证书。 | curl.setopt(pycurl.SSL_VERIFYPEER, 0) |
pycurl.PROXY |
设置代理服务器地址。 | curl.setopt(pycurl.PROXY, "http://proxy.example.com:8080") |
pycurl.NOSIGNAL |
禁用信号处理,避免在多线程环境中出现问题。 | curl.setopt(pycurl.NOSIGNAL, 1) |
pycurl.WRITEDATA |
设置响应内容的存储位置(通常是文件对象或内存缓冲区)。 | curl.setopt(pycurl.WRITEDATA, buffer) |
pycurl.HEADERFUNCTION |
设置回调函数,用于处理响应头。 | curl.setopt(pycurl.HEADERFUNCTION, header_function) |
pycurl.WRITEFUNCTION |
设置回调函数,用于处理响应体。 | curl.setopt(pycurl.WRITEFUNCTION, write_function) |
pycurl.VERBOSE |
启用调试模式,输出详细的请求和响应信息。 | curl.setopt(pycurl.VERBOSE, True) |
getinfo()常用参数
选项常量 | 描述 | 示例 |
---|---|---|
pycurl.HTTP_CODE |
获取 HTTP 响应状态码。 | status_code = curl.getinfo(pycurl.HTTP_CODE) |
pycurl.TOTAL_TIME |
获取请求的总时间(秒)。 | total_time = curl.getinfo(pycurl.TOTAL_TIME) |
pycurl.NAMELOOKUP_TIME |
获取 DNS 解析时间(秒)。 | dns_time = curl.getinfo(pycurl.NAMELOOKUP_TIME) |
pycurl.CONNECT_TIME |
获取建立连接的时间(秒)。 | connect_time = curl.getinfo(pycurl.CONNECT_TIME) |
pycurl.PRETRANSFER_TIME |
获取从开始到准备传输的时间(秒)。 | pretransfer_time = curl.getinfo(pycurl.PRETRANSFER_TIME) |
pycurl.STARTTRANSFER_TIME |
获取从开始到第一个字节传输的时间(秒)。 | starttransfer_time = curl.getinfo(pycurl.STARTTRANSFER_TIME) |
pycurl.SIZE_DOWNLOAD |
获取下载的总字节数。 | size_download = curl.getinfo(pycurl.SIZE_DOWNLOAD) |
pycurl.SIZE_UPLOAD |
获取上传的总字节数。 | size_upload = curl.getinfo(pycurl.SIZE_UPLOAD) |
pycurl.SPEED_DOWNLOAD |
获取下载速度(字节/秒)。 | speed_download = curl.getinfo(pycurl.SPEED_DOWNLOAD) |
pycurl.SPEED_UPLOAD |
获取上传速度(字节/秒)。 | speed_upload = curl.getinfo(pycurl.SPEED_UPLOAD) |
pycurl.HEADER_SIZE |
获取响应头的大小(字节)。 | header_size = curl.getinfo(pycurl.HEADER_SIZE) |
了解HTTP基本概念
HTTP方法:常用的有GET、POST、PUT、DELETE等,分别对应不同的操作。比如GET用于获取资源,POST用于提交数据。
URL:统一资源定位符(Uniform Resource Locator),是访问资源的地址。
请求头(Headers):发送请求时可以包含的元数据,如用户代理、内容类型等。
请求体(Body):主要用于POST、PUT等请求,包含要发送的数据。
响应(Response):服务器返回的内容,包括状态码、响应头、响应体等。
示例:POST 请求
请求头:
- 通常我们在发送请求时都需要带上请求头,请求头是将自身伪装成浏览器的关键,常见的有用的请求头如下
POST /api/login HTTP/1.1
Host: www.example.com
Content-Type: application/json
Content-Length: 48
Authorization: Bearer abc123xyz456
User-Agent: Mozilla/5.0
请求体:
{
"username": "johndoe",
"password": "secret123"
}
字段 | 说明 | 常见值/示例 |
---|---|---|
Content-Type | 指定请求体的数据格式,告诉服务器如何解析请求体。 | application/x-www-form-urlencoded (表单数据) application/json (JSON数据) multipart/form-data (文件上传) |
Content-Length | 请求体的长度,单位为字节。 | 48 |
Authorization | 用于身份验证,携带用户认证信息,如 token 或基本认证。 | Bearer <token> |
User-Agent | 客户端的类型,标识发起请求的浏览器或应用。 | Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36 |
Accept | 指定客户端可以处理的响应内容类型。 | application/json |
Cookie | 客户端存储的 cookie,包含会话等信息。 | session_id=abcd1234; user_id=xyz5678 |
请求体格式 | 请求体内容的格式。 | |
application/x-www-form-urlencoded | 表单数据格式,键值对以 & 分隔。 |
username=johndoe&password=secret123 |
multipart/form-data | 用于文件上传,数据分为多个部分。 | --boundary_string <br> Content-Disposition: form-data; name="file"; filename="example.txt" |
application/json | JSON 格式,常用于现代 Web API 通信。 | {"username": "johndoe", "password": "secret123"} |
text/plain | 纯文本格式,适用于简单的文本数据。 | Hello, this is a simple text message. |
钉钉机器人无人值守发送群消息:
#!/usr/bin/python3
#_*_coding:utf-8_*_
import pycurl
import json
from io import BytesIO
def send_to_dingding(webhook_url,content,keybord,title):
headers = 'Content-Type: application/json'
buffer = BytesIO()
c = pycurl.Curl()
c.setopt(pycurl.URL,webhook_url)
c.setopt(pycurl.POST,True)
c.setopt(pycurl.HTTPHEADER,[headers])
data = {
"msgtype": "markdown", #markdown格式
"markdown": {
"title": title,
"text": f"# {title}\n\n{keybord}\n\n{content}" #两个\n才能换行哦
}
}
c.setopt(pycurl.POSTFIELDS,json.dumps(data))
c.setopt(pycurl.WRITEDATA,buffer)
c.perform()
http_code = c.getinfo(pycurl.HTTP_CODE)
c.errstr()
c.close()
response_body = buffer.getvalue().decode('utf-8')
response_json = json.loads(response_body)
if http_code == 200 and response_json.get("errcode") == 0:
print("消息发送成功")
else:
print(f"消息发送失败: {response_json.get('errmsg')}")
if __name__ == '__main__':
webhook_url = 'https://oapi.dingtalk.com/robot/send?access_token=your_token' #token在钉钉群机器人复制
keybord = 'shy' #这里使用的钉钉群机器人自定义的关键词
title = '无人值守机器人消息:'
content = "系统测试"
send_to_dingding(webhook_url,content,keybord,title)
合集:
python
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库