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.VERBOSETrue,可以在终端中输出详细的请求和响应信息,便于调试。

  • 使用场景

    • 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&param=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)
posted @   逃离这世界~  阅读(8)  评论(0编辑  收藏  举报
(评论功能已被禁用)
相关博文:
阅读排行:
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
点击右上角即可分享
微信分享提示

目录导航