ailiteracynepal 🇳🇵
पाठ आकार

अध्याय २ · खण्ड II · 28 मिनेट

डाटाका लागि API कल (मौसम, NEPSE, विनिमय दर)

आधुनिक इन्टरनेटले कार्यक्रमलाई डाटा हस्तान्तरण गर्ने तरिका API हो। Python का पाँच लाइनले तपाईंलाई प्रत्यक्ष मौसम, विनिमय दर, NEPSE उद्धरण, र हजारौं अरू फिड दिन्छन्। एक पटक आकार सिक्नुहोस् र बाँकी फरक हुन्छन्।

API — Application Programming Interface — एउटा कार्यक्रमले अर्कोबाट डाटा माग्ने तरिका हो। जहाँ मानिसले वेबसाइट भेट गर्छ, कार्यक्रमले API बोलाउँछ र मेसिन-पठनीय ढाँचामा (झन्डै सधैं JSON) उही डाटा पाउँछ। एक पटक तपाईंले एउटा API बोलाउन सक्नुभयो भने, अधिकांश बोलाउन सक्नुहुन्छ — आकार झन्डै फरक हुँदैन। यो खण्डले तीन मूर्त नेपाली उदाहरणसँग क्यानोनिकल ढाँचा हिँडाउँछ: आजको काठमाडौं मौसम, NPR-USD विनिमय दर, र NEPSE सूचक मान।

API कलको आधारभूत आकार

Python मा, API कलका लागि मानक पुस्तकालय requests हो। प्रति परियोजना एक पटक स्थापना गर्नुहोस्:

pip install requests

न्यूनतम कल:

import requests

response = requests.get("https://api.example.com/some-endpoint")
data = response.json()
print(data)

तीन लाइनले झन्डै सबै गर्छन्:

  1. requests.get(url) ले HTTP GET अनुरोध गर्छ र Response वस्तु फिर्ता दिन्छ।
  2. response.json() ले JSON बडीलाई Python शब्दकोश वा सूचीमा पार्स गर्छ।
  3. print(data) ले निरीक्षण गर्न।

त्यो पूरै शब्दावली हो। बाँकी सबै तपाईंले कुन URL बोलाउनुहुन्छ, कुन हेडर पठाउनुहुन्छ, र कुन प्रमाणीकरण चाहिन्छ भन्नेमा फरक हो।

पहिलो वास्तविक कल: मौसम

Open-Meteo निःशुल्क, कीबिनाको मौसम API हो। काठमाडौंको वर्तमान अवस्था पाउन:

import requests

response = requests.get(
    "https://api.open-meteo.com/v1/forecast",
    params={
        "latitude": 27.7172,
        "longitude": 85.3240,
        "current_weather": True,
    },
)

data = response.json()
print(data["current_weather"])

params= आर्गुमेन्ट URL मा क्वेरी स्ट्रिङमा बदलिन्छ। Python ले वास्तवमा बोलाएको पूर्ण URL https://api.open-meteo.com/v1/forecast?latitude=27.7172&longitude=85.3240&current_weather=true हो। Pandas, requests पुस्तकालय, र अधिकांश HTTP औजारले तपाईंका लागि URL-एन्कोडिङ ह्यान्डल गर्छन् — तपाईंले Python dict मात्र दिनुपर्छ।

सामान्य प्रतिक्रिया:

{
  'temperature': 24.3,
  'windspeed': 7.6,
  'winddirection': 180,
  'weathercode': 3,
  'time': '2026-06-27T13:00'
}

पाँच वास्तविक लाइन, एक उपयोगी डाटाको टुक्रा।

दोस्रो कल: विनिमय दर

विनिमय दर API उत्कृष्ट उदाहरण हुन् किनभने झन्डै हरेक नेपाली वित्तीय परियोजनाले छुन्छ। सामान्य निःशुल्क विकल्प exchangerate-api.com को खुला endpoint हो:

response = requests.get("https://open.er-api.com/v6/latest/USD")
data = response.json()

npr_per_usd = data["rates"]["NPR"]
print(f"1 USD = {npr_per_usd} NPR")

आउटपुट:

1 USD = 134.15 NPR

केही API का लागि तपाईंलाई की चाहिँदैन। अरूका लागि चाहिन्छ। चाहिँदा, Course 01 अध्याय 4 को गोप्य अनुशासन सम्झनुहोस्: API की .env मा बस्छन्, python-dotenv ले लोड हुन्छन्, र कमिट गरिएको कोडमा कहिल्यै देखापर्दैनन्।

तेस्रो कल: NEPSE-शैलीका endpoint

NEPSE-सम्बन्धित API गुणस्तर र उपलब्धतामा फरक हुन्छन् — केही आधिकारिक, केही तेस्रो-पक्षले स्क्र्याप गरेका, केही आउने-जाने। आकार अरू दुई जस्तै हो:

response = requests.get(
    "https://api.example-nepse-feed.com/v1/index",
    params={"date": "2026-06-27"},
    headers={"Authorization": "Bearer YOUR_API_KEY"},
)

if response.status_code == 200:
    data = response.json()
    print(data)
else:
    print(f"Request failed with status {response.status_code}")

यो संस्करणमा दुई नयाँ कुरा:

  • headers= प्रमाणीकरणका लागि। अधिकांश भुक्तानी API ले हेडरमा Bearer टोकन वा API की पठाउनुपर्ने हुन्छ। कुन हो हेर्न API को कागजात पढ्नुहोस्।
  • response.status_code — अनुरोध सफल भयो कि भएन भन्ने कोड। 200 सफलता हो। 401 “तपाईं प्रमाणित हुनुहुन्न” हो। 429 “तपाईं धेरै छिटो बोलाउँदै हुनुहुन्छ — ढिलो गर्नुहोस्” हो। 500 “सर्भर बिग्रियो” हो। requests पुस्तकालयले यिनका लागि पूर्वनिर्धारित रूपमा त्रुटि फ्याँक्दैन; तपाईंले जाँच्नुहुन्छ।

पूर्ण, अलि बढी-वास्तविक उदाहरण

तपाईंले लेख्ने झन्डै हरेक API-कल स्क्रिप्टको आकार:

import os
import requests
from dotenv import load_dotenv

load_dotenv()


def fetch_weather(city_lat: float, city_lon: float) -> dict:
    response = requests.get(
        "https://api.open-meteo.com/v1/forecast",
        params={
            "latitude": city_lat,
            "longitude": city_lon,
            "current_weather": True,
        },
        timeout=10,
    )
    response.raise_for_status()
    return response.json()["current_weather"]


if __name__ == "__main__":
    weather = fetch_weather(27.7172, 85.3240)
    print(f"Kathmandu now: {weather['temperature']}°C, wind {weather['windspeed']} km/h")

तीन साना विवरण जानकारीका लागि:

  • timeout=10 — कहिल्यै timeout बिना API नबोलाउनुहोस्। यदि सर्भर अड्किन्छ भने, तपाईंको स्क्रिप्ट सधैंका लागि अड्किन्छ। अधिकांश API का लागि दश सेकेन्ड पर्याप्त छ।
  • response.raise_for_status() — गैर-200 प्रतिक्रियालाई Python अपवादमा बदल्छ जुन तपाईं समात्न सक्नुहुन्छ। if response.status_code != 200 हर ठाउँमा लेख्नभन्दा सजिलो।
  • प्रति endpoint एउटा फङ्क्सन। स्पष्ट इनपुट र आउटपुटसहित फङ्क्सनमा कल बेर्नुहोस्। बाँकी कार्यक्रम परीक्षणयोग्य बनाउँछ, र Course 01 मा NEPSE लाई स्टब गरेजस्तै API स्टब गर्न दिन्छ।

रेट सीमा — हरेक निर्माताले भेट्ने गति-बम्प

हरेक सार्वजनिक API सँग तपाईंले कति पटक बोलाउन सक्ने सीमा हुन्छ। निःशुल्क तहले प्रायः प्रति मिनेट 60 अनुरोध, वा प्रति दिन 1,000 अनुमति दिन्छन्। भुक्तानी तह उच्च जान्छन्। सीमा हानेपछि तपाईंले 429 Too Many Requests प्रतिक्रिया पाउनुहुन्छ।

यो सम्हाल्ने भद्र तरिका:

  • प्रतिक्रिया क्यास गर्नुहोस्। यदि तपाईंले एक शहरका लागि हरेक पाँच मिनेटमा मौसम API बोलाउनुहुन्छ भने, पाँच मिनेटका लागि प्रतिक्रिया स्थानीय रूपमा बचाउनुहोस् र अझै ताजा छ भने कल स्किप गर्नुहोस्।
  • कलबीच निद्रा। वस्तुहरूको सूचीमा लूप गर्दा, कलबीच time.sleep(0.5) थप्नुहोस्।
  • एक्सपोनेन्सियल ब्याकअफ। यदि 429 पाउनुहुन्छ भने, 1 सेकेन्ड पर्खिनुहोस् र पुन: प्रयास गर्नुहोस्। फेरि पाउनुहुन्छ भने, 2 सेकेन्ड पर्खिनुहोस्। अनि 4, 8, 16। अन्ततः तपाईं रेट सीमामुनि झर्नुहुन्छ वा रोकिनुहुन्छ।

तेस्रो गर्ने सानो र्‍यापर:

import time

def get_with_backoff(url: str, max_retries: int = 5, **kwargs) -> dict:
    delay = 1.0
    for _ in range(max_retries):
        response = requests.get(url, timeout=10, **kwargs)
        if response.status_code != 429:
            response.raise_for_status()
            return response.json()
        time.sleep(delay)
        delay *= 2
    raise RuntimeError("Rate limited even after retries")

तपाईंले परियोजना प्रति एक पटक यो लेख्नुहुन्छ र हरेक API कलका लागि पुन: प्रयोग गर्नुहुन्छ। वास्तविक समय बचाउँछ।

जब API ले गलत-देखिने डाटा फिर्ता गर्छ

API गल्ती-मुक्त छैनन्। प्रतिक्रियाको आकार रातारात बदलिन सक्छ। डाटा बासी हुन सक्छ। endpoint ले 200 OK खाली बडीसँग फिर्ता गर्न सक्छ। उपयोगी रक्षात्मक ढाँचा:

data = response.json()

if not data:
    print("API returned empty body")
    return None

if "current_weather" not in data:
    print(f"Unexpected response shape: {list(data.keys())}")
    return None

return data["current_weather"]

तपाईंलाई यस्तो केही नलेख्ने र API मा विश्वास गर्ने प्रलोभन हुनेछ। निर्माणको एक वर्षभित्र, लेखेकोमा तपाईं खुसी हुनुहुनेछ।

आफ्नो बुझाइ जाँच्नुहोस्

Quick check

आज NEPSE बन्द हरेक पाँच मिनेटमा ल्याउने स्क्रिप्टले एक घण्टा चलेपछि `429 Too Many Requests` फिर्ता गर्न थाल्छ। यो खण्डको शब्दावलीबाट, सबैभन्दा उपयोगी पहिलो प्रतिक्रिया के हो?

Quick check

एक टिम सदस्यले लेख्छन्: response = requests.get('https://api.example.com/data') data = response.json() process(data) पठाउनुअघि सबैभन्दा महत्त्वपूर्ण रक्षात्मक परिवर्तन के हो?

अब के आउँछ

फाइल र API ले तपाईंले कानुनी र सफा रूपमा ल्याउन सक्ने अधिकांश ओगट्छन्। कहिलेकाहीं तपाईंलाई चाहिने डाटा वेब पृष्ठमा छ र साइटमा API छैन — नेपाली समाचार साइट, मन्त्रालय पृष्ठमा विद्यालय ठेगानाको सूची, फिडबिनाको सार्वजनिक NEPSE तालिका। स्क्र्यापिङ — रेन्डर गरिएको वेब पृष्ठबाट डाटा निकाल्ने — हामीले ओगट्ने अन्तिम ल्याउने प्रविधि हो। यो प्राविधिक र नैतिक दुवै बुझ्न योग्य बाधासहित आउँछ।