الأدلةدروس

كيفية الحصول على أسعار الصرف في Python

ابدأ بالمكتبة القياسية، واستخدم requests عند الحاجة إلى تحكم أكبر. يمكن أن يكون forex-python مرحلة انتقالية أثناء الترحيل.

1 أكتوبر 2026 · قراءة في 6 دقائق

يعيد /v1/latest/USD JSON يتضمن السعر والمصدر ووقت الرصد. استخدم Decimal عند حساب المبالغ لتجنب أخطاء الدقة.

  • تعمل urllib دون تبعيات إضافية.
  • تسهل requests المصادقة والمهلة والأخطاء.
  • يمكن استخدام forex-python كواجهة مؤقتة أثناء الترحيل.
  • احفظ source وeffective_at وdata_updated_at مع القيمة.
  • للتاريخ استخدم مسار اليوم أو /v1/range.

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

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

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

مع requests ومفتاح API

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

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

حوّل مبلغًا

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

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

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

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

تُنشر الأسعار للمرجعية والتحليل والعرض. ليست تسعيرة تداول ويجب ألا تُستخدم لتسوية صفقة. تحمل كل استجابة ذلك في حقل notice الخاص بها.

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

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

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

الترحيل من forex-python

يستخدم forex-python مزوده الخاص ولا يتصل تلقائياً بـ exchangerate.dev. يمكنك الحفاظ على واجهة مألوفة أثناء الترحيل، لكن احتفظ بمصدر exchangerate.dev ووقت الرصد.

python · standard library
import jsonfrom decimal import Decimalimport urllib.requesturl = "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"])
python · requests
# Install first: python -m pip install requestsimport osfrom decimal import Decimalimport requestsresponse = 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"])
python · convert 100 USD to EUR
import osfrom decimal import Decimalimport requestsresponse = 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"])
python · rate on a past date
import osfrom decimal import Decimalimport requestsresponse = 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"])

أسئلة

هل أحتاج مفتاح API لجلب أسعار الصرف في Python؟

لا. تستطيع استدعاء /v1/latest/{base} مجهولًا للبداية. الاستدعاءات المجهولة محدودة المعدل لكل عنوان IP، فللاستخدام الإنتاجي سجّل للحصول على مفتاح مجاني يرفع الحد إلى 5,000 استدعاء شهريًا بمعدل 10 طلبات في الدقيقة.

كيف أمرر مفتاح API في طلب Python؟

أرسله كرمز bearer في ترويسة Authorization، مثل {"Authorization": "Bearer exr_live_..."}. وتُقبل ترويسة X-API-Key أيضًا للمنصات التي لا تستطيع ضبط Authorization.

ما العملات التي تعيدها الواجهة؟

استدعاء /v1/latest واحد يعيد أسعار 144 عملة مقابل الأساس الذي تختاره. وتستطيع أيضًا التحويل بين أي زوج مدعوم عبر /v1/convert، بما في ذلك التقاطعات المثلثية.

هل الأسعار مناسبة لتنفيذ صفقات؟

لا. الأسعار إرشادية، منشورة للمرجعية والتحليل والعرض. ليست تسعيرة تداول. تصرّح كل استجابة بذلك في حقل notice.

تابع القراءة

ابدأ بمفتاح API مجاني

5,000 طلب شهريًا ضمن الخطة المجانية. لا حاجة إلى بطاقة ائتمان.

احصل على مفتاح مجاني