Tích hợp API trong tự động hóa Python với AI

🔄 Tóm tắt bài học: Trong bài học trước, bạn đã học về web scraping — trích xuất dữ liệu từ các trang HTML. API là một giải pháp thay thế có cấu trúc và đáng tin cậy: Thay vì phân tích cú pháp HTML, bạn nhận được dữ liệu JSON sạch trực tiếp từ dịch vụ.

API là xương sống của tự động hóa hiện đại. Thay vì trích xuất dữ liệu từ trang web thời tiết, hãy gọi API thời tiết. Thay vì trích xuất dữ liệu từ màn hình công cụ quản lý dự án của bạn, hãy sử dụng API của nó. API cung cấp cho bạn dữ liệu có cấu trúc, giao diện ổn định và quyền truy cập rõ ràng.

Thông tin cơ bản về REST API

📍 Nơi dán: Mở ChatGPT (chat.openai.com), Claude (claude.ai) hoặc Gemini (gemini.google.com) và bắt đầu một cuộc trò chuyện mới.

pip install requests python-dotenv

📋 Cách sao chép prompt này: Nhấp chuột vào bất kỳ đâu bên trong khối màu xám, nhấn Cmd+A rồi Cmd+C (Mac) hoặc Ctrl+A rồi Ctrl+C (Windows). Hoặc sử dụng biểu tượng sao chép xuất hiện.

👀 Những gì bạn sẽ thấy: Trong vòng vài giây, AI sẽ trả về một phản hồi có cấu trúc dựa vào prompt ở trên. Hãy đọc kỹ và coi đó là bản nháp, không phải câu trả lời cuối cùng.

4 phương thức HTTP bạn sẽ sử dụng:

Phương thức Mục đích Ví dụ
GET Truy xuất dữ liệu Nhận dự báo thời tiết, danh sách người dùng
POST Gửi/tạo dữ liệu Tạo nhiệm vụ, gửi biểu mẫu
PUT Cập nhật dữ liệu Cập nhật hồ sơ người dùng, chỉnh sửa cài đặt
DELETE Xóa dữ liệu Xóa bản ghi, hủy đăng ký

Các mẫu yêu cầu cốt lõi:

✏️ Cách điền thông tin chi tiết: Thay thế mỗi dấu ngoặc vuông [] và trình giữ chỗ trong ngoặc bằng thông tin cụ thể từ tình huống thực tế của bạn. Thông tin đầu vào mơ hồ sẽ tạo ra kết quả mơ hồ — hãy cụ thể.

👀 Những gì bạn sẽ thấy: Trong vòng vài giây, AI sẽ trả về một phản hồi có cấu trúc dựa vào prompt ở trên. Hãy đọc kỹ và coi đó là bản nháp, không phải câu trả lời cuối cùng.

📌 Cách xử lý kết quả: Lưu phản hồi vào file Notes. Chọn gợi ý có hiệu quả cao nhất và thực hiện nó trong tuần này — đừng cố gắng làm tất cả cùng một lúc.

⚠️ Nếu kết quả không ổn: Nếu các gợi ý có vẻ chung chung, hãy dán nội dung sau: "Hãy cụ thể hơn với ngữ cảnh thực tế của tôi. Bỏ qua những lời khuyên chung chung." Nếu nó bỏ qua các chi tiết quan trọng bạn đã cung cấp, hãy hỏi: "Bạn đã bỏ sót [X] trong ngữ cảnh của tôi — hãy thực hiện lại với điều đó làm ràng buộc chính."

python
import requests

# GET with parameters
response = requests.get(
    "https://api.example.com/data",
    params={"city": "Tokyo", "units": "metric"},
    headers={"Authorization": f"Bearer {api_key}"}
)
data = response.json()

# POST with JSON body
response = requests.post(
    "https://api.example.com/items",
    json={"name": "New Item", "quantity": 5},
    headers={"Authorization": f"Bearer {api_key}"}
)

Script 1: API Data Fetcher

Prompt AI:

Viết một script Python để lấy dữ liệu từ API REST: (1) Đọc API key từ biến môi trường bằng python-dotenv, (2) Thực hiện các yêu cầu GET với tiêu đề và tham số phù hợp, (3) Xử lý các lỗi HTTP phổ biến: 401 (không được ủy quyền), 403 (bị cấm), 404 (không tìm thấy), 429 (giới hạn tốc độ), 500 (lỗi máy chủ), (4) Phân tích phản hồi JSON và lưu vào CSV, (5) Thêm logic thử lại: thử lại các yêu cầu không thành công tối đa 3 lần với độ trễ lũy thừa (1s, 2s, 4s). Bao gồm file .env.example liệt kê các biến môi trường cần thiết.

Script 2: Paginated API Consumer

Prompt AI:

Viết một script tiêu thụ API REST phân trang: (1) Bắt đầu từ trang đầu tiên, (2) Tuân theo phân trang: API trả về trường "next_page_token" trong mỗi phản hồi — truyền nó làm tham số truy vấn để lấy trang tiếp theo, (3) Thu thập tất cả các mục trên mọi trang vào một danh sách duy nhất, (4) Dừng lại khi không có "next_page_token" trong phản hồi, (5) Tuân thủ giới hạn tốc độ: tối đa 60 yêu cầu mỗi phút, (6) Lưu tiến trình sau mỗi trang (an toàn để tiếp tục nếu script bị lỗi), (7) In tiến trình: "Trang 5 — Đã thu thập được 500 mục cho đến nay". Trả về toàn bộ tập dữ liệu dưới dạng DataFrame của pandas.

Các mẫu xác thực

Loại xác thực Cách hoạt động Code yêu cầu
API Key (header) Key trong tiêu đề yêu cầu headers={"X-API-Key": key}
Bearer Token Token kiểu OAuth headers={"Authorization": f"Bearer {token}"}
API Key (query) Key trong tham số URL params={"api_key": key}
Xác thực cơ bản Username + mật khẩu auth=("username", "password")

Bảo mật biến môi trường

Tạo file .env (thêm vào .gitignore):

WEATHER_API_KEY=key-của-bạn-ở-đây
GITHUB_TOKEN=ghp_xxxxxxxxxxxx

Tạo file .env.example (commit file này — hiển thị các biến bắt buộc mà không có giá trị):

WEATHER_API_KEY=
GITHUB_TOKEN=

Load trong script của bạn:

from dotenv import load_dotenv
import os

load_dotenv()
api_key = os.environ.get("WEATHER_API_KEY")
if not api_key:
    raise ValueError("WEATHER_API_KEY not set in .env file")

Script 3: Pipeline dữ liệu đa API

Prompt AI:

Viết một script Python kết hợp dữ liệu từ hai API: (1) Lấy danh sách các thành phố từ API_1, (2) Đối với mỗi thành phố, lấy dữ liệu thời tiết từ API_2, (3) Kết hợp các kết quả thành một tập dữ liệu duy nhất với các cột từ cả hai API, (4) Xử lý: một API bị lỗi (sử dụng dữ liệu được lưu trong cache nếu có), giới hạn tốc độ trên cả hai API (giới hạn khác nhau) và dữ liệu bị thiếu (một số thành phố có thể không có dữ liệu thời tiết), (5) Lưu kết quả kết hợp dưới dạng CSV và Excel. Điều này minh họa mô hình phổ biến của việc điều phối nhiều lệnh gọi API.

Kiểm tra nhanh: Một API trả về lỗi này: {"error": "rate_limit_exceeded", "retry_after": 30}. Script của bạn nên làm gì?

Câu trả lời: Chờ 30 giây được chỉ định trước khi thử lại. Nhiều API bao gồm trường retry_after hoặc tiêu đề HTTP Retry-After cho bạn biết chính xác thời gian cần đợi. Việc xử lý lỗi của bạn nên kiểm tra giá trị này và sử dụng nó thay vì một khoảng thời gian chờ cố định. Prompt AI: "Thêm xử lý retry_after vào logic lỗi API của tôi — kiểm tra cả phần thân phản hồi JSON và tiêu đề HTTP để biết thời gian thử lại".

Xử lý lỗi cho các API script

Lỗi Mã trạng thái Script của bạn nên
Rate limited 429 Chờ và thử lại (kiểm tra tiêu đề Retry-After)
Unauthorized 401 Kiểm tra API key, báo lỗi rõ ràng
Not found 404 Đăng nhập và bỏ qua tài nguyên này
Server error 500-503 Thử lại với chế độ backoff (sự cố tạm thời)
Timeout - Thử lại với thời gian chờ dài hơn
Network error - Thử lại, sau đó báo lỗi rõ ràng

Những điểm chính cần ghi nhớ

  • Không bao giờ hardcode API key trong mã nguồn — hãy sử dụng biến môi trường với python-dotenv, tạo file .env (được thêm vào .gitignore) cho các key của bạn và file .env.example (đã được commit) hiển thị những biến bắt buộc; bot sẽ quét GitHub để tìm các key bị rò rỉ chỉ trong vài phút sau khi vô tình đẩy code.
  • Thực hiện giới hạn tốc độ thông minh: theo dõi dấu thời gian yêu cầu để tối đa hóa thông lượng trong giới hạn và sử dụng thuật toán lùi lũy thừa (1s, 2s, 4s) với logic thử lại cho lỗi 429 — mọi API đều có giới hạn và script của bạn phải tự động tuân thủ chúng.
  • API đáng tin cậy hơn so với việc thu thập dữ liệu web vì chúng cung cấp dữ liệu JSON có cấu trúc, giao diện có phiên bản và quyền rõ ràng — luôn kiểm tra xem một trang web có API hay không trước khi xây dựng trình thu thập dữ liệu.
  • Câu 1:

    API trả về dữ liệu theo trang: mỗi phản hồi bao gồm 100 mục và một 'next_page_token'. Bạn cần tất cả 5.000 mục. Script của bạn thu thập tất cả các trang một cách chính xác, nhưng API trả về dữ liệu hơi khác nếu bạn chạy lại script sau 10 phút (một số mục được thêm vào, một số mục bị xóa). Bạn xử lý vấn đề này như thế nào?

    GIẢI THÍCH:

    Dữ liệu API vốn dĩ rất năng động — đó thường là lý do tại sao bạn gọi API ngay từ đầu. Tự động hóa tốt sẽ nắm bắt điều này: gắn dấu thời gian cho mỗi lần lấy dữ liệu, theo dõi những thay đổi giữa các lần chạy và hiểu xem API có đảm bảo tính nhất quán phân trang hay không. Phát hiện thay đổi (so sánh các lần chạy) rất có giá trị để giám sát những trường hợp sử dụng: thay đổi giá, danh sách mới, nội dung bị xóa.

  • Câu 2:

    Script của bạn lưu trữ API key trực tiếp trong code: `api_key = 'sk-abc123...'`. Một đồng nghiệp nói rằng đây là một rủi ro bảo mật. Tại sao lại vậy và cách khắc phục là gì?

    GIẢI THÍCH:

    Không bao giờ hardcode API key, mật khẩu hoặc bí mật trong mã nguồn. Biến môi trường tách biệt cấu hình khỏi code, cho phép các giá trị khác nhau cho mỗi môi trường và ngăn ngừa việc vô tình bị lộ thông tin thông qua kiểm soát phiên bản. Thư viện python-dotenv giúp việc này dễ dàng: tạo file .env với các key của bạn, thêm .env vào .gitignore và load chúng bằng `load_dotenv()`. Đây là một thực tiễn bảo mật tốt nhất phổ biến, không chỉ dành cho Python.

  • Câu 3:

    Bạn đang viết một script gọi API thời tiết để lấy dự báo cho 50 thành phố. API cho phép 60 yêu cầu mỗi phút. Script của bạn gửi tất cả 50 yêu cầu trong 3 giây và hoạt động tốt. Nhưng khi bạn thêm 20 thành phố nữa (tổng cộng 70), API trả về lỗi '429 Too Many Requests'. Làm thế nào để khắc phục điều này?

    GIẢI THÍCH:

    Giới hạn tốc độ là một khái niệm API cơ bản. Mọi API đều có giới hạn và script của bạn phải tuân thủ chúng. Giới hạn tốc độ thông minh (theo dõi dấu thời gian thay vì độ trễ cố định) tối đa hóa thông lượng trong khi vẫn nằm trong giới hạn. Cơ chế lùi thời gian theo cấp số nhân xử lý các lỗi 429 không thể tránh khỏi một cách khéo léo. Những mẫu này áp dụng cho mọi API mà bạn sẽ sử dụng.

Thứ Ba, 09/06/2026 15:41
51 👨 26
Xác thực tài khoản!

Theo Nghị định 147/2024/ND-CP, bạn cần xác thực tài khoản trước khi sử dụng tính năng này. Chúng tôi sẽ gửi mã xác thực qua SMS hoặc Zalo tới số điện thoại mà bạn nhập dưới đây:

Số điện thoại chưa đúng định dạng!
Số điện thoại này đã được xác thực!
Bạn có thể dùng Sđt này đăng nhập tại đây!
Lỗi gửi SMS, liên hệ Admin
0 Bình luận
Sắp xếp theo