استفاده از cURL با پروکسی: تنظیم پروکسی HTTP و SOCKS5

تاریخ انتشار:

16 دقیقه مطالعه

به‌روزرسانی:

PXNET
نویسنده: PXNET
زمینه سیاه با سطرهای محو IP؛ در قابی گوشه‌به‌علاوه: چپ Proxynet، راست ⁨cURL⁩، ضربدری میانشان و برچسب INTEGRATION

از ارائه‌دهنده پروکسی یک نشانی گرفته‌اید و می‌خواهید پیش از آنکه آن را در اسکرپر، یک cron job یا خط لوله CI بگذارید، بدانید کار می‌کند یا نه. سریع‌ترین راه بررسی cURL است: یک دستور درخواست را از طریق پروکسی می‌فرستد و آدرس IP را که سایت مقصد می‌بیند چاپ می‌کند، و همان دستور بعداً بدون تغییر در یک اسکریپت شل قرار می‌گیرد.

در این نوشته گزینه -x، نام کاربری و رمز، SOCKS5، تنظیم پروکسی برای همه دستورها، یک اسکریپت دانلود با تلاش دوباره و متن دقیق پیام‌های خطا را مرور می‌کنیم. همه دستورها با ⁦curl 8.21⁩ روی یک پروکسی آزمایشی محلی اجرا شده‌اند و گزینه‌ها در راهنمای رسمی cURL (man page) مستند شده‌اند.

cURL چیست؟

cURL (تلفظ: «کِرل») ابزاری خط فرمانی برای انتقال داده به سرورها و از سرورها با استفاده از URL است: صفحه و فایل دانلود می‌کند، فرم و درخواست API می‌فرستد و پاسخ را روی صفحه چاپ یا در فایل ذخیره می‌کند. کار اصلی را libcurl انجام می‌دهد؛ کتابخانه انتقال داده‌ای که PHP و زبان‌های دیگر هم از آن استفاده می‌کنند.

مثل هر دستور دیگری، cURL نحو ثابتی دارد:

bash
curl [options] [URL]

بخش options تعیین می‌کند دستور چه کاری انجام دهد. از این پارامترها که به آن‌ها flag هم می‌گویند بیش از 250 تا وجود دارد. -o page.html پاسخ را در فایل ذخیره می‌کند، -I فقط هدرها را می‌گیرد، -L ریدایرکت‌ها را دنبال می‌کند و -x از پروکسی استفاده می‌کند. همه گزینه‌ها به بزرگی و کوچکی حرف حساس‌اند: -x پروکسی را تعیین می‌کند و -X متد HTTP را.

cURL روی macOS، روی ⁦Windows 10⁩ و 11 با نام curl.exe و روی بیشتر توزیع‌های Linux از پیش نصب است و روی همه این سیستم‌ها یکسان رفتار می‌کند. در ایمیج‌های کوچک کانتینر ممکن است نباشد و باید نصبش کنید (در Debian و Ubuntu با apt install curl). دستور curl --version را اجرا کنید: اگر در سطر Features: عبارت HTTPS-proxy دیده شود، نسخه شما می‌تواند از طریق TLS هم به پروکسی وصل شود.

cURL چه پروتکل‌هایی را پشتیبانی می‌کند؟

cURL برای مبدأ یا مقصد به یک URL نیاز دارد؛ پروتکل‌های شبکه‌ای که با URL آدرس‌دهی نمی‌شوند با cURL کار نمی‌کنند. نسخه فعلی این پروتکل‌ها را فهرست می‌کند: DICT، FILE، FTP، FTPS، GOPHER، GOPHERS، HTTP، HTTPS، IMAP، IMAPS، LDAP، LDAPS، MQTT، MQTTS، POP3، POP3S، RTSP، SCP، SFTP، SMB، SMBS، SMTP، SMTPS، TELNET، TFTP، WS و WSS. دستور curl --version نشان می‌دهد نسخه شما کدام‌ها را پشتیبانی می‌کند؛ RTMP که در فهرست‌های قدیمی‌تر دیده می‌شود دیگر وجود ندارد.

اگر طرح نشانی را ننویسید، cURL پروتکل را از نام میزبان حدس می‌زند (ftp.example.com یعنی FTP و بیشتر نام‌ها یعنی HTTP). برای پروکسی این موضوع از یک جهت مهم است: پروکسی HTTP ترافیک HTTP و HTTPS را حمل می‌کند؛ پروتکل‌های دیگر فقط از راه تونل CONNECT (-p) عبور می‌کنند، آن هم به شرطی که پروکسی آن پورت را مجاز بداند. SOCKS5 هر اتصال TCP را جابه‌جا می‌کند، پس FTP یا SMTP از پشت پروکسی معمولاً یعنی SOCKS5.

چرا cURL را با پروکسی به کار ببریم؟

  • مراحل قابل مشاهده. با -v خروجی مفصلی از آنچه فرستاده و دریافت شده می‌گیرید: اتصال به پروکسی، درخواست CONNECT و هر دو پاسخ. برای عیب‌یابی بسیار به کار می‌آید، چون می‌بینید درخواست دقیقاً در کدام مرحله شکست می‌خورد.
  • همه انواع پروکسی با یک گزینه. HTTP، HTTPS، SOCKS4، SOCKS4a، SOCKS5 و SOCKS5h همگی با -x تعریف می‌شوند.
  • مناسب اسکریپت. کدهای خروج (exit code)، --retry، زمان‌های انتظار (timeout) و --write-out به اسکریپت شل امکان می‌دهند خطاها را مدیریت کند، و توابع curl_* در PHP همین گزینه‌ها را می‌پذیرند.
  • چند URL در یک دستور. می‌توانید چند حالت از یک URL را با کروشه یا آکولاد در یک دستور بنویسید (URL globbing): page[1-20].html یا {a,b,c} به چند درخواست تبدیل می‌شود که همه از همان پروکسی می‌روند.

کاربردهای رایج: بررسی کشور IP خروجی پیش از اجرای استخراج داده، آزمودن مقصدهای رصد قیمت از دید بازاری دیگر و دانلود در کارهای زمان‌بندی‌شده. معادل‌های Node.js را در معادل cURL در JavaScript و نمونه‌های PHP را در وب اسکرپینگ با PHP آورده‌ایم.

cURL چگونه درخواست را از طریق پروکسی می‌فرستد؟

  1. cURL به پروکسی وصل می‌شود، نه به مقصد.
  2. مقصد HTTP، پروکسی HTTP: cURL درخواست را با URL کامل می‌فرستد (GET http://example.com/ HTTP/1.1). پروکسی می‌تواند محتوای آن را بخواند.
  3. مقصد HTTPS، پروکسی HTTP: cURL درخواست CONNECT example.com:443 را می‌فرستد و اگر نام کاربری و رمز داده باشید، هدر Proxy-Authorization را هم همراهش می‌کند. پس از آنکه پروکسی با 200 پاسخ داد، اتصال TLS با مقصد درون همین تونل برقرار می‌شود و پروکسی فقط نام میزبان و پورت را می‌بیند. متد CONNECT در ⁦RFC 9110⁩ تعریف شده است.
  4. پروکسی SOCKS5: cURL وارد پروکسی می‌شود (با نام کاربری و رمز، اگر داده باشید) و از پروکسی می‌خواهد به مقصد وصل شود (⁦RFC 1928⁩). با socks5:// خودش نام میزبان را به IP تبدیل می‌کند و همان IP را می‌فرستد؛ با socks5h:// خود نام میزبان را می‌فرستد.
  5. مقصد به IP پروکسی پاسخ می‌دهد. IP شما به مقصد نمی‌رسد، اما اگر cURL نام‌ها را روی رایانه شما resolve کند، پرس‌وجوهای DNS از خط خود شما بیرون می‌روند.

تنظیم پروکسی در cURL: گزینه -x

ترمینال را باز کنید و با curl --help proxy فهرست همه گزینه‌های مربوط به پروکسی را ببینید. مهم‌ترین سطر آن این است:

text
 -x, --proxy <[protocol://]host[:port]>  Use this proxy

حرف x کوچک است. مشخصات پروکسی را با -x یا با --proxy می‌دهید؛ هر دو یک معنا دارند:

bash
curl -x "http://user:pass@pr.proxynet.io:8000" https://httpbin.org/ip

نشانی httpbin.org/ip آدرس IP مبدأ درخواست را برمی‌گرداند: اگر پروکسی کار کند، IP خروجی پروکسی را می‌بینید نه آدرس خودتان.

  • بدون طرح یعنی HTTP. پروتکل پیش‌فرض پروکسی HTTP است، بنابراین -x "user:pass@pr.proxynet.io:8000" دقیقاً مثل شکل http:// رفتار می‌کند.
  • پورت را همیشه بنویسید. بدون پورت، cURL یک پورت پیش‌فرض برمی‌دارد: در آزمایش ما با ⁦curl 8.21⁩ پورت 80 برای http://، پورت 443 برای https:// و پورت 1080 برای SOCKS (راهنمای رسمی هنوز 1080 را ذکر می‌کند). هیچ‌کدام از این‌ها به احتمال زیاد پورت ارائه‌دهنده شما نیست، پس اتصال شکست می‌خورد یا به timeout می‌رسد.
  • نشانی را داخل گیومه دوتایی بگذارید تا پوسته فرمان نویسه‌های ویژه‌ای مانند &، ? یا ! را تفسیر نکند.
  • -x فقط برای یک دستور است و بر متغیرهای محیطی پروکسی مقدم است. دستور بعدی دوباره مستقیم بیرون می‌رود.

در محصولات مسکونی و موبایل Proxynet یک گیت‌وی هر دو پروتکل HTTP و SOCKS5 را روی پورت‌های جداگانه ارائه می‌دهد و بخش «Endpoint Generator» در پنل کاربری، نام کاربری را با کشور، شهر و نشستی که انتخاب می‌کنید می‌سازد.

چگونه cURL را با پروکسی HTTP یا HTTPS به کار ببریم؟

پروکسی HTTP هر دو نوع مقصد را حمل می‌کند:

bash
# HTTPS target: CONNECT tunnel, the page stays encrypted
curl -x "http://user:pass@pr.proxynet.io:8000" https://httpbin.org/ip

# HTTP target: the proxy forwards the plain request
curl -x "http://user:pass@pr.proxynet.io:8000" http://httpbin.org/ip

پروکسی HTTPS (https://) اتصال میان شما و خود پروکسی را هم رمزگذاری می‌کند. فقط وقتی از آن استفاده کنید که پورت پروکسی با TLS کار کند؛ https:// روی یک پورت HTTP ساده در مرحله دست‌دهی (handshake) شکست می‌خورد (در Windows با پیام SEC_E_INVALID_TOKEN و با OpenSSL معمولاً با wrong version number).

گزینه‌های گواهی میان این دو اتصال تقسیم شده‌اند:

  • -k (--insecure) بررسی گواهی را فقط برای سایت مقصد کنار می‌گذارد. با مقصد http:// هیچ اثری ندارد.
  • --proxy-insecure بررسی گواهی پروکسی HTTPS را کنار می‌گذارد. --proxy-cacert file.pem امن‌تر است: گواهی CA پروکسی سازمانی را معتبر می‌شمارد بی‌آنکه بررسی‌ها را خاموش کند.

-k را فقط برای آزمون‌های سریع نگه دارید و هرگز در اسکریپت‌هایی که توکن می‌فرستند به کار نبرید. برای پروتکل‌های غیر HTTP از پشت پروکسی HTTP، گزینه -p (--proxytunnel) را اضافه کنید. اینکه ترافیک رمزگذاری‌شده چگونه از پروکسی عبور می‌کند در صفحه پروکسی HTTPS آمده است.

چگونه نام کاربری و رمز پروکسی را بدهیم؟

هر دو شکل همان هدر Proxy-Authorization را می‌فرستند:

bash
curl -x "http://user:pass@pr.proxynet.io:8000" https://httpbin.org/ip
curl -x "http://pr.proxynet.io:8000" -U "user:pass" https://httpbin.org/ip

وقتی رمز داخل نشانی نوشته می‌شود، نویسه‌های ویژه آن باید با کدگذاری درصدی (percent-encoding) نوشته شوند: @ به شکل %40، : به شکل %3A و # به شکل %23. cURL پیش از ارسال آن‌ها را به حالت اول برمی‌گرداند؛ در آزمایش ما p%40ss به شکل p@ss به پروکسی رسید. با -U (--proxy-user) کدگذاری لازم نیست. احراز هویت Basic پیش‌فرض است؛ پروکسی‌های سازمانی ممکن است --proxy-ntlm، --proxy-digest یا --proxy-anyauth لازم داشته باشند.

رمزی که در خط فرمان می‌نویسید در تاریخچه پوسته (shell history) ثبت می‌شود. در اسکریپت‌ها آن را از یک فایل پیکربندی خصوصی بخوانید (-K file) یا به‌جای رمز از لیست سفید IP استفاده کنید (Proxynet تا 10 IP را می‌پذیرد). در نوشته احراز هویت پروکسی: نام کاربری و رمز یا لیست سفید IP این دو روش را مقایسه کرده‌ایم و خطای 407 را هم توضیح داده‌ایم.

چگونه cURL را با پروکسی SOCKS5 به کار ببریم؟

نسخه SOCKS را به‌عنوان طرح نشانی بنویسید:

bash
curl -x "socks5h://user:pass@pr.proxynet.io:1080" https://httpbin.org/ip
طرحتبدیل نام میزبان به IPنام کاربری و رمزکاربرد
http://پروکسیبلهوب اسکرپینگ، API و بیشتر ابزارها
https://پروکسیبلهپورت پروکسی که با TLS کار می‌کند
socks5h://پروکسیبلهSOCKS5 با DNS هماهنگ با موقعیت پروکسی
socks5://رایانه شمابلهمقصدهایی که فقط DNS شما آن‌ها را می‌شناسد
socks4a://پروکسیفقط شناسه کاربر (User ID)سرورهای قدیمی SOCKS4
socks4://رایانه شمافقط شناسه کاربر (User ID)سرورهای قدیمی SOCKS4

بسته به نسخه SOCKS، یکی از این طرح‌ها را به کار می‌برید. با socks5:// سرور DNS شما همه میزبان‌هایی را که باز می‌کنید می‌بیند و سایت‌هایی که پاسخ را بر اساس موقعیت تنظیم می‌کنند، برای موقعیت شما پاسخ می‌دهند. با socks5h:// نام میزبان را خود پروکسی resolve می‌کند نه رایانه شما و هر دو مشکل از میان می‌رود؛ برای اسکرپینگ معمولاً همین بهتر است. چرایی آن را در نشت WebRTC و DNS: چیست و چگونه جلوی آن را بگیریم توضیح داده‌ایم. گزینه قدیمی‌تر --socks5-hostname host:port معادل socks5h:// است و نام کاربری و رمز در آن با -U فرستاده می‌شود؛ گزینه --socks5 هم معادل socks5:// است و DNS را روی رایانه شما انجام می‌دهد.

برای تفاوت‌های این دو پروتکل، تفاوت پروکسی SOCKS و HTTP و پروکسی SOCKS5: چطور کار می‌کند و چه فرقی دارد را بخوانید. پروکسی SOCKS5 در Proxynet روی پورت جداگانه‌ای کنار پورت HTTP کار می‌کند.

چگونه پروکسی را برای همه دستورهای cURL تنظیم کنیم؟

روشدامنه اثرنمونه
-xیک دستورcurl -x "http://user:pass@host:port" URL
متغیر محیطینشست پوستهexport https_proxy="http://user:pass@host:port"
.curlrcهمه اجراهای همان کاربرproxy = "http://host:port"

متغیرهای محیطی. cURL برای مقصدهای HTTP متغیر http_proxy، برای HTTPS متغیر https_proxy یا HTTPS_PROXY و در نبود این‌ها ALL_PROXY را می‌خواند. http_proxy فقط با حروف کوچک کار می‌کند (محافظتی برای برنامه‌های CGI)، پس HTTP_PROXY در Linux و macOS نادیده گرفته می‌شود. در PowerShell: $env:HTTPS_PROXY = "http://user:pass@host:port". wget، pip و git هم همین متغیرها را می‌خوانند؛ استفاده از پروکسی در wget و صفحه متغیرهای پروکسی در everything curl را ببینید.

فایل پیکربندی. cURL پیش از هر اجرا فایل ~/.curlrc را می‌خواند (در Windows فایل %USERPROFILE%\.curlrc یا _curlrc):

text
proxy = "http://pr.proxynet.io:8000"
proxy-user = "user:pass"

اگر -q را اولین گزینه بنویسید (curl -q URL)، cURL این فایل را برای همان یک اجرا نادیده می‌گیرد.

استثناها. با --noproxy "localhost,.internal.example" یا متغیر NO_PROXY، این میزبان‌ها مستقیم وصل می‌شوند. هر نام زیردامنه‌هایش را هم در بر می‌گیرد، بازه‌های CIDR مانند 192.168.0.0/16 کار می‌کنند و تنها نویسه عام (wildcard) قابل قبول یک * تنهاست. NO_PROXY حتی با -x هم اعمال می‌شود.

cURL موتور JavaScript ندارد، پس نمی‌تواند فایل PAC را اجرا کند. اگر شبکه شما از چنین فایلی استفاده می‌کند، آن را بخوانید (فایل PAC چیست؟) و پروکسی‌ای را که برمی‌گرداند با -x به cURL بدهید.

چگونه بفهمیم cURL از پروکسی استفاده می‌کند؟

دستور curl https://api.ipify.org را یک بار بدون -x و یک بار با آن اجرا کنید: اگر آدرس دوم متفاوت و در کشور مورد انتظار باشد، پروکسی کار می‌کند. یک درخواست سالم HTTPS از طریق پروکسی HTTP در خروجی -v این سطرها را نشان می‌دهد:

text
* Establishing HTTP proxy tunnel to httpbin.org:443
> CONNECT httpbin.org:443 HTTP/1.1
> Proxy-Authorization: Basic dXNlcjpwYXNz
< HTTP/1.1 200 Connection Established
* CONNECT tunnel established, response 200

مقدار Proxy-Authorization فقط با Base64 کدگذاری شده و رمزگذاری نیست؛ پیش از به اشتراک گذاشتن خروجی آن را پاک کنید. در اسکریپت‌ها -w نتیجه را در یک سطر چاپ می‌کند:

bash
curl -s -o /dev/null -x "http://user:pass@pr.proxynet.io:8000" \
  -w "%{http_code} connect=%{http_connect} proxy_used=%{proxy_used}\n" https://httpbin.org/ip

http_connect پاسخ پروکسی به CONNECT است؛ proxy_used (از ⁦curl 8.7⁩ به بعد) وقتی از پروکسی استفاده شده باشد مقدار 1 دارد. برای بررسی موقعیت، سرعت و نشت، نوشته آیا پروکسی کار می‌کند؟ چگونه پروکسی را آزمایش کنیم را ببینید.

نمونه: دانلود فهرستی از URLها از طریق پروکسی با تلاش دوباره

این اسکریپت URLهای فایل urls.txt را چهارتا چهارتا از طریق پروکسی دانلود می‌کند، خطاهای موقت را دوباره امتحان می‌کند و وضعیت و مدت هر درخواست را چاپ می‌کند. به cURL و یک پوسته POSIX (Linux، macOS یا Git Bash) نیاز دارد:

bash
#!/usr/bin/env bash
# fetch.sh: download every URL in urls.txt through the proxy, 4 at a time
set -u
PROXY="${PROXY:-http://user:pass@pr.proxynet.io:8000}"

sed 's/^/url = /' urls.txt | curl \
  --parallel --parallel-max 4 \
  --proxy "$PROXY" \
  --connect-timeout 10 --max-time 30 \
  --retry 3 --retry-connrefused \
  --fail --silent --show-error \
  --create-dirs --output-dir pages --remote-name-all \
  --write-out "%{http_code} %{time_total}s %{url}\n" \
  --config -
  • --config - سطرهای url = … را از sed می‌خواند و باید آخر از همه بیاید، چون --remote-name-all فقط روی URLهایی اثر دارد که پس از آن اضافه می‌شوند.
  • --retry 3 خطاهای timeout و پاسخ‌های 408، 429، 500، 502، 503، 504، 522 و 524 را دوباره امتحان می‌کند، به ترتیب 1، 2 و 4 ثانیه صبر می‌کند و هدر Retry-After را رعایت می‌کند.
  • --max-time انتقالی را که گیر کرده متوقف می‌کند؛ --fail خطاهای HTTP را به کد خروج 22 تبدیل می‌کند.
  • وقتی همه URLها روی یک سایت‌اند، --parallel-max را پایین نگه دارید؛ درخواست‌های موازی زیاد ممکن است پاسخ 429 به همراه داشته باشند.

در آزمایش ما چهار صفحه ذخیره شد، یک URL که 503 برمی‌گرداند سه بار دوباره امتحان شد و در پایان اسکریپت با کد 22 خارج شد.

برای اینکه ببینید گیت‌وی شما IP را می‌چرخاند یا نه، درخواست به api.ipify.org را چند بار تکرار کنید: گیت‌وی چرخشی هر بار IP تازه‌ای برمی‌گرداند و نشست ثابت در Proxynet یک IP را به مدت 1 تا 60 دقیقه نگه می‌دارد. در چرخش IP چیست و چگونه کار می‌کند؟ توضیح داده‌ایم هر کدام کجا به کار می‌آید؛ پروکسی مسکونی از هر دو پشتیبانی می‌کند. برای دانلودهای سریع و انبوه از مقصدهایی که سخت‌گیر نیستند، پروکسی دیتاسنتر هم کافی است.

خطاهای رایج پروکسی در cURL و راه رفع آن‌ها

پیام‌ها همان‌طور که ⁦curl 8.21⁩ در آزمایش‌های ما چاپ کرد:

  • curl: (5) Could not resolve proxy: … نام میزبان پروکسی اشتباه است: املای آن و گیومه‌های اضافه را بررسی کنید.
  • curl: (7) Failed to connect to … over proxy … روی آن پورت چیزی پاسخ نمی‌دهد (یا چون پورتی ننوشته‌اید، cURL سراغ یک پورت پیش‌فرض رفته است)، یا فایروال جلوی اتصال را می‌گیرد.
  • curl: (7) CONNECT tunnel failed, response 407 نام کاربری یا رمز اشتباه است، نویسه‌های ویژه کدگذاری نشده‌اند یا IP شما در لیست سفید نیست. نسخه‌های قدیمی‌تر پیام curl: (56) Received HTTP code 407 from proxy after CONNECT را چاپ می‌کنند؛ برای مقصدهای http:// فقط کد وضعیت 407 را می‌گیرید. کدهای وضعیت HTTP در وب اسکرپینگ را ببینید.
  • curl: (56) Proxy CONNECT aborted پروکسی اتصال را بست؛ در آزمایش ما یک نشانی http:// به پورت SOCKS5 اشاره می‌کرد.
  • curl: (97) Received invalid version in initial SOCKS5 response. یک نشانی socks5:// به پورت HTTP اشاره می‌کند. پیام User was rejected by the SOCKS5 server یعنی نام کاربری یا رمز SOCKS اشتباه است.
  • curl: (28) Connection timed out after … milliseconds پاسخی در زمان مقرر نرسید؛ خطای پروکسی چیست؟ رفع خطای پاسخ ندادن سرور پروکسی را ببینید.
  • curl: (35) … یا SSL_ERROR_SYSCALL دست‌دهی TLS شکست خورد: https:// روی پورت ساده پروکسی، یا دستگاهی در مسیر که اتصال‌های TLS را قطع می‌کند.
  • curl: (60) SSL certificate problem: unable to get local issuer certificate اغلب نشانه پروکسی سازمانی‌ای است که TLS را بازرسی می‌کند. به‌جای -k گواهی CA آن را نصب کنید.
  • پروکسی نادیده گرفته می‌شود. دنبال NO_PROXY، HTTP_PROXY با حروف بزرگ یا یک .curlrc دیگر بگردید؛ -v نشان می‌دهد cURL اول به کدام آدرس وصل می‌شود. معادل همین خطاها در Python را در خطای Max Retries Exceeded With URL چیست و چگونه رفع می‌شود؟ بررسی کرده‌ایم.

راهنمای انتخاب

نیازپیشنهاد
یک بار آزمودن پروکسی تازهcurl -x "http://user:pass@host:port" https://httpbin.org/ip
رمز شامل @، : یا # است-U "user:pass" یا کدگذاری درصدی رمز
تبدیل نام میزبان به IP در سمت پروکسیsocks5h://، نه socks5://
FTP، SMTP یا پروتکل دیگری غیر از HTTPSOCKS5، یا -p همراه پروکسی HTTP
پروکسی برای یک نشست پوستهexport https_proxy=… و http_proxy با حروف کوچک
پروکسی برای همه اجراهاproxy = "…" در ~/.curlrc
بدون رمز در اسکریپت‌هالیست سفید IP در پنل
IP ثابت برای فرایند ورود به حسابنشست ثابت از «Endpoint Generator»

پرسش‌های متداول

آیا cURL از تنظیمات پروکسی سیستم در Windows یا macOS استفاده می‌کند؟

خیر. cURL پروکسی را فقط از -x، از متغیرهای محیطی و از .curlrc می‌گیرد. پروکسی‌ای که در تنظیمات Windows یا در System Settings در macOS تعریف شده باشد روی آن اثری ندارد.

چگونه cURL را وادار کنیم برای یک درخواست پروکسی را نادیده بگیرد؟

کافی است --noproxy "*" یا -x "" را اضافه کنید. هر کدام همان دستور را مستقیم می‌فرستد، حتی وقتی https_proxy یا .curlrc پروکسی تعیین کرده باشد.

چرا دستور پروکسی cURL در PowerShell شکست می‌خورد؟

در ⁦Windows PowerShell 5.1⁩ دستور curl نام مستعار Invoke-WebRequest است که گزینه -x را نمی‌شناسد. برای اجرای cURL واقعی curl.exe را بنویسید. در ⁦PowerShell 7⁩ این نام مستعار دیگر وجود ندارد.

تفاوت socks5 و socks5h در cURL چیست؟

با socks5:// رایانه شما نام میزبان را به IP تبدیل می‌کند؛ با socks5h:// این کار را پروکسی انجام می‌دهد، پس DNS با موقعیت پروکسی هماهنگ است.

آیا می‌توان در PHP از cURL با پروکسی استفاده کرد؟

بله. توابع cURL در PHP از libcurl استفاده می‌کنند: CURLOPT_PROXY نشانی را تعیین می‌کند، CURLOPT_PROXYUSERPWD نام کاربری و رمز را و CURLOPT_PROXYTYPE نوع SOCKS را. نمونه‌ها در وب اسکرپینگ با PHP: cURL، Guzzle و تنظیم پروکسی آمده‌اند.

آیا cURL می‌تواند در هر درخواست پروکسی را بچرخاند؟

cURL در هر دستور از یک پروکسی استفاده می‌کند. گیت‌وی چرخشی برای هر اتصال IP خروجی تازه‌ای می‌دهد، پس حلقه‌ای از دستورها هر بار IP متفاوتی می‌گیرد. چند URL در یک دستور معمولاً از یک اتصال مشترک استفاده می‌کنند و IP آن را هم مشترک دارند.

خلاصه

برای استفاده از cURL با پروکسی، -x را با نشانی کامل اضافه کنید: طرح، نام کاربری و رمز، میزبان و پورت. برای بیشتر کارها http:// و برای SOCKS5 با DNS سمت پروکسی socks5h:// را به کار ببرید، وقتی همه دستورها به پروکسی نیاز دارند آن را در https_proxy یا .curlrc بگذارید و -k را فقط برای آزمون نگه دارید. وقتی دستوری شکست می‌خورد، کد خروج و خروجی -v نشان می‌دهند که مشکل از نشانی است، از نام کاربری و رمز یا از مقصد. برای نقطه‌های اتصال مسکونی، موبایل و SOCKS5 که با همین دستورها کار می‌کنند، پروکسی‌های Proxynet را ببینید.

پرسش از ChatGPTپرسش از Claude