تبدیل cURL به Python Requests مرحله به مرحله

شما یک درخواست را از DevTools مرورگر خود به صورت یک دستور cURL کپی می‌کنید.

شما هدرها، کوکی‌ها و توکن‌های احراز هویت را دریافت می‌کنید.

اما در نهایت با ۳۰ خط کد شل (shell) نامنظم روبرو می‌شوید. در حالی که شما یک کد پایتون تمیز می‌خواستید.

در اینجا نحوه نگاشت دستی یک دستور cURL به کتابخانه Python requests آورده شده است.

۱. تعیین متد (Method)

اگر --data یا --data-raw را می‌بینید، curl به طور پیش‌فرض از POST استفاده می‌کند. فقط به این دلیل که پرچم -X وجود ندارد، فرض نکنید که درخواست از نوع GET است.

۲. مدیریت هدرها (Headers)

هر پرچم -H به یک ورودی در یک دیکشنری تبدیل می‌شود. هنگام جدا کردن رشته‌ی هدر، فقط بر اساس اولین دو نقطه (colon) جدا کنید. مقادیری مانند URLها یا برچسب‌های زمانی (timestamps) حاوی دو نقطه هستند. اگر بر اساس هر دو نقطه جدا کنید، داده‌ها را خراب خواهید کرد.

۳. مدیریت کوکی‌ها (Cookies)

پرچم -b یک رشته جدا شده با نقطه-ویرگول (semicolon) ارائه می‌دهد. این را در دیکشنری هدرهای خود قرار ندهید. در عوض، آن را به عنوان یک دیکشنری به آرگومان cookies پاس دهید. این کار اجازه می‌دهد تا خودِ کتابخانه عملیات کدگذاری (encoding) را انجام دهد.

۴. استفاده از JSON در مقابل Data

این یک اشتباه رایج است. اگر نوع محتوا (content type) برابر با application/json است، از آرگومان json= استفاده کنید. این کار دیکشنری شما را سریال‌سازی (serialize) کرده و هدر صحیح را برایتان تنظیم می‌کند. اگر از data= استفاده کنید، کتابخانه requests از form-encoding استفاده خواهد کرد. این کار باعث می‌شود API درخواست شما را رد کند.

۵. پاکسازی پارامترها

رشته‌ی پرس‌وجو (query string) را از URL به یک دیکشنری params منتقل کنید. این کار کد شما را خوانا می‌کند. مراقب کدگذاری مضاعف (double-encoding) باشید. اگر URL از قبل کدگذاری شده است، دوباره آن را در دیکشنری خود کدگذاری نکنید.

ساختار نهایی کد به این صورت است:

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.
  • جدا کردن هدرها بر اساس هر دو نقطه.
  • کدگذاری مضاعف پارامترهای پرس‌وجو.

منبع: https://dev.to/wanfeng/from-browser-curl-to-clean-python-requests-code-step-by-step-25oh