تعلّم/بداية سريعة مع Python

كيف تجلب أسعار الصرف في Python

اقرأ أسعار صرف حية وتاريخية في Python ببضعة أسطر. لا مفتاح للبداية، و10,000 استدعاء شهريًا بعد التسجيل، وكل استجابة تخبرك بمدى حداثة السعر.

ERexchangerate.dev·Jun 19, 2026·قراءة 5 دقائق

أقصر طريق إلى أسعار الصرف في Python هو طلب GET إلى /v1/latest/USD. يعود إليك JSON بأسعار 31 عملة مع حقلي حداثة، source وmarket_session. استدعاؤك الأول لا يحتاج مفتاح API.

نقاط أساسية
طلب GET واحد إلى /v1/latest/{base} يعيد أسعار 31 عملة بصيغة JSON.
تحمل كل استجابة source وmarket_session، فتعرف مدى حداثة كل سعر.
الخطة المجانية 10,000 استدعاء شهريًا بمعدل 12 طلبًا في الدقيقة، دون بطاقة.
الأسعار إرشادية، منشورة للمرجعية والتحليل، وليست تسعيرة تداول.

استدعاؤك الأول، دون اعتماديات

لا تحتاج شيئًا خارج المكتبة القياسية. تتكفل urllib.request باستدعاء واحد:

python · standard librarycopy
import json
from decimal import Decimal
import urllib.request

url = "https://api.exchangerate.dev/v1/latest/USD?symbols=EUR,GBP"
with urllib.request.urlopen(url, timeout=10) as response:
    data = json.load(response, parse_float=Decimal)

print(data["rates"]["EUR"])
print(data["sources"]["EUR"], data["effective_at"]["EUR"])
print(data["market_session"])

يعمل هذا دون مفتاح. الاستدعاءات المجهولة محدودة لكل عنوان IP، فلأي شيء يتجاوز التجربة السريعة تحتاج مفتاحًا مجانيًا.

مع requests ومفتاح API

معظم المشاريع تستخدم requests أصلًا. مرّر مفتاحك كرمز bearer:

python · requestscopy
# Install first: python -m pip install requests
import os
from decimal import Decimal
import requests

response = requests.get(
    "https://api.exchangerate.dev/v1/latest/USD",
    headers={"Authorization": f"Bearer {os.environ['EXCHANGERATE_API_KEY']}"},
    timeout=10,
    allow_redirects=False,
)
if response.status_code == 429:
    raise RuntimeError(f"Rate limited; Retry-After: {response.headers.get('Retry-After')}")
if 300 <= response.status_code < 400:
    raise RuntimeError("Unexpected redirect")
response.raise_for_status()
data = response.json(parse_float=Decimal)
print(data["rates"]["GBP"], data["effective_at"]["GBP"])

المفتاح المجاني يرفع حدك إلى 10,000 استدعاء شهريًا بمعدل 12 طلبًا في الدقيقة. تعمل ترويسة X-API-Key أيضًا، للمنصات التي لا تستطيع ضبط Authorization.

حوّل مبلغًا

للتحويل بدل سرد الأسعار، استدعِ /v1/convert. يعيد السعر والمبلغ المحوّل معًا:

python · convert 100 USD to EURcopy
import os
from decimal import Decimal
import requests

response = requests.get(
    "https://api.exchangerate.dev/v1/convert/USD/EUR/100",
    headers={"Authorization": f"Bearer {os.environ['EXCHANGERATE_API_KEY']}"},
    timeout=10,
    allow_redirects=False,
)
if not 200 <= response.status_code < 300:
    raise RuntimeError(f"HTTP {response.status_code}; Retry-After: {response.headers.get('Retry-After')}")
data = response.json(parse_float=Decimal)
print(data["rate"], data["converted"])

اعرف مدى حداثة السعر

للعملة المعروضة، اقرأ sources[currency] لمعرفة نوع المصدر وeffective_at[currency] لمعرفة وقت الرصد. يلخص source البيانات الأقل حداثة في الاستجابة كلها. يصف market_session جلسة السوق، بينما يشير timestamp إلى وقت إنشاء الاستجابة لا إلى وقت رصد السعر.

قيمة الحقلما معناهامتى تتحرك
source: liveإجماع فوري مجمّعخلال اليوم (~60 ث)، أسبوع التداول
source: ecb_dailyتثبيت مرجعي رسميمرة كل يوم عمل
market_session: weekendسبت أو أحد (سوق ما بين البنوك مغلقة)التثبيت المرجعي يحمل قيمة الجمعة؛ التغذية الحية لا تتحدث
إرشادية، لا تصلح للتسوية
تُنشر الأسعار للمرجعية والتحليل والعرض. ليست تسعيرة تداول ويجب ألا تُستخدم لتسوية صفقة. تحمل كل استجابة ذلك في حقل notice الخاص بها.

اقرأ يومًا ماضيًا واحدًا

اطلب أي تاريخ رجوعًا حتى 1999 بوضعه في المسار. تضيف الاستجابة is_forward_filled، وتكون true عندما لم يُنشر سعر في ذلك اليوم، كعطلة نهاية أسبوع أو عيد:

python · rate on a past datecopy
import os
from decimal import Decimal
import requests

response = requests.get(
    "https://api.exchangerate.dev/v1/2026-03-14/USD?symbols=JPY",
    headers={"Authorization": f"Bearer {os.environ['EXCHANGERATE_API_KEY']}"},
    timeout=10,
    allow_redirects=False,
)
if not 200 <= response.status_code < 300:
    raise RuntimeError(f"HTTP {response.status_code}; Retry-After: {response.headers.get('Retry-After')}")
data = response.json(parse_float=Decimal)
print(data["rates"]["JPY"], data["is_forward_filled"])

لسلسلة كاملة عبر نطاق تواريخ في استدعاء واحد، استخدم /v1/range مع start_date وend_date. يغطي ذلك دليل مستقل.

ER
exchangerate.dev
أدلة تكامل للمطورين.

تابع القراءة

Tutorialتحويل العملات في JavaScript وNode.jsاقرأ
المزيد من المقارناتFixer vs exchangerate.devOpen Exchange Rates vs exchangerate.devCurrencylayer vs exchangerate.dev
تعلّمأسعار الصرف المرجعية للبنك المركزي الأوروبي، موضحةتحويل العملات في JavaScript وNode.jsأسعار الصرف في Next.js وTypeScript
أسعار مباشرةEUR/USDGBP/USDUSD/JPY