🐍 کتابخانه مرجع پایتون

🌐 کار با APIها با کتابخانه requests

کتابخانه requests یکی از محبوب‌ترین و ساده‌ترین کتابخانه‌های پایتون برای ارسال درخواست‌های HTTP و کار با APIها است. با استفاده از این کتابخانه می‌توانید به راحتی داده‌ها را از وب‌سرویس‌ها دریافت کنید، به سرورها داده ارسال کنید و با APIهای مختلف کار کنید.

🔹 نصب و import

# نصب (در محیط واقعی)
# pip install requests

# import کردن
import requests

# بررسی نسخه
print(requests.__version__)

🔹 GET درخواست ساده

import requests

# ارسال درخواست GET
response = requests.get("https://api.github.com/events")

# بررسی وضعیت
print(f"Status Code: {response.status_code}")  # 200 = OK

# محتوای پاسخ
print(f"Response type: {type(response.json())}")  # list

# نمایش اولین رویداد
events = response.json()
print(f"First event: {events[0]['type']}")

🔹 GET با پارامترها

import requests

# پارامترهای جستجو
params = {
    "q": "python",
    "sort": "stars",
    "order": "desc",
    "per_page": 5
}

# ارسال درخواست با پارامترها
response = requests.get("https://api.github.com/search/repositories", params=params)

# مشاهده URL نهایی
print(f"Final URL: {response.url}")
print(f"Status: {response.status_code}")

# نمایش نتایج
data = response.json()
print(f"Total repositories: {data['total_count']}")

for repo in data['items'][:3]:
    print(f"  {repo['name']} - {repo['stargazers_count']} stars")

🔹 POST درخواست

import requests

# داده‌های ارسالی
data = {
    "title": "My New Post",
    "body": "This is the content of my post.",
    "userId": 1
}

# ارسال درخواست POST با json
response = requests.post(
    "https://jsonplaceholder.typicode.com/posts",
    json=data
)

print(f"Status: {response.status_code}")  # 201 Created
print("Response:")
print(response.json())

🔹 Headerها و User-Agent

import requests

# تنظیم headerها
headers = {
    "User-Agent": "MyPythonApp/1.0",
    "Accept": "application/json"
}

response = requests.get(
    "https://api.github.com/users/octocat",
    headers=headers
)

print(f"Status: {response.status_code}")
print(f"User Agent sent: {response.request.headers['User-Agent']}")

# نمایش اطلاعات کاربر
user = response.json()
print(f"Name: {user.get('name')}")
print(f"Public repos: {user.get('public_repos')}")

🔹 مدیریت خطاها

import requests
from requests.exceptions import RequestException, HTTPError, ConnectionError, Timeout

url = "https://api.github.com/user"

try:
    # درخواست با timeout
    response = requests.get(url, timeout=(5, 10))
    
    # بررسی status code
    response.raise_for_status()  # اگر status > 400 باشد، خطا می‌دهد
    
    data = response.json()
    print("Request successful!")
    print(data)
    
except Timeout:
    print("⏰ Request timed out!")
    
except ConnectionError:
    print("🔌 Connection error!")
    
except HTTPError as e:
    print(f"❌ HTTP error: {e}")
    print(f"Status code: {response.status_code}")
    
except RequestException as e:
    print(f"⚠️ Request error: {e}")

🔹 PUT و DELETE درخواست‌ها

import requests

# PUT: به‌روزرسانی کامل
updated_data = {
    "id": 1,
    "title": "Updated Title",
    "body": "Updated content.",
    "userId": 1
}

response = requests.put(
    "https://jsonplaceholder.typicode.com/posts/1",
    json=updated_data
)

print(f"PUT Status: {response.status_code}")
print("PUT Response:", response.json())

# DELETE: حذف
response = requests.delete("https://jsonplaceholder.typicode.com/posts/1")
print(f"DELETE Status: {response.status_code}")  # 200 OK
print(f"DELETE Response: {response.text}")

🔹 Session (نشست) برای حفظ اطلاعات

import requests

# ایجاد نشست
session = requests.Session()

# تنظیم header عمومی برای همه درخواست‌ها
session.headers.update({
    "User-Agent": "MyApp/1.0",
    "Accept": "application/json"
})

# ارسال درخواست با نشست
response1 = session.get("https://api.github.com/users/octocat")
response2 = session.get("https://api.github.com/users/defunkt")

print(f"User 1: {response1.json()['login']}")
print(f"User 2: {response2.json()['login']}")

# بستن نشست
session.close()

🔹 Authentication (احراز هویت)

import requests
from requests.auth import AuthBase

# روش ۱: Basic Authentication
response = requests.get(
    "https://api.github.com/user",
    auth=("username", "password")  # واقعاً از توکن استفاده کنید
)
print(f"Basic Auth Status: {response.status_code}")

# روش ۲: Token Authentication (سفارشی)
class TokenAuth(AuthBase):
    def __init__(self, token):
        self.token = token
    
    def __call__(self, request):
        request.headers["Authorization"] = f"Bearer {self.token}"
        return request

# استفاده از TokenAuth
# token = "your_github_token_here"
# response = requests.get(
#     "https://api.github.com/user",
#     auth=TokenAuth(token)
# )
# print(f"Token Auth Status: {response.status_code}")

print("Note: Replace with actual token for real authentication.")

🔹 دانلود فایل با requests

import requests

# دانلود تصویر
url = "https://via.placeholder.com/150"

response = requests.get(url, stream=True)

if response.status_code == 200:
    # ذخیره در فایل
    with open("image.png", "wb") as file:
        for chunk in response.iter_content(chunk_size=128):
            file.write(chunk)
    print("✅ Image downloaded successfully!")
else:
    print(f"❌ Failed to download: {response.status_code}")

🔹 Timeout و Retry

import requests
from requests.adapters import HTTPAdapter
from requests.exceptions import RetryError

# ایجاد نشست با retry
session = requests.Session()

# تنظیم retry
retries = HTTPAdapter(max_retries=3)
session.mount("http://", retries)
session.mount("https://", retries)

try:
    # timeout: (connect_timeout, read_timeout)
    response = session.get(
        "https://httpbin.org/delay/2",
        timeout=(2, 5)  # 2 ثانیه برای اتصال، 5 ثانیه برای خواندن
    )
    print(f"Status: {response.status_code}")
    
except requests.exceptions.Timeout:
    print("⏰ Request timed out!")
    
except RetryError:
    print("❌ Retry limit exceeded!")
    
finally:
    session.close()

🔹 مثال جامع: کلاینت GitHub API

import requests

class GitHubClient:
    """کلاینت ساده برای GitHub API"""
    
    def __init__(self, token=None):
        self.base_url = "https://api.github.com"
        self.session = requests.Session()
        self.session.headers.update({
            "User-Agent": "MyGitHubApp/1.0",
            "Accept": "application/vnd.github.v3+json"
        })
        if token:
            self.session.headers.update({
                "Authorization": f"token {token}"
            })
    
    def get_user(self, username):
        """دریافت اطلاعات یک کاربر"""
        response = self.session.get(f"{self.base_url}/users/{username}")
        response.raise_for_status()
        return response.json()
    
    def get_repos(self, username):
        """دریافت مخازن یک کاربر"""
        response = self.session.get(f"{self.base_url}/users/{username}/repos")
        response.raise_for_status()
        return response.json()
    
    def search_repos(self, query, limit=5):
        """جستجوی مخازن"""
        params = {"q": query, "per_page": limit, "sort": "stars"}
        response = self.session.get(f"{self.base_url}/search/repositories", params=params)
        response.raise_for_status()
        return response.json()["items"]
    
    def close(self):
        """بستن نشست"""
        self.session.close()

# استفاده
client = GitHubClient()

try:
    # دریافت اطلاعات کاربر
    user = client.get_user("octocat")
    print(f"User: {user['login']}")
    print(f"Name: {user.get('name')}")
    print(f"Public repos: {user['public_repos']}")
    
    # جستجوی مخازن
    repos = client.search_repos("python", limit=3)
    print("\nPopular Python repositories:")
    for repo in repos:
        print(f"  {repo['name']} - {repo['stargazers_count']} stars")
        
finally:
    client.close()

📌 نکات کلیدی

← قبلی: مبانی Matplotlib → بعدی: لاگ‌نویسی ↑ بازگشت به فهرست متوسط