עבודה עם APIs

API (ממשק תכנות יישומים) מאפשר לתוכנות שונות לתקשר ביניהן.
באמצעות HTTP requests, אנו יכולים לשלוח בקשות לשרתים ולקבל נתונים בתגובה, לרוב בפורמט JSON.

מה נלמד:

  1. שליחת בקשות HTTP (Sending HTTP requests):
    שימוש בספריית requests כדי לשלוח בקשות GET ו-POST.
  2. פענוח תגובות JSON (Parsing JSON responses):
    שימוש במודול json או תכונות של requests כדי לנתח תגובות מהשרת.

דוגמת קוד

import requests

# Sending an HTTP GET request
url = "https://api.coindesk.com/v1/bpi/currentprice.json"
response = requests.get(url)

if response.status_code == 200:  # Check if the request was successful
    data = response.json()  # Parse the JSON response
    # Accessing specific data in the JSON
    bitcoin_price = data["bpi"]["USD"]["rate"]
    print(f"Current Bitcoin price in USD: {bitcoin_price}")
else:
    print(f"Failed to fetch data. Status code: {response.status_code}")

הסבר על הקוד

  1. שליחת בקשת HTTP:
    • requests.get(url): שולח בקשת GET ל-URL הנתון.
    • response.status_code: בודק אם הבקשה הצליחה (סטטוס קוד 200 פירושו הצלחה).
  2. פענוח JSON:
    • response.json(): ממיר את התגובה ממחרוזת JSON למבנה נתונים של פייתון (מילון, רשימה וכו').
    • data["bpi"]["USD"]["rate"]: גישה לערך מסוים במבנה ה-JSON.

תרגילים

תרגיל 1:
שלחו בקשת GET ל-https://api.agify.io?name=YOUR_NAME ונתחו את התגובה כדי להציג את הגיל המשוער לשם שהוזן.

תרגיל 2:
צרו תוכנית שמבצעת בקשה ל-https://api.coindesk.com/v1/bpi/currentprice.json ומדפיסה את מחיר הביטקוין ביורו.

תרגיל 3:
שלחו בקשת GET ל-https://jsonplaceholder.typicode.com/posts ונתחו את התגובה כדי להדפיס את הכותרת של הפוסט הראשון.

תרגיל 4:
שלחו בקשת POST ל-https://jsonplaceholder.typicode.com/posts עם נתונים דמויים (כותרת, גוף, משתמש) והדפיסו את התגובה.

תרגיל 5:
אתגר: כתבו תוכנית שמבצעת בקשה ל-API של מזג אוויר ומדפיסה את הטמפרטורה בעיר שהמשתמש מזין.

הפרויקט הגדול: משחק הטריוויה

נשתמש ב-API כדי לקבל שאלות טריוויה דינמיות ממקור חיצוני.

קובץ question.py

import requests

class Question:
    """A class to represent a quiz question."""
    def __init__(self, text, answer):
        self.text = text
        self.answer = answer

    def is_correct(self, user_answer):
        """Check if the user's answer is correct."""
        return str(user_answer).lower() == str(self.answer).lower()

    @staticmethod
    def fetch_questions(api_url):
        """Fetch trivia questions from an external API."""
        try:
            response = requests.get(api_url)
            if response.status_code == 200:
                data = response.json()
                questions = []
                for item in data["results"]:
                    text = item["question"]
                    answer = item["correct_answer"]
                    questions.append(Question(text, answer))
                return questions
            else:
                print(f"Failed to fetch questions. Status code: {response.status_code}")
                return []
        except Exception as e:
            print(f"An error occurred while fetching questions: {e}")
            return []

קובץ quiz_game.py

from question import Question
from player import Player

class QuizGame:
    """A class to manage the quiz game."""
    def __init__(self, questions):
        self.questions = questions  # List of Question objects

    def start(self, player_name):
        """Start the game for a player."""
        player = Player(player_name)
        for question in self.questions:
            print("\n" + question.text)
            user_answer = input("Your answer: ").strip()
            if question.is_correct(user_answer):
                print("Correct!")
                player.add_score(1)
            else:
                print(f"Wrong! The correct answer was: {question.answer}")
        print(f"\n{player.name}, your final score is: {player.score}")

קובץ main.py

from question import Question
from quiz_game import QuizGame

API_URL = "https://opentdb.com/api.php?amount=5&type=multiple"

def main():
    """Main function to run the quiz game."""
    print("Fetching trivia questions...")
    questions = Question.fetch_questions(API_URL)

    if not questions:
        print("No questions available to play.")
        return

    name = input("Enter your name: ").strip()
    quiz = QuizGame(questions)
    quiz.start(name)

if __name__ == "__main__":
    main()

שיפורים שנוספו לפרויקט:

  1. מחלקה Question:
    • שיטה סטטית fetch_questions שמבצעת בקשה ל-API חיצוני לקבלת שאלות.
  2. API חיצוני:
    • בקשה ל-https://opentdb.com/api.php לקבלת שאלות דינמיות לפעילות המשחק.
  3. פרויקט דינמי ומעודכן:
    • השאלות במשחק מתעדכנות בזמן אמת ממקור חיצוני.