تحويل cURL إلى Python Requests خطوة بخطوة

تقوم بنسخ طلب من أدوات المطور (DevTools) في متصفحك كأمر cURL.

تحصل على الرؤوس (headers)، وملفات تعريف الارتباط (cookies)، ورموز المصادقة (auth tokens).

ولكن ينتهي بك الأمر بـ 30 سطرًا من كود shell فوضوي، بينما كنت تريد كود Python نظيفًا.

إليك كيفية تحويل أمر cURL إلى مكتبة Python requests يدويًا.

  1. تحديد الطريقة (Method) إذا رأيت --data أو --data-raw فإن curl يستخدم POST افتراضيًا. لا تفترض أنه طلب GET لمجرد أن العلم -X مفقود.

  2. التعامل مع الرؤوس (Headers) كل علم -H يصبح مدخلًا في قاموس (dictionary). عند تقسيم سلسلة الرأس (header string)، قم بالتقسيم عند أول نقطتين رأسيتين (colon) فقط. تحتوي القيم مثل الروابط (URLs) أو الطوابع الزمنية (timestamps) على نقطتين رأسيتين؛ فإذا قمت بالتقسيم عند كل نقطتين رأسيتين، ستتلف البيانات.

  3. إدارة ملفات تعريف الارتباط (Cookies) يوفر العلم -b سلسلة مفصولة بفاصلة منقوطة. لا تضع هذه السلسلة في قاموس الرؤوس الخاص بك. بدلاً من ذلك، مررها إلى الوسيط cookies كقاموس. هذا يسمح للمكتبة بالتعامل مع الترميز (encoding).

  4. استخدام JSON مقابل Data هذا خطأ شائع. إذا كان نوع المحتوى (content type) هو application/json فاستخدم الوسيط json=. سيقوم هذا بتحويل القاموس الخاص بك إلى سلسلة (serialization) ويضبط الرأس الصحيح لك. إذا استخدمت data=، فستستخدم requests ترميز النموذج (form-encoding)، مما سيؤدي إلى رفض واجهة برمجة التطبيقات (API) لطلبك.

  5. تنظيف المعلمات (Parameters) انقل سلسلة الاستعلام (query string) من الرابط (URL) إلى قاموس params. هذا يجعل الكود الخاص بك قابلاً للقراءة. احذر من الترميز المزدوج (double-encoding)؛ فإذا كان الرابط مشفرًا بالفعل، فلا تقم بتشفيره مرة أخرى في القاموس الخاص بك.

تبدو بنية الكود النهائية كما يلي:

import requests

url = "https://api.example.com/v2/search"
params = {"lang": "en", "page": "2"}
headers = {
    "accept": "application/json",
    "authorization": "Bearer token_here",
    "referer": "https://app.example.com/dashboard",
}
cookies = {"session": "abc123"}
payload = {"q": "nginx"}

resp = requests.post(
    url,
    params=params,
    headers=headers,
    cookies=cookies,
    json=payload,
)

resp.raise_for_status()
print(resp.json())

فخاخ شائعة يجب تجنبها:

  • الخلط بين files= و data= أثناء عمليات الرفع متعددة الأجزاء (multipart uploads).
  • تقسيم الرؤوس (headers) عند كل نقطتين رأسيتين.
  • الترميز المزدوج لمعلمات الاستعلام (query parameters).

المصدر: https://dev.to/wanfeng/from-browser-curl-to-clean-python-requests-code-step-by-step-25oh