Pack Camo

محول cURL إلى كود

حوّل أمر curl إلى fetch وaxios وPython requests وGo وPHP والمزيد.

كل شيء يعمل محليًا — لا يُرفع أي شيء.

أمر curl

POST api.example.com

fetch

23 سطرًا

// Browsers do not let scripts set Cookie; fetch ignores them.
const response = await fetch("https://api.example.com/v1/orders?expand=items", {
  method: "POST",
  headers: {
    "Content-Type": "application/json",
    Authorization: "Bearer sk_test_4eC39HqLyjWDarjtT1zdp7dc",
    Cookie: "session=abc123; theme=dark",
  },
  body: JSON.stringify({
    "customer": "cus_42",
    "items": [
      {
        "sku": "TSHIRT-M",
        "qty": 2
      }
    ],
    "gift": false,
    "note": null
  }),
  signal: AbortSignal.timeout(30000),
});

console.log(response.status, await response.text());

الصق أمر curl واحصل على كود يعمل

يحوّل هذا المحول أمر curl إلى طلب HTTP نفسه بلغة JavaScript fetch أو axios أو Node.js أو Python requests أو Go net/http أو امتداد curl في PHP أو Rust reqwest. يقرأ curl بالطريقة نفسها التي تقرؤه بها الصدفة (shell) وcurl نفسه: علامات الاقتباس المفردة والمزدوجة، وسلاسل $'…'، ومتابعة الأسطر، والخيارات المدمجة مثل -sSL، وبيانات -d المتكررة، وحقول multipart ‏-F. تُنقل الترويسات وملفات تعريف الارتباط ومصادقة basic وbearer ونصوص JSON والمهل الزمنية وإعدادات TLS، ويُشار إلى كل ما لا يمكن تحويله. يُحلَّل الأمر في متصفحك ولا يُرسل إلى أي مكان، لذا تبقى الرموز المميزة (tokens) وملفات تعريف الارتباط التي فيه خاصة.

كيفية تحويل أمر curl إلى كود

  1. 1انسخ طلبًا بصيغة curl. في Chrome أو Edge أو Firefox، افتح أدوات المطوّر، وانتقل إلى علامة التبويب Network، وانقر بزر الفأرة الأيمن على طلب واختر Copy › Copy as cURL. تعمل نسخة bash ونسخة cmd في Windows كلتاهما.
  2. 2الصق الأمر في اللوحة اليسرى. الأوامر متعددة الأسطر التي تستخدم \ أو ^ للمتابعة مقبولة.
  3. 3اختر اللغة الهدف: fetch أو axios أو Node.js أو Python أو Go أو PHP أو Rust، أو JSON لرؤية الطلب بعد تحليله.
  4. 4اقرأ الملاحظات أسفل الكود حول الخيارات التي تم تجاهلها أو التي تحتاج إلى انتباه، ثم انسخ الكود أو نزّله كملف.

ما الذي يتم تحويله

الطريقة وURL
-X/--request و--url و-G/--get (تُنقل البيانات إلى سلسلة الاستعلام) و-I/--head و-T/--upload-file ‏(PUT). من دون -X تُختار الطريقة كما يختارها curl: ‏POST عند وجود نص للطلب، وGET في غير ذلك.
الترويسات
-H/--header و-A/--user-agent و-e/--referer و-b/--cookie و-r/--range. تُدمج الترويسات المكررة.
نصوص الطلب
-d/--data و--data-raw و--data-binary و--data-urlencode (تُضم بعلامة & كما يفعل curl)، و--json، وحقول multipart ‏-F/--form بما فيها رفع الملفات مع ;type= و;filename=.
المصادقة
-u/--user لمصادقة basic، و--digest، و--oauth2-bearer، وبيانات الاعتماد المكتوبة في URL.
خيارات الاتصال
-k/--insecure و-L/--location و--compressed و-m/--max-time و-x/--proxy، حيثما يوجد لها مقابل في اللغة الهدف.

نصوص JSON تصبح كائنات حقيقية

عندما يكون نص الطلب بصيغة JSON، إما لأن Content-Type يقول ذلك أو لأنه JSON بوضوح، يُنسَّق، وحيث تسمح اللغة يُكتب كقيمة أصلية: كائن يُمرَّر إلى JSON.stringify في fetch، وكائن عادي في axios، وقاموس يُمرَّر كـ json= في Python requests، مع تحويل true وfalse وnull إلى True وFalse وNone. هذا أسهل بكثير في التعديل من سلسلة نصية مُهرَّبة. أوقف تنسيق نصوص JSON للإبقاء على نص الطلب كما هو بايتًا ببايت.

fetch في المتصفح مقابل Node.js

يختلف هدفا fetch لأن المتصفحات تقيّد ما يمكن للصفحة إرساله. لا يستطيع سكربت في المتصفح ضبط Cookie أو Referer أو Host أو Accept-Encoding أو أي ترويسة Sec-، ولا تخطي التحقق من الشهادات، ولا قراءة الملفات من مسار. يوضّح هدف المتصفح الترويسات التي ستُحذف. أما هدف Node.js فيستطيع فعل كل ذلك: تُقرأ الملفات بـ openAsBlob وreadFile، ويصبح --insecure أو الوكيل (proxy) مُوزِّع undici ‏(dispatcher).

لمعرفة معنى حالة الاستجابة بعد تنفيذ الطلب، راجع مرجع رموز حالة HTTP. ويمكن ترميز قيم الاستعلام التي تحتاج إلى تهريب باستخدام أداة ترميز URL.

قواعد الاقتباس محسوبة

تأتي معظم أخطاء التحويل من علامات الاقتباس. في صدفة POSIX تُبقي علامات الاقتباس المفردة كل شيء حرفيًا، وتظل المزدوجة تعالج \" و\$، ويفهم $'…' التهريبات مثل \n و\x41. والشرطة المائلة العكسية في نهاية السطر تُكمل الأمر. أما cmd في Windows فيستخدم ^ بدلًا من ذلك للتهريب والمتابعة، وهذا ما يُنتجه "Copy as cURL (cmd)". يتبع المُجزِّئ (tokenizer) كل هذه القواعد، لذا فإن نص الطلب الذي يرسله كودك هو بالضبط النص الذي كان curl سيرسله.

كل ما يأتي بعد أنبوب (pipe) أو فاصلة منقوطة أو إعادة توجيه، مثل | jq .، يخص الصدفة لا curl، ويُتجاهل مع ملاحظة.

الأسئلة الشائعة

هل يُرسل أمر curl الخاص بي إلى خادم؟
لا. يُحلَّل الأمر ويُنشأ الكود في متصفحك. لا تغادر الرموز المميزة وملفات تعريف الارتباط وكلمات المرور التي فيه جهازك أبدًا.
كيف أنسخ طلبًا بصيغة curl من المتصفح؟
افتح أدوات المطوّر (F12)، واختر علامة التبويب Network، وانقر بزر الفأرة الأيمن على الطلب واختر Copy ثم Copy as cURL. في Windows يمكنك لصق نسخة bash أو نسخة cmd هنا.
ما خيارات curl المدعومة؟
الخيارات التي تحدد الطلب: الطريقة وURL والترويسات وملفات تعريف الارتباط وكل صيغ -d و--json ونماذج -F ومصادقة -u و-G و-I و-T و-L و-k و--compressed و--max-time و--proxy. خيارات الإخراج مثل -s و-o و-v لا تؤثر في الطلب وتُتجاهل.
لماذا يحذف كود fetch للمتصفح بعض الترويسات؟
تمنع المتصفحات السكربتات من ضبط ترويسات مثل Cookie وReferer وHost وAccept-Encoding، ويحذفها fetch بصمت. استخدم هدف Node.js إذا كنت بحاجة إلى إرسالها.
كيف يتم تحويل رفع الملفات؟
يصبح حقل -F مثل file=@photo.jpg حقل ملف multipart يقرأ photo.jpg من القرص في Node.js وPython وGo وPHP وRust. وفي fetch للمتصفح يستخدم ملفًا يُختار عبر <input type="file">، لأن الصفحات لا تستطيع قراءة الملفات من مسار.
ماذا يفعل --data-urlencode؟
يرمّز القيمة بترميز النسبة المئوية (percent-encoding) قبل إرسالها، فيُرسل name=a b&c على شكل name=a%20b%26c. يطبّق المحول الترميز نفسه، فيرسل الكود الناتج البايتات نفسها.
هل يتبع curl عمليات إعادة التوجيه؟
لا، إلا إذا مررت -L. تتبع معظم مكتبات HTTP إعادة التوجيه افتراضيًا، لذا يتبعها الكود الناتج عادةً في كل الأحوال؛ أما امتداد curl في PHP فلا يتبعها إلا عند تمرير -L.