以下是一个使用 `curl` 的 Bash 脚本,可以发送 HTTPS 的 GET 和 POST 请求,同时支持 cookies 和gzip 压缩:
```bash
#!/bin/bash
默认配置
COOKIE_FILE="cookies.txt" # 存储cookies的文件
USER_AGENT="Mozilla/5.0 (X11; Ubuntu; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36"
ACCEPT_ENCODING="gzip, deflate, br"
帮助信息
function usage() {
echo "Usage: $0 [get|post] <URL> [DATA]"
echo "Options:"
echo " get - 发送 HTTPS GET 请求"
echo " post - 发送 HTTPS POST 请求"
echo " URL - 请求的目标URL"
echo " DATA - POST 请求的数据,格式为 \"key1=value1&key2=value2\""
echo "Example:"
echo " $0 get https://example.com"
echo " $0 post https://example.com 'param1=value1¶m2=value2'"
}
GET 请求函数
function http_get() {
local url="$1"
curl -s -L -b "COOKIE_FILE" -c "COOKIE_FILE" -A "$USER_AGENT" \
-H "Accept-Encoding: ACCEPT_ENCODING" "url"
}
POST 请求函数
function http_post() {
local url="$1"
local data="$2"
curl -s -L -b "COOKIE_FILE" -c "COOKIE_FILE" -A "$USER_AGENT" \
-H "Accept-Encoding: ACCEPT_ENCODING" -d "data" "$url"
}
参数检查
if [[ $# -lt 2 ]]; then
usage
exit 1
fi
根据参数选择GET或POST
method="$1"
url="$2"
data="$3"
case "$method" in
get)
http_get "$url"
;;
post)
if [[ -z "$data" ]]; then
echo "Error: POST request requires data."
usage
exit 1
fi
http_post "url" "data"
;;
*)
echo "Error: Invalid method. Use 'get' or 'post'."
usage
exit 1
;;
esac
```
脚本说明
-
**COOKIE_FILE**:指定存储 cookies 的文件(每次请求会自动更新 cookies)。
-
**USER_AGENT** 和 **ACCEPT_ENCODING**:模拟浏览器访问,并指定支持 gzip、deflate 压缩。
-
**http_get** 和 **http_post**:分别定义 GET 和 POST 请求函数,使用 `curl` 执行请求。
-
**用法**:运行时指定请求类型(get/post)、目标 URL 以及(若为 POST 请求)请求数据。
使用示例
```bash
发送 GET 请求
./script.sh get "https://example.com"
发送 POST 请求
./script.sh post "https://example.com" "param1=value1¶m2=value2"
```
这样,该脚本可以发送 GET 和 POST 请求,同时支持 cookies 和 gzip。
下面是一个用 Python 编写的支持 HTTPS 请求、gzip、cookies 和自定义 header 的程序,使用`requests` 库实现。
```python
import requests
class HttpClient:
def init(self):
初始化一个带 cookies 的会话
self.session = requests.Session()
默认 headers
self.session.headers.update({
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36",
"Accept-Encoding": "gzip, deflate, br",
"Accept": "application/json, text/plain, */*"
})
def set_headers(self, headers):
"""更新请求头"""
self.session.headers.update(headers)
def get(self, url, params=None):
"""发送 HTTPS GET 请求"""
try:
response = self.session.get(url, params=params)
response.raise_for_status()
return response
except requests.RequestException as e:
print(f"GET request failed: {e}")
return None
def post(self, url, data=None, json=None):
"""发送 HTTPS POST 请求"""
try:
response = self.session.post(url, data=data, json=json)
response.raise_for_status()
return response
except requests.RequestException as e:
print(f"POST request failed: {e}")
return None
def close(self):
"""关闭会话"""
self.session.close()
示例用法
if name == "main":
client = HttpClient()
自定义 header
custom_headers = {
"Authorization": "Bearer your_token_here"
}
client.set_headers(custom_headers)
发送 GET 请求
url = "https://jsonplaceholder.typicode.com/posts"
response = client.get(url)
if response:
print("GET response:", response.json())
发送 POST 请求
url = "https://jsonplaceholder.typicode.com/posts"
data = {
"title": "foo",
"body": "bar",
"userId": 1
}
response = client.post(url, json=data)
if response:
print("POST response:", response.json())
关闭客户端
client.close()
```
代码说明
-
**HttpClient 类**:封装了一个 HTTPS 客户端,支持 GET 和 POST 请求。
-
**`set_headers` 方法**:允许动态更新请求头。
-
**gzip 和 cookies 支持**:`requests` 库会自动处理 gzip 压缩和 cookies,因此无需手动操作。
-
**异常处理**:使用 `try-except` 块来捕获请求失败的情况,并输出错误信息。
示例用法
-
自定义 header 示例:设置一个带 `Authorization` 字段的 header。
-
GET 和 POST 请求示例:分别演示如何发送请求并解析 JSON 响应。
确保安装 `requests` 库,使用以下命令:
```bash
pip install requests
```
以下是一个使用 Python 的 `requests` 库实现的支持 HTTPS 请求的脚本,支持 gzip、cookies 和自定义headers。`requests` 库是 Python 中非常流行的 HTTP 请求库,且在 Windows 下容易安装和使用。
代码
```python
import requests
class HTTPSClient:
def init(self):
初始化 session 用于保持 cookies
self.session = requests.Session()
默认 headers 设置,支持 gzip
self.session.headers.update({
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0 Safari/537.36',
'Accept-Encoding': 'gzip, deflate, br'
})
def set_headers(self, headers):
"""设置自定义 headers"""
self.session.headers.update(headers)
def get(self, url, params=None):
"""发送 HTTPS GET 请求"""
try:
response = self.session.get(url, params=params)
response.raise_for_status() # 检查是否请求成功
return response.text # 返回响应内容
except requests.RequestException as e:
print(f"GET 请求出错: {e}")
return None
def post(self, url, data=None):
"""发送 HTTPS POST 请求"""
try:
response = self.session.post(url, data=data)
response.raise_for_status()
return response.text
except requests.RequestException as e:
print(f"POST 请求出错: {e}")
return None
def close(self):
"""关闭 session"""
self.session.close()
使用示例
if name == "main":
client = HTTPSClient()
设置自定义 headers
custom_headers = {
'X-Custom-Header': 'CustomValue'
}
client.set_headers(custom_headers)
发送 GET 请求
url = "https://httpbin.org/get"
response = client.get(url)
if response:
print("GET 响应内容:", response)
发送 POST 请求
url = "https://httpbin.org/post"
data = {
"key1": "value1",
"key2": "value2"
}
response = client.post(url, data=data)
if response:
print("POST 响应内容:", response)
关闭 client
client.close()
```
说明
-
**HTTPSClient 类**:创建一个简单的 HTTPS 客户端封装类,使用 `requests.Session` 对象来维持会话,便于处理 cookies。
-
**`set_headers` 方法**:允许用户传入一个字典,用于设置或更新自定义的 HTTP headers。
-
**`get` 和 `post` 方法**:分别用于发送 GET 和 POST 请求。
-
`params` 参数用于 GET 请求的 URL 参数,`data` 参数用于 POST 请求的表单数据。
-
请求成功时,返回响应内容,出错时输出错误信息。
-
**gzip 支持**:通过 `Accept-Encoding` 头中的 `gzip` 和 `deflate` 设置自动解压缩。
-
**关闭 Session**:调用 `close()` 方法关闭会话以释放资源。
运行环境
确保 `requests` 库已安装,可以用以下命令在命令行安装:
```bash
pip install requests
```
示例输出
运行后,脚本会发送一个 GET 请求和一个 POST 请求,并打印响应内容。