Skip to content
intermediate

چگونه پروکسیهای Smartproxy را روی Linux با curl و Python برای خودکارسازی CLI راهاندازی کنیم

ترافیک curl و Python را روی لینوکس از طریق پروکسیهای مسکونی یا دیتاسنتر Smartproxy مسیریابی کنید، IP خروجی خود را بررسی کنید، نشستهای چسبنده را تثبیت کنید و بررسیهای دورهای را با cron یا systemd زمانبندی کنید.

لینوکس SOCKS5 HTTP(S)

نمای کلی

این آموزش نشان میدهد چگونه ترافیک خط فرمان و Python را روی Linux از طریق یک پروکسی ارسال کنید، شامل احراز هویت، بررسی IP خروجی، تثبیت نشست و اجراهای زمانبندیشده. Smartproxy در اینجا بهعنوان ارائهدهنده پیشنهادی استفاده میشود زیرا پروکسیهای مسکونی و دیتاسنتر را روی HTTP و SOCKS5 با صورتحساب ماهانه ثابت و استخر بیش از ۶۵ میلیون IP ارائه میدهد، اما هر مرحله با هر سرویس پروکسی که همان پروتکلها را ارائه دهد کار میکند.

تا پایان این راهنما قادر خواهید بود:

  • از پوسته (shell) با curl به نقطه پایانی پروکسی خود احراز هویت کنید
  • تأیید کنید که ترافیک خروجی از IP پروکسی خارج میشود، نه IP خودتان
  • از همان نقطه پایانی در Python با requests استفاده کنید
  • یک نشست چسبنده را تثبیت کنید یا IPها را بین درخواستها بچرخانید
  • بررسیهای سلامت را با cron یا یک تایمر systemd خودکار کنید

پیشنیازها

  • یک میزبان Linux (دستورات زیر از Debian/Ubuntu استفاده میکنند؛ معادلهای Fedora و Arch ذکر شدهاند)
  • curl و Python 3.8 یا جدیدتر
  • یک حساب Smartproxy با طرح فعال و اعتبارنامههای پروکسی
  • میزبان و پورتهای نقطه پایانی برای محصولی که میخواهید استفاده کنید، کپیشده از داشبورد داخل حساب Smartproxy شما
  • دسترسی خروجی روی پورت پروکسی، و نبود فایروال شرکتی یا کلاینت VPN که آن را مسدود کند

مرحله ۱ — نصب ابزارهای موردنیاز

curl و Python را نصب کنید، سپس یک محیط ایزوله برای کلاینت Python ایجاد کنید.

sudo apt update
sudo apt install -y curl python3 python3-venv

روی سیستمهای مبتنی بر Fedora یا RHEL از این استفاده کنید:

sudo dnf install -y curl python3

یک محیط مجازی ایجاد کنید و کلاینت HTTP بههمراه پشتیبانی SOCKS را نصب کنید:

python3 -m venv ~/.venvs/proxy
source ~/.venvs/proxy/bin/activate
pip install --upgrade pip
pip install 'requests[socks]'

برنامه افزودنی requests[socks] بسته PySocks را نصب میکند، که باعث کارکرد URLهای socks5h:// در Python میشود.

مرحله ۲ — نگهداری اعتبارنامهها بیرون از اسکریپتها

هاردکد کردن اعتبارنامهها در اسکریپتها یا کامیت کردن آنها در یک مخزن، رایجترین روش نشت حسابهای پروکسی است. آنها را در یک فایل واحد با مجوزهای محدودکننده نگه دارید و فقط هنگام نیاز بارگذاری کنید.

install -d -m 700 ~/.config/smartproxy
install -m 600 /dev/null ~/.config/smartproxy/env

فایل را در ویرایشگر خود باز کنید و هر جاینگهدار (placeholder) را با مقادیر نمایشدادهشده در داشبورد ارائهدهندهتان جایگزین کنید:

# ~/.config/smartproxy/env
# Replace every REPLACE_WITH_ value using the endpoint and credentials
# from your provider dashboard. Do not commit this file to version control.
export SP_PROXY_HOST="REPLACE_WITH_ENDPOINT_HOST"
export SP_PROXY_PORT_HTTP="REPLACE_WITH_HTTP_PORT"
export SP_PROXY_PORT_SOCKS5="REPLACE_WITH_SOCKS5_PORT"
export SP_PROXY_USER="REPLACE_WITH_PROXY_USERNAME"
export SP_PROXY_PASS="REPLACE_WITH_PROXY_PASSWORD"

متغیرها را در پوسته فعلی خود بارگذاری کنید:

set -a; . ~/.config/smartproxy/env; set +a

اگر از هر دو محصول مسکونی و دیتاسنتر استفاده میکنید، برای هرکدام یک جفت متغیر جداگانه نگه دارید، زیرا معمولاً میزبانها یا پورتهای متفاوتی دارند.

مرحله ۳ — انتخاب بین HTTP و SOCKS5

هر دو پروتکل توسط Smartproxy پشتیبانی میشوند، و انتخاب درست بستگی به این دارد که چه چیزی را از طریق تونل ارسال میکنید.

نوع ترافیک پروتکل پیشنهادی چرا
درخواستهای HTTPS از curl، requests یا اسکرپرها پروکسی HTTP (تونل CONNECT) سادهترین برای پیکربندی، با هر کلاینت HTTP کار میکند، و نام میزبان مقصد را به پروکسی میفرستد
ترافیک غیر-HTTP مانند SSH، SMTP یا کلاینتهای TCP سفارشی SOCKS5 مستقل از پروتکل، جریانهای TCP دلخواه را فوروارد میکند
ابزارهایی که نمیتوانند احراز هویت پروکسی را بهصورت بومی مدیریت کنند SOCKS5 اعتبارنامهها توسط کتابخانه کلاینت مدیریت میشوند نه ابزار مقصد
حداکثر سازگاری کلاینت HTTP بهطور جهانی توسط کتابخانههای HTTP و بیشتر ابزارهای CLI پشتیبانی میشود

اگر همیشه فقط URLهای HTTPS را واکشی میکنید، با HTTP شروع کنید و تنها در صورتی به SOCKS5 سوئیچ کنید که یک ابزار به آن نیاز داشته باشد.

مرحله ۴ — آزمایش اتصال با curl

یک درخواست از طریق پروکسی HTTP بفرستید و IP خروجی را که مقصد میبیند چاپ کنید:

curl -sS --max-time 30 \
  --proxy "http://${SP_PROXY_HOST}:${SP_PROXY_PORT_HTTP}" \
  --proxy-user "${SP_PROXY_USER}:${SP_PROXY_PASS}" \
  'https://api.ipify.org?format=json'

حالا همان نقطه پایانی را روی SOCKS5 آزمایش کنید. گونه --socks5-hostname DNS را در پروکسی حل میکند، که مانع از نشت موقعیت واقعی شما توسط جستجوهای DNS محلی میشود:

curl -sS --max-time 30 \
  --socks5-hostname "${SP_PROXY_HOST}:${SP_PROXY_PORT_SOCKS5}" \
  --proxy-user "${SP_PROXY_USER}:${SP_PROXY_PASS}" \
  'https://api.ipify.org?format=json'

نتیجه را با یک درخواست مستقیم که پروکسی را کاملاً دور میزند مقایسه کنید:

curl -sS 'https://api.ipify.org?format=json'

اگر IP پروکسیشده با IP مستقیم متفاوت باشد، ترافیک از طریق پروکسی خارج میشود. دستور پروکسیشده را چند بار اجرا کنید تا ببینید آیا IP خروجی تغییر میکند؛ این به شما میگوید روی یک نقطه پایانی چرخشی یا چسبنده هستید یا نه.

مرحله ۵ — تثبیت یک نشست چسبنده یا چرخش در هر درخواست

رفتار چرخشی پیشفرض بیشتر نقاط پایانی مسکونی است: هر اتصال جدید ممکن است از IP متفاوتی خارج شود. برای ورود به سیستم، فرمهای چندمرحلهای، یا جریانهای شبیه به تسویه حساب معمولاً میخواهید برای یک توالی کامل از درخواستها همان IP را داشته باشید.

ارائهدهنده شما نامهای کاربری چسبنده را از یک توکن نشست میسازد. توکن را با استفاده از الگوی دقیقی که در تولیدکننده نشست در داشبوردتان نشان داده شده به نام کاربری پروکسی اضافه کنید، که معمولاً به شکل یک پسوند روی نام کاربری است:

export SP_SESSION_ID="$(openssl rand -hex 4)"
export SP_SESSION_USER="${SP_PROXY_USER}-session-${SP_SESSION_ID}"

سپس هرجا دستورات بالا از $SP_PROXY_USER استفاده میکنند، $SP_SESSION_USER را جایگزین کنید. همان توکن را برای طول مدت کار دوباره استفاده کنید، و وقتی میخواهید IP خروجی تازه بگیرید توکن جدید تولید کنید.

هدف رویکرد
جمعآوری بسیاری از صفحات مستقل نام کاربری چرخشی پیشفرض، یک درخواست در هر اتصال
حفظ ورود یا سبد خرید استفاده مجدد از یک توکن نشست برای کل گردش کار
توزیع بار در یک منطقه استفاده از همان توکن نشست با کشور یا شهر ثابت اگر طرح شما آن گزینهها را در داشبورد ارائه میدهد
جداسازی کارگرهای موازی به هر فرایند کارگر توکن نشست تصادفی خودش را بدهید

مرحله ۶ — استفاده از پروکسی در Python

با بارگذاری فایل محیطی، همان متغیرها برای Python در دسترس هستند. این مثال از پروکسی HTTP برای یک درخواست HTTPS استفاده میکند:

import os
from urllib.parse import quote

import requests

host = os.environ['SP_PROXY_HOST']
port = os.environ['SP_PROXY_PORT_HTTP']
user = quote(os.environ['SP_PROXY_USER'], safe='')
password = quote(os.environ['SP_PROXY_PASS'], safe='')

proxies = {
    'http': f'http://{user}:{password}@{host}:{port}',
    'https': f'http://{user}:{password}@{host}:{port}',
}

response = requests.get(
    'https://api.ipify.org?format=json',
    proxies=proxies,
    timeout=30,
)
response.raise_for_status()
print(response.json())

برای سوئیچ به SOCKS5، فقط شِمه و پورت را تغییر دهید. شِمای socks5h حل DNS از راه دور را انجام میدهد، مطابق با curl --socks5-hostname:

socks_port = os.environ['SP_PROXY_PORT_SOCKS5']
socks_proxies = {
    'http': f'socks5h://{user}:{password}@{host}:{socks_port}',
    'https': f'socks5h://{user}:{password}@{host}:{socks_port}',
}

دو نکته عملی:

  • همیشه یک timeout صریح تنظیم کنید. شبکههای پروکسی بزرگ هستند و گرههای خروجی منفرد میتوانند کند یا غیرقابلدسترس باشند، و نبود timeout یک گره بد را به یک فرایند معلق تبدیل میکند.
  • نام کاربری و رمز عبور را درصدی-کدگذاری (percent-encode) کنید، همانطور که با quote() نشان داده شده، زیرا جداکنندههای نشست و کاراکترهای ویژه در صورت ارسال خام URLهای پروکسی را خراب میکنند.

یک پوشش کوچک برای تلاش مجدد اسکریپتها را بسیار مقاومتر میکند:

import requests
from requests.adapters import HTTPAdapter
from urllib3.util.retry import Retry

session = requests.Session()
session.proxies.update(proxies)
session.mount('https://', HTTPAdapter(max_retries=Retry(
    total=3,
    backoff_factor=1,
    status_forcelist=[429, 500, 502, 503, 504],
)))

مرحله ۷ — اجرای بررسی طبق برنامه

قطعه تأیید را بهعنوان ~/scripts/check_proxy.py ذخیره کنید، سپس آن را با cron زمانبندی کنید تا مشکلات اعتبارنامه و نقاط پایانی مرده زودتر آشکار شوند.

# Rotate a log of exit IPs every hour
0 * * * * set -a; . $HOME/.config/smartproxy/env; set +a; $HOME/.venvs/proxy/bin/python $HOME/scripts/check_proxy.py >> $HOME/proxy-check.log 2>&1

همان کار بهصورت سرویس و تایمر systemd، که مانیتور کردنش با journalctl آسانتر است:

# ~/.config/systemd/user/proxy-check.service
[Unit]
Description=Verify proxy exit IP

[Service]
Type=oneshot
EnvironmentFile=%h/.config/smartproxy/env
ExecStart=%h/.venvs/proxy/bin/python %h/scripts/check_proxy.py
# ~/.config/systemd/user/proxy-check.timer
[Unit]
Description=Run the proxy check hourly

[Timer]
OnCalendar=hourly
Persistent=true

[Install]
WantedBy=timers.target

فعال و راهاندازی کنید با:

systemctl --user daemon-reload
systemctl --user enable --now proxy-check.timer
systemctl --user list-timers proxy-check.timer

عیبیابی

نشانه علت احتمالی راهحل
407 Proxy Authentication Required نام کاربری یا رمز عبور اشتباه، یا کاراکترهای ویژهای که URL-encode نشدهاند اعتبارنامهها را از داشبورد دوباره کپی کنید و آنها را با quote() در Python درصدی-کدگذاری کنید
curl: (5) Could not resolve proxy متغیر میزبان خالی یا غلط املایی دارد echo "$SP_PROXY_HOST" را اجرا کنید و فایل env را دوباره source کنید
curl: (7) Failed to connect یا یک timeout پورت توسط فایروال، VPN مسدود شده، یا پورت اشتباه برای محصول است پورت را در داشبورد تأیید کنید و آن را با nc -zv "$SP_PROXY_HOST" "$SP_PROXY_PORT_HTTP" آزمایش کنید
curl: (56) CONNECT tunnel failed گره خروجی اتصال را قطع کرده یا مقصد درخواست را رد کرده است دوباره تلاش کنید، و اگر مداوم اتفاق میافتد همزمانی را کاهش دهید
درخواستها در مرورگر کار میکنند اما در curl روی SOCKS5 شکست میخورند حل DNS محلی بهجای --socks5 از --socks5-hostname استفاده کنید
Python خطای Missing dependencies for SOCKS support میدهد PySocks نصب نشده است venv را فعال کنید و pip install 'requests[socks]' را اجرا کنید
IP خروجی هرگز تغییر نمیکند شما از یک توکن نشست چسبنده دوباره استفاده میکنید برای هر کارگر یک شناسه نشست جدید تولید کنید
IP خروجی برابر با IP خودتان است متغیرهای پروکسی بارگذاری نشدهاند، یا یک ابزار پروکسی را دور زده است فایل env را دوباره source کنید و مقایسه مستقیم در برابر پروکسی را دوباره اجرا کنید

بررسیهای اضافی که هنگام رفتار غیرمنتظره ارزش اجرا دارند:

  1. متغیرهای حلشده را با env | grep SP_PROXY چاپ کنید تا اشتباهات دامنه پوسته را رد کنید.
  2. هر دو پروتکل را آزمایش کنید؛ اگر SOCKS5 کار میکند و HTTP نه، مشکل در پیکربندی کلاینت است نه نقطه پایانی.
  3. IP خروجی را همراه با مهر زمانی در خروجی کار خود ثبت کنید تا بتوانید شکستها را با گرههای خاص مرتبط کنید.

خلاصه

  • Smartproxy پروکسیهای مسکونی و دیتاسنتر را روی HTTP و SOCKS5 با صورتحساب ماهانه ثابت ارائه میدهد، که آن را به یک ارائهدهنده پیشنهادی معقول برای گردشکارهای CLI و اسکریپتنویسی تبدیل میکند.
  • اعتبارنامهها را در یک فایل محیطی با chmod 600 نگه دارید و آنها را با set -a; . file; set +a بارگذاری کنید، نه اینکه در اسکریپتها جاسازی کنید.
  • برای ابزارهای فقط-HTTPS از پروکسی HTTP استفاده کنید و وقتی به فوروارد مستقل از پروتکل یا حل DNS از راه دور نیاز دارید از --socks5-hostname یا socks5h:// استفاده کنید.
  • راهاندازی را با مقایسه یک درخواست پروکسیشده با یک درخواست مستقیم تأیید کنید؛ تطابق IPها یعنی پروکسی دور زده شده است.
  • برای گردشکارهای چسبنده یک توکن نشست به نام کاربری اضافه کنید، و برای کارهای موازی چرخشی برای هر کارگر توکن جدید تولید کنید.
  • همان بررسی را به cron یا یک تایمر systemd وصل کنید تا انقضای اعتبارنامه و نقاط پایانی مرده پیش از شکست یک اجرای تولیدی متوجه شوند.