العودة إلى المدونة

ماذا تفعل عندما لا يدعم الوكيل البروتوكول المطلوب؟

تحليل أسباب عدم توافق الوكيل مع البروتوكولات وطرق الحل العملية: من إعداد المحولات المحلية إلى الاختيار الصحيح لنوع الوكيل.

📅١٨ جمادى الآخرة ١٤٤٧ هـ
```html

الوكيل لا يدعم البروتوكول المطلوب: ماذا تفعل

لقد قمت بإعداد الوكيل (البروكسي)، وشغّلت السكريبت — وتلقيت خطأ "Protocol not supported" أو "Connection refused". مشكلة عدم توافق البروتوكولات تحدث أكثر مما تتوقع. سنناقش سبب حدوث ذلك وكيفية حل المشكلة دون تغيير مزود الخدمة.

البروتوكولات التي تستخدمها الوكلاء

قبل حل المشكلة، من المهم فهم الاختلاف بين البروتوكولات. لكل منها مجال تطبيق وقيود خاصة به.

البروتوكول المنافذ الافتراضية الميزات
HTTP 80, 8080, 3128 حركة مرور HTTP فقط، يمكنه تعديل الرؤوس (Headers)
HTTPS (CONNECT) 443, 8443 نقل البيانات عبر أمر HTTP CONNECT، تشفير
SOCKS4 1080 اتصالات TCP، بدون مصادقة، بدون UDP
SOCKS5 1080, 1081 يدعم TCP و UDP، مصادقة، تحليل DNS عبر الوكيل

التعارضات الشائعة:

  • Selenium و Puppeteer يتطلبان HTTP/HTTPS، لكن لديك SOCKS5
  • برامج Telegram-bots تعمل عبر SOCKS5، لكن الوكيل يدعم HTTP فقط
  • عملاء التورنت يتطلبون SOCKS5 مع UDP، لكن الوكيل هو SOCKS4
  • تطبيقات الألعاب تتطلب UDP، لكن وكلاء HTTP لا يدعمونها

التشخيص: تحديد بروتوكول الوكيل

إذا لم يحدد الموفر البروتوكول صراحةً أو كنت غير متأكد، تحقق من الوكيل بنفسك.

الاختبار باستخدام curl

اختبار بروتوكول HTTP:

# وكيل HTTP
curl -x http://proxy_ip:port http://httpbin.org/ip

# مع المصادقة
curl -x http://user:pass@proxy_ip:port http://httpbin.org/ip

اختبار SOCKS5:

# وكيل SOCKS5
curl -x socks5://proxy_ip:port http://httpbin.org/ip

# SOCKS5 مع تحليل DNS عبر الوكيل (socks5h)
curl -x socks5h://proxy_ip:port http://httpbin.org/ip

إذا أعادت الأوامر عنوان IP الخاص بالوكيل، فهذا يعني أن البروتوكول محدد بشكل صحيح. إذا ظهر خطأ Connection refused أو Unsupported proxy، فالبروتوكول غير صحيح.

الاختبار عبر Python

import requests

proxy_ip = "proxy_ip:port"

# اختبار HTTP
try:
    r = requests.get("http://httpbin.org/ip", 
                     proxies={"http": f"http://{proxy_ip}"}, 
                     timeout=10)
    print(f"HTTP يعمل: {r.json()}")
except Exception as e:
    print(f"HTTP لا يعمل: {e}")

# اختبار SOCKS5 (يتطلب pip install requests[socks])
try:
    r = requests.get("http://httpbin.org/ip", 
                     proxies={"http": f"socks5://{proxy_ip}"}, 
                     timeout=10)
    print(f"SOCKS5 يعمل: {r.json()}")
except Exception as e:
    print(f"SOCKS5 لا يعمل: {e}")

الكشف التلقائي

سكريبت لتجربة البروتوكولات:

import requests

def detect_protocol(proxy_address):
    protocols = ["http", "https", "socks4", "socks5", "socks5h"]
    
    for proto in protocols:
        try:
            proxies = {
                "http": f"{proto}://{proxy_address}",
                "https": f"{proto}://{proxy_address}"
            }
            r = requests.get("http://httpbin.org/ip", 
                           proxies=proxies, timeout=5)
            if r.status_code == 200:
                return proto
        except:
            continue
    return None

result = detect_protocol("proxy_ip:port")
print(f"البروتوكول المكتشف: {result}")

تحويل HTTP إلى SOCKS والعكس

إذا كان الوكيل يدعم بروتوكولاً مختلفاً عما يحتاجه برنامجك، استخدم محولاً محلياً.

Privoxy: HTTP ← SOCKS

يقبل Privoxy طلبات HTTP ويوجهها عبر وكيل SOCKS.

التثبيت:

# Ubuntu/Debian
sudo apt install privoxy

# macOS
brew install privoxy

# Windows — تحميل من الموقع الرسمي

الإعداد (ملف /etc/privoxy/config):

# الاستماع على المنفذ المحلي 8118 (HTTP)
listen-address 127.0.0.1:8118

# التوجيه عبر وكيل SOCKS5 الخارجي
forward-socks5 / socks_proxy_ip:1080 .

# مع المصادقة
forward-socks5 / user:pass@socks_proxy_ip:1080 .

الآن، يتصل برنامجك بـ 127.0.0.1:8118 عبر HTTP، ويتم توجيه حركة المرور عبر SOCKS5.

Gost: محول عالمي

Gost أداة قوية لأي تحويلات بروتوكول.

# وكيل HTTP كمدخل ← SOCKS5 كمخرج
gost -L http://:8080 -F socks5://socks_proxy_ip:1080

# وكيل SOCKS5 كمدخل ← HTTP كمخرج
gost -L socks5://:1080 -F http://http_proxy_ip:8080

# مع المصادقة على كلا الطرفين
gost -L http://local_user:local_pass@:8080 \
     -F socks5://remote_user:remote_pass@proxy_ip:1080

محول Python

محول بسيط للمهام الأساسية:

# pip install pproxy
# HTTP كمدخل، SOCKS5 كمخرج
pproxy -l http://:8080 -r socks5://proxy_ip:1080

# SOCKS5 كمدخل، HTTP كمخرج  
pproxy -l socks5://:1080 -r http://proxy_ip:8080

إعداد الأنفاق المحلية

في بعض الأحيان، لا يكفي التحويل؛ أنت بحاجة إلى نفق كامل.

نفق SSH عبر وكيل HTTP

إذا كان لديك خادم SSH ووكيل HTTP، يمكنك إنشاء SOCKS5:

# إنشاء SOCKS5 على localhost:1080 عبر وكيل HTTP
ssh -D 1080 -o ProxyCommand="nc -X connect -x http_proxy:8080 %h %p" user@ssh_server

Stunnel لـ HTTPS

إذا كنت بحاجة إلى وكيل HTTPS ولديك وكيل HTTP فقط:

# stunnel.conf
[https-proxy]
client = yes
accept = 127.0.0.1:8443
connect = http_proxy_ip:8080
protocol = connect
protocolHost = target_host:443

تكوين البرامج لدعم البروتوكول المتاح

في بعض الأحيان يكون من الأسهل تكوين البرنامج لدعم البروتوكول المتاح بدلاً من تحويله.

Selenium مع بروتوكولات مختلفة

from selenium import webdriver
from selenium.webdriver.chrome.options import Options

# وكيل HTTP (الطريقة القياسية)
options = Options()
options.add_argument('--proxy-server=http://proxy_ip:8080')

# وكيل SOCKS5
options.add_argument('--proxy-server=socks5://proxy_ip:1080')

# لمتصفح Firefox مع SOCKS5
from selenium.webdriver.firefox.options import Options as FirefoxOptions
profile = webdriver.FirefoxProfile()
profile.set_preference("network.proxy.type", 1)
profile.set_preference("network.proxy.socks", "proxy_ip")
profile.set_preference("network.proxy.socks_port", 1080)
profile.set_preference("network.proxy.socks_version", 5)

aiohttp مع SOCKS

# pip install aiohttp-socks
import aiohttp
from aiohttp_socks import ProxyConnector

async def fetch_with_socks():
    connector = ProxyConnector.from_url('socks5://proxy_ip:1080')
    async with aiohttp.ClientSession(connector=connector) as session:
        async with session.get('http://httpbin.org/ip') as response:
            return await response.json()

برامج Telegram-bots عبر HTTP

إذا كانت مكتبة Telegram تتطلب SOCKS5، ولكن لديك HTTP:

# python-telegram-bot مع وكيل HTTP
from telegram.ext import ApplicationBuilder

application = (
    ApplicationBuilder()
    .token("YOUR_TOKEN")
    .proxy_url("http://proxy_ip:8080")  # يعمل مع HTTP
    .build()
)

نصيحة: العديد من المكتبات الحديثة تدعم كلا البروتوكولين. تحقق من الوثائق — قد يكون تغيير مخطط URL من socks5:// إلى http:// كافياً.

كيفية اختيار وكيل بالبروتوكول المطلوب

لتجنب مشاكل البروتوكولات، حدد المتطلبات مسبقاً.

مصفوفة التوافق

المهمة البروتوكول الموصى به السبب
كشط الويب (Web Scraping) HTTP/HTTPS دعم واسع، إعداد بسيط
أتمتة المتصفح HTTP أو SOCKS5 يعتمد على المتصفح والإطار المستخدم
برامج Telegram, Discord Bots SOCKS5 متطلبات المكتبات
التورنت SOCKS5 مع UDP DHT و PEX تستخدم UDP
الألعاب، الاتصال الصوتي (VoIP) SOCKS5 مع UDP زمن استجابة منخفض، حركة مرور UDP
استدعاءات API HTTP/HTTPS تعمل واجهات REST API عبر HTTP

ما الذي يجب البحث عنه عند اختيار الموفر

  • قائمة البروتوكولات المدعومة — يجب أن تكون مذكورة بوضوح
  • إمكانية التبديل — بعض الموفرين يتيحون الوصول إلى نفس IP عبر منافذ/بروتوكولات مختلفة
  • دعم UDP لـ SOCKS5 — ليست كل وكلاء SOCKS5 تدعم UDP
  • وثائق الإعداد — أمثلة للغات وأدوات مختلفة

الوكلاء السكنية (Residential Proxies) عادةً ما تدعم HTTP/HTTPS و SOCKS5 في نفس الوقت، مما يزيل معظم مشاكل التوافق. أما وكلاء مراكز البيانات (Datacenter Proxies) فغالباً ما تقتصر على HTTP/HTTPS.

قائمة التحقق قبل الشراء

  1. حدد البروتوكول الذي يتطلبه برنامجك
  2. تحقق مما إذا كنت بحاجة إلى UDP (للألعاب، التورنت، VoIP)
  3. استفسر من الموفر عن دعم البروتوكول المطلوب
  4. اطلب وصولاً تجريبياً للتحقق من التوافق
  5. جهز خطة بديلة — محول محلي

الخلاصة

عدم توافق البروتوكولات مشكلة قابلة للحل. في معظم الحالات، يكون المحول المحلي مثل Privoxy أو Gost كافياً. بالنسبة للمشاريع طويلة الأمد، من الأفضل اختيار وكيل يدعم البروتوكول المطلوب مباشرة.

للمهام التي تتطلب مرونة في اختيار البروتوكول، تعتبر الوكلاء السكنية ذات الوصول متعدد البروتوكولات خياراً جيداً — تعرف على المزيد على proxycove.com.

```