بروكسي سوري للمطورين: الاختبار والمراقبة من داخل سوريا
هذا المقال لمن يبني برنامجاً يحتاج أن تخرج بعض طلباته من سوريا. ستجد فيه متى يفيدك ذلك، وكيف تحفظ بيانات الاتصال خارج الكود، وأمثلة لـ httpx وNode.js وPlaywright، وكيف تتعامل مع شبكة خلوية في المهلات وإعادة المحاولة. أوامر curl ومكتبة requests موجودة في بروكسي سوري للبرامج والسكربتات، فلن نكررها هنا.
متى يحتاج مشروعك عنواناً سورياً
- اختبار ما يراه المستخدم في سوريا. تطبيقك أو موقعك قد يتصرف بحسب البلد: لغة افتراضية، عملة، محتوى مخفي أو ظاهر، أو حجب من شبكة توزيع المحتوى. الطلب من عنوان سوري يريك النتيجة كما تصل إلى مستخدميك هناك.
- التأكد من أن خدمة سورية تتكامل معها تجيب. بعض الخدمات السورية لا تجيب إلا على طلبات من داخل البلد. من الخارج لا تعرف هل المشكلة في كودك أم في الوصول.
- مراقبة التوفر من داخل سوريا. فحص دوري لموقعك أو لواجهتك البرمجية من عنوان سوري يكشف انقطاعاً لا تراه أدوات المراقبة العالمية.
- ضمان الجودة للمحتوى الخاص بالمنطقة. قبل الإطلاق، يمرّ فريق الاختبار على الصفحات والعروض المخصّصة لسوريا بعنوان سوري حقيقي، لا بعنوان مسجّل باسم سوريا على خادم في بلد آخر. الفرق مشروح في العنوان الخلوي وعنوان مركز البيانات.
بيانات الاتصال خارج الكود
اسم المستخدم وكلمة المرور تجدهما في «الاتصال» داخل حسابك. لا تكتبهما في ملف يدخل المستودع. ضعهما في ملف .env وأضفه إلى .gitignore:
# .env (listed in .gitignore) SYRIA_PROXY=http://USER:PASS@gw.syriaproxy.com:2080
كثير من الأدوات تقرأ المتغيرين HTTPS_PROXY وALL_PROXY تلقائياً، ومنها curl وrequests وhttpx. لكن ضبطهما في الطرفية يمرّر كل طلبات تلك الأدوات عبر سوريا. لذلك اسم خاص مثل SYRIA_PROXY تقرؤه في الكود أوضح، لأنك تختار بنفسك ما يمر عبر البروكسي.
إن كانت كلمة المرور تحتوي رموزاً مثل @ أو : أو /، فرمّزها بترميز الروابط (percent-encoding) قبل وضعها في الرابط. وإن تسرّب الملف، اضغط «كلمة مرور جديدة» في حسابك.
Python مع httpx
الشبكة خلوية، فامنح الطلب مهلة أطول مما تعطيه لخادم في مركز بيانات، وأعد المحاولة بانتظار يتضاعف بعد كل فشل:
import os
import time
import httpx
PROXY = os.environ["SYRIA_PROXY"]
TIMEOUT = httpx.Timeout(60.0, connect=20.0)
def fetch(client, url, attempts=4):
for i in range(attempts):
try:
r = client.get(url)
if r.status_code < 500 or i == attempts - 1:
return r
except httpx.TransportError:
if i == attempts - 1:
raise
time.sleep(2 ** i) # 1, 2, 4 seconds
with httpx.Client(proxy=PROXY, timeout=TIMEOUT) as client:
print(fetch(client, "https://api.ipify.org").text)
أعد المحاولة تلقائياً للطلبات التي لا يضر تكرارها، مثل القراءة والفحص. أما الطلب الذي ينشئ شيئاً أو يرسل مالاً، فقد يكون نُفّذ قبل انقطاع الرد، فتحقق من حالته قبل إرساله مرة ثانية.
Node.js
ثبّت المكتبتين بالأمر npm install undici socks-proxy-agent. مع fetch استخدم ProxyAgent من undici ومرّره في dispatcher:
import { fetch, ProxyAgent } from "undici";
const dispatcher = new ProxyAgent(process.env.SYRIA_PROXY);
// SYRIA_PROXY=http://USER:PASS@gw.syriaproxy.com:2080
const res = await fetch("https://api.ipify.org", {
dispatcher,
signal: AbortSignal.timeout(60_000),
});
console.log(await res.text());
ولمكتبات تعتمد على http.Agent مثل وحدة https المدمجة، استخدم SocksProxyAgent. البادئة socks5h تجعل أسماء المواقع تُحلّ في سوريا:
import https from "node:https";
import { SocksProxyAgent } from "socks-proxy-agent";
const agent = new SocksProxyAgent("socks5h://USER:PASS@gw.syriaproxy.com:2080");
const req = https.get("https://api.ipify.org", { agent, timeout: 60_000 }, (res) => {
res.setEncoding("utf8");
res.on("data", (chunk) => process.stdout.write(chunk));
});
req.on("timeout", () => req.destroy(new Error("timeout")));
req.on("error", console.error);
Playwright
متصفح كروميوم لا يدعم SOCKS5 مع اسم مستخدم وكلمة مرور، فاستخدم معه HTTP على المنفذ نفسه وضع البيانات في حقلين منفصلين:
from playwright.sync_api import sync_playwright
with sync_playwright() as p:
browser = p.chromium.launch(proxy={
"server": "http://gw.syriaproxy.com:2080",
"username": "USER",
"password": "PASS",
})
page = browser.new_page()
page.set_default_timeout(60_000)
page.route("**/*", lambda route: route.abort()
if route.request.resource_type in ("image", "media", "font")
else route.continue_())
page.goto("https://api.ipify.org")
print(page.inner_text("body"))
browser.close()
سطر page.route يمنع تحميل الصور والفيديو والخطوط. احذفه إن كان اختبارك يحتاج الصفحة كاملة.
جلسة ثابتة أم عنوان متغيّر
«نوع العنوان» في حسابك يحدد سلوك اسم المستخدم الأساسي. اختر «ثابت» إن كان اختبارك يسجّل الدخول أو يمر بعدة خطوات يجب أن تأتي من العنوان نفسه، واختر «متغيّر» إن أردت أن يتبدّل العنوان بين الطلبات.
وإن شغّلت عدة عمّال معاً وأردت لكل واحد عنواناً ثابتاً خاصاً به، فافتح «مولّد البروكسي»، واختر مع «ثابت» مدة ثبات بين 10 و120 دقيقة أطول من مدة المهمة. انسخ الأسطر التي يعطيك إياها كما هي، ولا تركّب أسماء المستخدمين بنفسك. وعدد الاتصالات المتزامنة لكل حساب محدود، فأعد استخدام الاتصالات بدل فتح اتصال جديد لكل طلب. التفاصيل في الحفاظ على عنوان سوري ثابت.
الاستهلاك يُحتسب بالغيغابايت
كل بايت يمر عبر البروكسي، مرسلاً أو مستقبلاً، يُحتسب من الرصيد (الأسعار). فمرّر عبره الطلبات التي تحتاج عنواناً سورياً فقط، ودع تنزيل الحزم والتحديثات وطلبات خدماتك الأخرى على اتصالك العادي. وفي المراقبة اطلب صفحة صغيرة أو نقطة فحص خفيفة بدل الصفحة الرئيسية كاملة. تقديرات الاستهلاك في كم غيغابايت تحتاج.
حدود الاستخدام
- منافذ البريد 25 و465 و587 مغلقة، فلا يمكن إرسال البريد عبر الخدمة.
- سحب البيانات بكثافة وتخطي حدود الطلبات أو أنظمة كشف الروبوتات ممنوع، وكذلك ما تذكره سياسة الاستخدام المقبول.
- لا تبع الوصول ولا تضع بيانات حسابك داخل برنامج توزّعه على غيرك. كل مستخدم لبرنامجك يحتاج حسابه الخاص.
أسئلة
هل أختار HTTP أم HTTPS في الكود؟
المنفذ 2443 يشفّر الطريق بين جهازك وخادمنا مع كلمة المرور، فاختره حين تدعمه مكتبتك. HTTP على 2080 يعمل مع عدد أكبر من الأدوات، ويبقى محتوى مواقع https محمياً بتشفيرها.
كيف أعرف أن الطلب خرج فعلاً من سوريا؟
اجعل أول خطوة في الاختبار طلباً إلى خدمة تعرض العنوان، وسجّل الناتج في سجل الاختبار. إن ظهر عنوانك الحقيقي، فالمكتبة تتجاهل إعداد البروكسي لذلك الطلب.
هل يمكن تشغيل هذا في خط التكامل المستمر؟
نعم. ضع الرابط في أسرار خط التكامل (secrets) لا في ملف الإعداد، ولا تطبعه في السجلات، فسجلات التشغيل يراها غالباً كل من يصل إلى المستودع.
أنشئ حساباً وانسخ بيانات الاتصال لتجرّب أول طلب من سوريا في مشروعك.