如何使用cURL与代理:完整指南
我们习惯通过浏览器执行许多网络操作:浏览网站、下载文件、填写表单或发送数据。但是,您知道吗,所有这些操作可以通过命令行更快地完成?其中一个最佳工具就是cURL。
cURL在处理大量请求或数据时提供了更多的控制和便利。如果将cURL与代理一起使用,功能将更加广泛:可以绕过限制并保持匿名。
本文将介绍如何使用cURL下载文件、发送请求并与代理一起工作,以绕过封锁并保护匿名性。我们还将讨论如何使用cURL进行网页抓取,并避免常见错误。简单的示例和有用的建议,尽在本文!
cURL(Client URL)是一个基于libcurl库的工具,它允许通过互联网发送和接收数据。它直接从命令行运行,并支持多种协议(HTTP、HTTPS用于与网页交互,FTP用于处理文件,等等)。
使用cURL,您可以做很多事情,例如:
- 从互联网下载文件。
- 向服务器发送数据。
- 与网站或API进行交互。
- 使用代理服务器实现匿名或绕过封锁。
cURL帮助自动化日常任务,特别是在需要执行大量请求或操作时,它既快速又方便。cURL常用于测试、网页抓取以及与需要通过互联网传输数据的服务和应用程序进行交互。它是开发人员、系统管理员以及任何需要通过命令行或脚本与互联网资源交互的用户的强大工具。
代理(或代理服务器)是您的设备和互联网之间的中介。当您想访问一个网站时,您的请求首先会发送到代理服务器,代理服务器将请求转发到目标服务器,并将响应返回给您。这使得您与互联网的互动方式有所不同。
以下是使用代理服务器的几个原因:
- 隐藏您的IP地址
代理可以隐藏您的真实IP地址,因此网站看到的将是代理服务器的IP地址,而不是您的。这有助于提高您在互联网上的匿名性。 - 绕过限制
有时互联网资源会根据地区限制访问。使用代理,您可以绕过这些限制,访问通常在您所在国家无法访问的内容。 - 加速工作
一些代理服务器可以缓存数据,从而加快您常访问的网站的加载速度。 - 内容过滤
可以设置代理来阻止不需要的网站或保护您免受病毒和其他威胁。 - 额外的安全性
代理有助于防止恶意网站和钓鱼攻击,为您提供额外的安全防护。
代理有多种类型——HTTP、HTTPS、SOCKS等。每种类型的代理都有其特点和适用方式,具体取决于您的需求。HTTP用于普通的网页请求,HTTPS用于安全的加密连接,而SOCKS是一种通用代理,可以传输任何类型的流量,包括HTTP和HTTPS。接下来,我们将更详细地了解它们。
代理的选择取决于您的目标、任务和对性能或匿名性的要求。以下是主要的代理类型及其最佳使用场景:
HTTP/HTTPS 代理
HTTP 代理仅支持 HTTP/HTTPS 协议,提供额外的加密,使其更加安全。
它被大多数工具和程序广泛支持,非常适合用于网页抓取和其他需要自动化的任务。
SOCKS 代理 (SOCKS4 和 SOCKS5)
SOCKS5 支持 TCP 和 UDP 流量。
它工作在比 HTTP 代理更低的层级,使其适用于任何协议。
SOCKS 代理不处理头部信息,从而提高了匿名性。
对于需要高度匿名性或处理非标准协议的任务,最好使用 SOCKS5。
免费代理
免费代理通常速度较慢、不稳定,并且很容易被封锁。
它们可能会将您的数据暴露于风险之中,因为并非总是提供安全保障。
它们是测试或学习的常见选择,但不推荐用于大型项目。
数据中心代理
使用数据中心的 IP 地址,而非互联网服务提供商的 IP 地址。
与住宅代理相比,它们更快、更便宜,但因为它们的 IP 地址通常集中并且具有相似特征,所以更容易被网站发现。
住宅代理
使用互联网服务提供商提供的真实 IP 地址。
相比数据中心代理,它们更难被网站发现。
对于那些封锁普通代理的网站,住宅代理帮助您看起来像普通用户。
移动代理
IP 地址与移动运营商绑定。
它们非常难以被封锁或发现,通常比其他类型的代理更贵。
如果您处理需要移动流量的网站或有高反机器人系统的网站,移动代理是不可或缺的。
代理服务器轮换有助于避免封锁并提高匿名性。它允许动态更换发送请求的 IP 地址,从而减少因来自同一 IP 地址的频繁请求而被封锁的风险。
如何使用 cURL 设置代理轮换:
- 使用 API 获取代理:许多专门的服务(例如 ProxyMesh)提供 API 来获取代理服务器(在此示例中,您需要将 your_username 和 your_password 替换为 ProxyMesh 提供的实际登录名和密码):
PROXY=$(curl -s 'https://proxy.proxyMesh.com/api/proxy?username=your_username&password=your_password')
curl -x $PROXY http://example.com/ip
- 假设您有一个代理列表,来自公共或付费服务。例如,使用多个代理服务器:
proxies=("http://123.45.67.89:8080" "http://98.76.54.32:8080" "http://165.178.0.1:8080")
PROXY=${proxies[$RANDOM % ${#proxies[@]}]}
curl -x $PROXY http://example.com/ip
- 如果您在更复杂的项目中使用 cURL,可以在 Unix 系统中使用第三方工具或库进行代理轮换,例如使用 proxychains:安装 proxychains 并在 /etc/proxychains.conf 中配置以实现自动轮换。
proxychains curl http://example.com
cURL 支持广泛的协议,使得可以与不同类型的网络连接进行交互。根据您的需求,您可以选择所需的协议,并通过命令行中的简单命令与之进行交互。以下是可以与 cURL 一起使用的主要协议概述:
HTTP(超文本传输协议)
最常用的用于互联网上数据传输的协议。它用于客户端(例如浏览器)与服务器之间的数据交换。
使用示例:curl http://example.com
默认端口:80
HTTPS(超文本传输安全协议)
HTTP 的加密版本,使用 SSL/TLS 来加密数据并防止中间人攻击。
使用示例:curl https://example.com
默认端口:443
SOCKS(Socket Secure)
代理协议,允许通过互联网传输任何类型的数据,包括 HTTP、FTP 等协议,工作在套接字级别。
使用示例:curl --proxy socks5://proxy_host:proxy_port http://example.com
默认端口:1080
FTP(文件传输协议)
用于在客户端和服务器之间传输文件的协议。它不加密传输的数据。
使用示例:curl ftp://example.com/file.txt
默认端口:21
FTPS(FTP 安全)
FTP 的扩展,使用 SSL/TLS 加密数据以保护传输的数据。
使用示例:curl ftps://example.com/file.txt
默认端口:990(对于 FTPS 隐式)或 21(对于 FTPS 显式)
SFTP(SSH 文件传输协议)
用于传输文件的协议,使用 SSH 来加密和确保数据安全。
使用示例:curl sftp://example.com/file.txt
默认端口:22
LDAP(轻量级目录访问协议)
用于访问和管理目录服务的协议,如 Active Directory 或 OpenLDAP。
使用示例:curl ldap://example.com
默认端口:389
POP3(邮局协议)
用于从邮件服务器接收电子邮件的协议。
使用示例:curl pop3://pop.example.com
默认端口:110
IMAP(互联网邮件访问协议)
用于在服务器上访问和管理电子邮件的协议。
使用示例:curl imap://imap.example.com
默认端口:143
在 Windows、macOS 和 Linux 上,cURL 通常已经预安装。您可以通过以下命令在终端中检查(对于 Windows,请使用 cmd 或 PowerShell):
curl --version
如果 cURL 已安装,您将看到有关 cURL 版本、libcurl 版本以及支持的协议和功能的信息。如果显示错误消息,例如:
Linux/macOS: command not found
Windows: 'curl' is not recognized as an internal or external command
这意味着 cURL 未安装或未添加到环境变量中。在这种情况下,您需要手动为您的操作系统安装 cURL:
Windows
- 从官方网站下载包含 curl.exe 的压缩包。
- 解压缩并将 curl.exe 的路径添加到系统环境变量 PATH 中。
- 或者使用 winget 安装:
winget install curl
macOS
使用 Homebrew 更新或安装 cURL:
brew install curl
Linux
Ubuntu/Debian:
sudo apt update
sudo apt install curl
Fedora/RHEL/CentOS:
sudo dnf install curl # Fedora
sudo yum install curl # CentOS/RHEL
Arch Linux:
sudo pacman -S curl
让我们来看一下覆盖 cURL 主要使用场景的命令——下载数据、执行请求和管理文件:
获取页面内容(GET 请求):
curl http://example.com
此命令用于获取网页内容。cURL 会向指定的 URL 发送请求,并将结果显示在屏幕上(通常是页面的 HTML 代码)。这对于获取网站信息、扫描内容或测试网络资源的可访问性非常有用。
POST 请求(用于将数据发送到服务器,例如提交表单):
curl -X POST -d "param1=value1¶m2=value2" https://example.com
- -X POST 指定请求方法为 POST。
- -d 允许您指定发送到服务器的数据。
实际网站示例:
curl -X POST -d "name=JohnDoe&[email protected]" https://httpbin.org/post
POST 请求的附加参数:
使用 -H 添加头部信息:
curl -X POST -d "param1=value1" -H "Content-Type: application/x-www-form-urlencoded" https://example.com
发送 JSON 数据:
curl -X POST -H "Content-Type: application/json" -d '{"key":"value"}' https://example.com
从 URL 下载文件(使用测试网站 https://www.sample-videos.com):
要下载并将文件保存在当前工作文件夹中,只需使用带有 -O(大写字母)选项的命令,它会将文件以 URL 中指定的文件名保存。
curl https://www.sample-videos.com/img/Sample-jpg-image-50kb.jpg -O
如果您需要将文件下载到特定文件夹,请使用 -o(小写字母)选项并指定路径:
Windows:
curl -o "C:\Users\UserName\Pictures\Sample-jpg-image-50kb.jpg" https://www.sample-videos.com/img/Sample-jpg-image-50kb.jpg
Linux/MacOS:
curl -o "/Users/UserName/Pictures/Sample-jpg-image-50kb.jpg" https://www.sample-videos.com/img/Sample-jpg-image-50kb.jpg
检查响应头部:
curl -I http://example.com
此命令仅显示服务器的响应头部,不包含响应体。-I(或 --head)标志让您看到页面的元信息(例如 HTTP 状态码、内容类型、最后更新时间)。这对于诊断或检查资源的可用性非常有用。
使用用户名和密码进行身份验证:
curl -u username:password https://example.com
实际网站示例:
curl -u demo:password123 https://httpbin.org/basic-auth/demo/password123
--header(或短形式 -H)命令在 cURL 中用于向 HTTP 请求添加 HTTP 头部。
它允许您发送服务器可能需要的额外 HTTP 头部。例如,您可以添加 User-Agent:
curl --header "User-Agent: Mozilla/5.0" https://example.com
或者配置使用头部进行身份验证:
curl --header "Authorization: Bearer your_token_here" https://api.example.com
查看所有可用命令及其描述:
curl --help all
Invoke-WebRequest 是 PowerShell 中的一个命令(cmdlet),用于执行 HTTP 请求,如下载网页、发送数据或下载文件。它允许直接在命令行中处理网页内容,但并不是 cURL 的完整替代品,因为它功能和语法更为有限。
以前,在 PowerShell 中,curl 命令是 Invoke-WebRequest 的别名(alias),这常常让用户误以为它是标准的 cURL 工具。
在早期版本的 Windows 10 和 Windows 11 中,微软为系统添加了 curl.exe —— 一个与 Linux 和 macOS 上的 cURL 相似的完整版本。然而,在 PowerShell 中,curl 命令有时仍然会启动 Invoke-WebRequest。为避免这种情况,可以使用 cmd 而不是 PowerShell,或者通过 Remove-Alias curl 命令删除 curl 的别名,这样 curl 就会直接调用 curl.exe 工具。或者,您也可以明确指定 curl.exe:
curl.exe https://example.com
通过在 cURL 中使用代理服务器,您可以获得匿名性、绕过封锁,并在与互联网资源互动时提高安全性。掌握基本命令和参数,您可以在不同场景下有效配置代理。
使用 HTTP 和 HTTPS 代理
要使用 HTTP/HTTPS 代理,可以使用 -x 或 --proxy 参数指定代理服务器:
HTTP 代理:
curl -x http://123.456.789.012:8080 https://example.com
HTTPS 代理:
curl -x https://123.456.789.012:8080 https://example.com
使用 SOCKS 代理
SOCKS 代理(SOCKS4 或 SOCKS5)不仅支持 HTTP 和 HTTPS,还支持其他协议。
SOCKS5 代理示例:
curl -x socks5://123.456.789.012:1080 https://httpbin.org/ip
SOCKS4 代理示例:
curl -x socks4://123.456.789.012:1080 https://httpbin.org/ip
代理认证
有时代理服务器需要认证。要为代理提供用户名和密码,请使用 -U 或 --proxy-user 参数。
curl -x http://123.456.789.012:8080 -U testuser:testpassword https://httpbin.org/ip
使用不同协议的代理
cURL 允许使用不同类型的代理来处理不同的协议。例如,您可以使用 SOCKS5 代理来处理 HTTP 请求,并使用 HTTPS 代理来处理加密连接。
curl -x socks5://123.456.789.012:1080 -U testuser:testpassword https://httpbin.org/ip
此请求将使用 SOCKS5 代理处理 HTTP 请求,同时数据将通过加密的 HTTPS 传输。
通过代理检查 IP 地址
要检查请求是否通过代理进行,可以使用 httpbin.org 获取当前 IP:
curl -x http://123.456.789.012:3128 http://httpbin.org/ip
检查代理速度
要测量代理速度,可以在 cURL 中使用 -w(write-out)标志来获取下载速度(%{speed_download})。同时,-o /dev/null 用于忽略输出内容,-s 使命令执行“静默”:
curl -x http://123.456.789.012:3128 -o /dev/null -s -w "Download Speed: %{speed_download} bytes/sec\n" https://httpbin.org/bytes/102400
使用带有 User-Agent 的代理
有时需要在使用代理时修改 User-Agent:
curl -x http://123.456.789.012:3128 -A "Mozilla/5.0 (Windows NT 10.0; Win64; x64)" http://httpbin.org/headers
仅对特定请求使用代理
您可以指定哪些请求需要通过代理。例如,仅对特定域名使用代理。--noproxy 选项允许您指定绕过代理的域名:
curl --proxy http://123.456.789.012:8080 --noproxy example.com http://httpbin.org/ip
为了简化在 cURL 中使用代理,可以通过设置环境变量来实现。这允许自动化代理连接,避免每次都在命令行中指定参数。
使用环境变量与 cURL 的示例:
Linux/macOS:在 Linux 和 macOS 中,代理通过终端使用 export 命令进行设置。
设置 HTTP 代理变量的示例:
export http_proxy=http://123.456.789.012:8080
对于 HTTPS 代理:
export https_proxy=https://123.456.789.012:8080
Windows:在 Windows 中,可以通过命令提示符设置环境变量:
set http_proxy=http://123.456.789.012:8080
set https_proxy=https://123.456.789.012:8080
之后可以使用 cURL,它会自动使用指定的代理:
curl https://example.com
在 Linux/macOS 中,要在命令或脚本中使用环境变量的值,可以使用 $ 符号。它允许访问变量的值。例如:
curl -x $http_proxy https://example.com
在 Windows 中,访问环境变量的值使用 % 符号。例如:
curl -x %http_proxy% https://example.com
正确设置连接的安全性可以帮助防止数据泄露并增强您在网络上的连接保护。
使用 -k 或 --insecure 标志:此选项允许忽略 SSL 证书错误,这在您的代理使用自签名证书时非常有用:
curl -x https://123.456.789.012:8080 -k https://example.com
检查证书:为了避免通过 HTTPS 代理连接时的风险,重要的是使用正确的证书。如果您有证书文件,请使用 --cacert 标志:
curl -x https://123.456.789.012:8080 --cacert /path/to/certificate.crt https://example.com
如果您有多个证书,可以通过 --capath 选项指定包含受信任证书的目录。这在您需要使用多个证书时非常有用:
curl -x https://123.456.789.012:8080 --capath /path/to/certificates/ https://example.com
cURL 中的别名(或称 alias)是针对常用参数的简化命令,它们使得使用 cURL 更加方便快捷。通过创建别名,可以避免每次输入长命令,而是通过简短的命令执行常见操作。
为什么要使用别名?
- 简化命令:可以使用简短、方便的命令代替冗长的参数。
- 降低出错率:减少输入错误的可能性。
- 节省时间:一个别名就能设置所有参数。
如何设置别名
Linux/macOS(类 Unix 系统):
在这些系统中,别名由 shell 直接支持(例如,bash、zsh 等)。您可以将别名添加到 shell 配置文件中(如 .bashrc、.zshrc 等),使其在任何终端会话中都能使用。
例如,在 bash 中:
- 打开或创建文件 ~/.bashrc(或 zsh 使用 ~/.zshrc):
nano ~/.bashrc
- 添加别名,例如:
alias curlproxy="curl -x http://123.456.789.012:8080"
之后,您可以在任何会话中使用命令:
curlproxy https://example.com
Windows:
在 Windows 中,使用别名不像在类 Unix 系统中那样直接支持。然而,在 PowerShell 中可以使用命令 New-Alias 创建别名。但需要注意的是,New-Alias 不支持为命令指定参数,如代理服务器。为了创建带有参数的别名,可以使用 PowerShell 函数或自定义脚本。
在 PowerShell 中:
- 打开 PowerShell。
- 创建一个用于别名的函数:
function curlproxy { curl -x http://123.456.789.012:8080 $args }
如果希望该函数始终可用,可以将其添加到 PowerShell 配置文件中(例如,$PROFILE 文件)。
在命令行 (CMD) 中:
在 CMD 中,您可以使用批处理文件 (.bat) 创建别名。例如,创建一个 curlproxy.bat 文件,存放在 PATH 系统变量指向的目录中,并在该文件中编写:
curl -x http://123.456.789.012:8080 %1
然后,您可以通过传递参数作为命令的参数来使用 curlproxy 命令。
.curlrc 配置文件是一个特殊的文件,用于存储 cURL 工具的默认设置。该文件可以自动化设置命令行参数的过程,例如代理服务器、用户代理、SSL 证书和其他参数。如果您希望避免每次调用 cURL 命令时都手动指定相同的选项,这个文件特别有用。
要在 .curlrc 文件中配置代理,只需指定相应的参数。例如:
proxy = "http://123.456.789.012:8080"
该参数指定 cURL 使用带有指定地址和端口的代理服务器。您还可以为代理服务器配置认证,提供用户名和密码:
proxy-user = "username:password"
一旦您配置好 .curlrc 文件,cURL 会在执行命令时自动应用这些参数,您就不需要在命令行中手动指定它们。例如,命令:
curl http://example.com
将使用 .curlrc 文件中指定的代理,而无需添加 -x 标志或其他参数。
假设您想从特定的网页(例如 http://example.com)提取数据,您可以使用以下带有代理的 curl 命令:
curl -x http://123.45.67.89:8080 http://example.com -o example.html
这里:
- -x http://123.45.67.89:8080 — 代理服务器。
- http://example.com — 您想要获取数据的目标网页。
- -o example.html — 将网页内容保存为 example.html 文件。
执行命令后,example.html 文件将包含目标页面的 HTML 代码。
接下来,我们从 https://example.com 网页中提取 <h1> 标签的内容,使用代理。
步骤:
- 使用代理服务器发送请求。
- 使用 grep 或 sed 提取数据。
curl -x http://123.45.67.89:8080 https://example.com | grep -oP '<h1.*?>.*?</h1>'
在 PowerShell 中,您可以使用内置的 Select-String 命令来执行类似的任务。例如:
curl.exe -x http://123.45.67.89:8080 https://example.com | Select-String -Pattern '<h1.*?>.*?</h1>' -AllMatches | ForEach-Object { $_.Matches.Value }
如果您安装了 WSL(Windows Subsystem for Linux),您可以执行与 Linux 相同的命令:
curl -x http://123.45.67.89:8080 https://example.com | grep -oP '<h1.*?>.*?</h1>'
将 cURL 与 Python 和 Node.js 集成,为自动化请求、网页抓取和与 API 的交互提供了许多可能性。通过使用 Python 中的 subprocess 和 pycurl 模块,或 Node.js 中的 child_process 和 node-libcurl,您可以执行复杂的命令并从应用程序中提取数据。让我们来看看如何将 cURL 与这两种语言进行集成。
在 Python 中
在 Python 中执行 cURL 请求,我们使用 subprocess 模块。
使用代理的 GET 请求:
import subprocess
curl_command = ['curl', '-x', 'http://123.45.67.89:8080', 'https://example.com']
response = subprocess.run(curl_command, capture_output=True, text=True)
print(response.stdout)
使用 pycurl 完成相同的操作:
import pycurl
from io import BytesIO
# 初始化一个缓冲区来捕获输出
buffer = BytesIO()
# 创建 pycurl 对象
c = pycurl.Curl()
# 设置 URL
c.setopt(c.URL, 'https://example.com')
# 设置代理
c.setopt(c.PROXY, 'http://123.45.67.89:8080')
# 设置输出到缓冲区
c.setopt(c.WRITEDATA, buffer)
# 执行请求
c.perform()
# 获取响应
response = buffer.getvalue().decode('utf-8')
# 输出响应
print(response)
# 清理
c.close()
在 Node.js 中
在 Node.js 中执行 cURL 请求,我们使用 child_process 模块。
使用代理的 GET 请求:
const { exec } = require('child_process');
exec('curl -x http://123.45.67.89:8080 https://example.com', (error, stdout, stderr) => {
if (error) console.error(`exec error: ${error}`);
else console.log(stdout);
});
使用 node-libcurl 完成相同的操作:
const { Curl } = require('node-libcurl');
const curl = new Curl();
curl.setOpt('URL', 'https://example.com');
curl.setOpt('PROXY', 'http://123.45.67.89:8080');
// 设置回调来处理响应
curl.on('end', (statusCode, body, headers) => {
console.log(body);
curl.close();
});
curl.on('error', (error) => {
console.error('错误:', error); // 处理错误
});
curl.perform();
将 CapMonster Cloud 与 cURL 集成可以自动化在执行 HTTP 请求时解决 CAPTCHA 的过程。以下是使用 cURL 进行操作的步骤:
首先,注册 CapMonster Cloud 服务并获取 API 密钥。
构建并通过 CapMonster Cloud 发送任务以解决 CAPTCHA(本例中为 reCAPTCHA v2)——请参考文档:
MacOS/Linux:
curl -X POST https://api.capmonster.cloud/createTask \
-H "Content-Type: application/json" \
-d '{
"clientKey": "API_KEY",
"task": {
"type": "RecaptchaV2TaskProxyless",
"websiteURL": "https://lessons.zennolab.com/captchas/recaptcha/v2_simple.php?level=high",
"websiteKey": "6Lcg7CMUAAAAANphynKgn9YAgA4tQ2KI_iqRyTwd"
}
}'
Windows (CMD):
curl -X POST https://api.capmonster.cloud/createTask ^
-H "Content-Type: application/json" ^
-d "{\"clientKey\":\"API_KEY\",\"task\":{\"type\":\"RecaptchaV2TaskProxyless\",\"websiteURL\":\"https://lessons.zennolab.com/captchas/recaptcha/v2_simple.php?level=high\",\"websiteKey\":\"6Lcg7CMUAAAAANphynKgn9YAgA4tQ2KI_iqRyTwd\"}}"
获取任务结果 任务发送后,您将收到任务 ID,这个 ID 在获取答案时需要用到。
MacOS/Linux:
curl -X POST https://api.capmonster.cloud/getTaskResult \
-H "Content-Type: application/json" \
-d '{
"clientKey": "API_KEY",
"taskId": "task_id_received_from_createTask"
}'
Windows (CMD):
curl -X POST https://api.capmonster.cloud/getTaskResult ^
-H "Content-Type: application/json" ^
-d "{\"clientKey\":\"API_KEY\",\"taskId\":\"task_id_received_from_createTask\"}"
解决 CAPTCHA 在请求 getTaskResult 后,CapMonster 会返回任务的解决方案,例如 reCAPTCHA 的令牌,您可以使用它填写表单。
MacOS/Linux:
curl -X POST https://lessons.zennolab.com/captchas/recaptcha/v2_simple.php \
-d "g-recaptcha-response=your_captcha_solution" \
-d "other_data=value"
Windows (CMD):
curl -X POST https://lessons.zennolab.com/captchas/recaptcha/v2_simple.php ^
-d "g-recaptcha-response=your_captcha_solution" ^
-d "other_data=value"
使用代理发送 createTask 请求的示例
如果您希望通过代理发送请求,请添加 -x 参数:
MacOS/Linux:
curl -x http://proxy-server:port -X POST https://api.capmonster.cloud/createTask \
-H "Content-Type: application/json" \
-d '{
"clientKey": "API_KEY",
"task": {
"type": "RecaptchaV2TaskProxyless",
"websiteURL": "https://lessons.zennolab.com/captchas/recaptcha/v2_simple.php?level=high",
"websiteKey": "6Lcg7CMUAAAAANphynKgn9YAgA4tQ2KI_iqRyTwd"
}
}'
Windows (CMD):
curl -x http://proxy-server:port -X POST https://api.capmonster.cloud/createTask ^
-H "Content-Type: application/json" ^
-d "{\"clientKey\": \"API_KEY\", \"task\": {\"type\": \"RecaptchaV2TaskProxyless\", \"websiteURL\": \"https://lessons
调试输出 curl
此方法有助于检查 curl 如何通过代理发送请求,以及它是否正确解释了设置。
使用 --proxy 标志指定代理:
curl --proxy http://123.456.7.8.9:3128 http://example.com
如果代理需要身份验证,请添加:
curl --proxy http://user:[email protected]:3128 http://example.com
使用 -v 或 --trace-ascii 标志启用调试输出:
curl -v --proxy http://123.456.7.8.9:3128 http://example.com
这将显示连接的详细信息、发送的头信息和其他有用的数据。
检查结果。
如果请求成功,您将看到 HTTP 响应。
如果有错误(例如,407 Proxy Authentication Required),您可以调整参数。
带有完整追踪输出的示例:
curl --trace-ascii debug.log --proxy http://123.456.7.8.9:3128 http://example.com
输出将保存在 debug.log 文件中,供详细分析。
使用本地代理服务器
此方法适用于详细检查通过代理发送的数据(包括头信息、请求正文、响应等)。
安装并启动本地代理服务器:
mitmproxy --listen-port 8080
配置 curl 使用本地代理:
curl --proxy http://127.0.0.1:8080 http://example.com
打开 mitmproxy 界面以分析请求。
您将能够实时查看所有 HTTP 请求和响应。
这对于调试非常方便,确保请求正确发送并且数据通过代理传输。
附加:通过 mitmproxy 连接远程代理。如果您希望使用 mitmproxy 来监控与远程代理的工作,请将其配置为“代理中的代理”(upstream proxy):
mitmproxy --mode upstream:http://123.456.7.8.9:3128 --listen-port 8080
要检查代理本身的可用性,请使用 --connect-timeout 和 --max-time 标志:
curl --proxy http://123.456.7.8.9:3128 --connect-timeout 10 --max-time 15 http://example.com
像任何程序一样,curl 有时会遇到错误。以下是使用 curl 与代理时的常见错误及其可能的原因:
- curl: (5) Unsupported proxy syntax
代理字符串格式不正确。确保代理格式符合要求。 - curl: (7) Failed to connect to proxy_host port 8080: Connection refused
代理服务器不可用或已关闭。代理的 IP 地址或端口不正确。检查代理是否运行,确保 IP 和端口正确。 - curl: (7) Could not resolve proxy: proxy_host
无法解析指定的代理 DNS 名称。确保主机名正确。尝试使用 IP 地址代替主机名。 - curl: (35) schannel: next InitializeSecurityContext failed
SSL/TLS 连接问题。检查代理是否支持 HTTPS。暂时禁用证书验证。 - curl: (52) Empty reply from server
代理没有响应请求。检查服务器是否通过代理可访问,确保请求正确。 - curl: (56) Proxy CONNECT aborted
代理中断了连接。代理的凭证无效。检查代理的用户名和密码。 - curl: (407) Proxy Authentication Required
代理需要身份验证,但未提供凭证。在代理字符串中指定用户名和密码。 - curl: (28) Operation timed out
代理不可用。服务器响应时间过长。检查代理和服务器的可用性,增加超时时间。 - curl: (18) Transfer closed with outstanding read data remaining
代理意外关闭了数据传输。尝试使用其他代理。确保代理支持请求的协议(HTTP/HTTPS)。 - curl: (22) The requested URL returned error: 403 Forbidden
通过代理访问资源被阻止。检查是否允许通过此代理访问目标 URL。使用其他代理。 - curl: (60) SSL certificate problem
服务器 SSL 证书验证问题。禁用 SSL 验证。 - curl: (6) Could not resolve host: example.com
无法通过代理解析目标服务器的 DNS 名称。检查代理的互联网连接,确保主机名正确。
备注:请注意,该产品仅用于您自己的网站或您有合法访问权限的网站的自动化测试。