ایزی ریت
ورود / ثبت‌نامورود

دریافت قیمت دلار با پایتون؛ آموزش قدم‌به‌قدم قیمت دلار و تتر با requests

دریافت قیمت دلار با پایتون از API بازار آزاد: نصب requests، ارسال کلید، خواندن JSON، تبدیل به ریال، ذخیره در CSV و هشدار تغییر قیمت؛ با کد آمادهٔ اجرا.

عرفان فضلی
· کارشناس توسعه و برنامه نویسی
انتشار ۲۸ مهر ۱۴۰۵، ۱۶:۰۰ · ۵ دقیقه مطالعه
دریافت قیمت دلار با پایتون؛ آموزش قدم‌به‌قدم قیمت دلار و تتر با requests
خلاصه در سه خط
  • با کتابخانهٔ requests و یک درخواست GET به api.ezrate.me/v1/rates قیمت دلار و تتر را به‌صورت JSON می‌گیرید.
  • کلید را از متغیر محیطی بخوانید، timeout تعیین کنید و خطای 429 را جدا مدیریت کنید.
  • با چند خط اضافه، نرخ‌ها را در CSV ذخیره کنید یا وقتی دلار از عدد دلخواه عبور کرد، پیام بگیرید.

پایتون سریع‌ترین راه برای کار با داده‌های قیمت است: یک اسکریپت ده‌خطی کافی است تا هر صبح نرخ دلار و تتر را بخوانید، در فایل ذخیره کنید یا اگر از حد مشخصی گذشت، خبرتان کند. در این آموزش دریافت قیمت دلار با پایتون را از نصب کتابخانه تا اسکریپت کامل با مدیریت خطا جلو می‌بریم.

★
پاسخ کوتاه
با requests.get("https://api.ezrate.me/v1/rates", params={"symbols": "usd,usdt"}, headers={"X-API-Key": KEY}, timeout=10) قیمت دلار و تتر را بگیرید و از r.json()["data"] فیلدهای buy و sell را بخوانید. قیمت‌ها پیش‌فرض به تومان‌اند.

این آموزش بخشی از راهنمای کامل API قیمت ارز و طلا است؛ اگر هنوز کلید ندارید، اول بخش «ساخت کلید API» آن راهنما را بخوانید.

آماده‌سازی محیط

به پایتون ۳٫۹ یا جدیدتر و کتابخانهٔ requests نیاز دارید. بهتر است پروژه را در یک محیط مجازی بسازید:

bash
python3 -m venv venv
source venv/bin/activate        # در ویندوز: venv\Scripts\activate
pip install requests
export EZRATE_KEY="ezr_live_…"   # در ویندوز: set EZRATE_KEY=ezr_live_…
!
هشدار
کلید را هیچ‌وقت داخل فایل .py ننویسید. اگر کد را در گیت‌هاب بگذارید، ربات‌ها ظرف چند دقیقه کلیدهای افشاشده را پیدا می‌کنند.

اولین اسکریپت: قیمت دلار و تتر

python
import os
import requests

API = "https://api.ezrate.me/v1"
KEY = os.environ["EZRATE_KEY"]

r = requests.get(
    f"{API}/rates",
    params={"symbols": "usd,usdt", "lang": "fa"},
    headers={"X-API-Key": KEY},
    timeout=10,
)
r.raise_for_status()

for item in r.json()["data"]:
    print(f"{item['name']}: خرید {item['buy']:,} | فروش {item['sell']:,} تومان "
          f"({item['change_pct']:+.2f}٪، {item['sources']} منبع)")

خروجی دو خط است: نام دارایی، نرخ خرید و فروش با جداکنندهٔ هزارگان، درصد تغییر ۲۴ ساعت و تعداد منابع. فیلد sources را جدی بگیرید؛ اگر عددش کم است یا low_sources مقدار true دارد، یعنی در آن ساعت بازار خلوت بوده است.

خروجی اسکریپت پایتون دریافت قیمت دلار و تتر در ترمینال
اجرای اسکریپت و خروجی قیمت دلار و تتر

قیمت به ریال یا بر حسب تتر

اگر نرم‌افزار شما ریالی است، quote را عوض کنید. برای قیمت رمزارزها بر حسب تتر هم همین پارامتر کافی است:

python
def rates(symbols, quote="IRT"):
    r = requests.get(f"{API}/rates", params={"symbols": symbols, "quote": quote},
                     headers={"X-API-Key": KEY}, timeout=10)
    r.raise_for_status()
    return {x["symbol"]: x for x in r.json()["data"]}

print(rates("usd", quote="IRR")["usd"]["sell"])       # دلار به ریال
print(rates("btc,eth", quote="USDT")["btc"]["sell"])  # بیت‌کوین بر حسب تتر

مدیریت خطا به شکل حرفه‌ای

اسکریپتی که هر چند دقیقه اجرا می‌شود، دیر یا زود با قطعی اینترنت یا تمام شدن سهمیه روبه‌رو می‌شود. نسخهٔ قابل اتکا این‌طور است:

python
import time

def fetch_rates(symbols, retries=3):
    for attempt in range(retries):
        try:
            r = requests.get(f"{API}/rates", params={"symbols": symbols},
                             headers={"X-API-Key": KEY}, timeout=10)
        except requests.RequestException:
            time.sleep(2 ** attempt)          # 1s، 2s، 4s
            continue
        if r.status_code == 401:
            raise SystemExit("کلید نامعتبر است؛ پنل کاربری را بررسی کنید.")
        if r.status_code == 429:
            reset = r.json().get("meta", {}).get("reset_at")
            raise RuntimeError(f"سهمیه تمام شده؛ بازشدن: {reset}")
        if r.status_code >= 500:
            time.sleep(2 ** attempt)
            continue
        r.raise_for_status()
        return r.json()["data"]
    raise RuntimeError("API در دسترس نیست؛ آخرین نرخ ذخیره‌شده را استفاده کنید.")

منطق هر کد خطا در مدیریت خطا و Rate Limit در APIهای مالی توضیح داده شده است.

ذخیرهٔ روزانه در فایل CSV

برای داشتن آرشیو شخصی، کافی است اسکریپت را روزی یک‌بار اجرا کنید و نتیجه را به فایل اضافه کنید:

python
import csv, datetime

data = fetch_rates("usd,usdt,g18,emami")
today = datetime.date.today().isoformat()
with open("rates.csv", "a", newline="", encoding="utf-8") as f:
    w = csv.writer(f)
    for x in data:
        w.writerow([today, x["symbol"], x["buy"], x["sell"], x["sources"]])

اگر دادهٔ گذشته را هم می‌خواهید، لازم نیست ماه‌ها صبر کنید: مسیر history کندل‌های روزانه را یک‌جا می‌دهد. آموزش آن در دیتای تاریخی قیمت دلار و طلا آمده است.

هشدار ساده وقتی دلار از عدد دلخواه عبور کرد

python
TARGET = 0   # عدد دلخواه خود را به تومان بنویسید

usd = {x["symbol"]: x for x in fetch_rates("usd")}["usd"]
if usd["sell"] >= TARGET:
    print(f"دلار به {usd['sell']:,} تومان رسید.")
    # اینجا می‌توانید ایمیل یا پیام تلگرام بفرستید

این اسکریپت را با cron (لینوکس) یا Task Scheduler (ویندوز) هر ده دقیقه اجرا کنید. اگر فقط هشدار شخصی می‌خواهید و برنامه‌نویسی برایتان هدف نیست، هشدار قیمت EZRate همین کار را بدون کد با ایمیل، تلگرام یا اعلان مرورگر انجام می‌دهد.

چند توصیهٔ عملی

  • فاصلهٔ اجرای اسکریپت را از meta.freshness_sec کمتر نکنید؛ درخواست بیشتر عدد تازه‌تری نمی‌دهد و فقط سهمیه مصرف می‌کند.
  • برای چند نماد یک درخواست بفرستید (symbols=usd,eur,aed) نه چند درخواست جدا.
  • در داده‌های ذخیره‌شده واحد را ثبت کنید (quote) تا بعدها تومان و ریال قاطی نشوند.
  • نسخهٔ انگلیسی همین آموزش با مثال جنگو در USD to IRR API in Python & Django آمده است.
دلار آمریکا۲۶۳٬۷۳۰تومان+۰٫۲۱٪

مقایسهٔ دلار و تتر در یک اسکریپت

یکی از کاربردهای جالب این داده، دیدن فاصلهٔ قیمت تتر و دلار است. معمولاً این دو نزدیک هم حرکت می‌کنند، اما در روزهای تعطیل یا هیجانی فاصله باز می‌شود. چرایی این رفتار در نقش تتر در کشف قیمت دلار آمده؛ اینجا فقط محاسبه را می‌بینیم:

python
d = {x["symbol"]: x for x in fetch_rates("usd,usdt")}
gap = (d["usdt"]["sell"] - d["usd"]["sell"]) / d["usd"]["sell"] * 100
print(f"اختلاف تتر با دلار آزاد: {gap:+.2f}٪")

اگر این عدد را هر ساعت در فایل ذخیره کنید، بعد از چند هفته نمودار جالبی از رفتار بازار دارید. برای آرشیو طولانی‌تر، کندل‌های روزانهٔ هر دو را از history بگیرید و با هم مقایسه کنید.

تحلیل سریع با pandas

اگر با داده‌ها کار تحلیلی می‌کنید، pandas کار را خیلی کوتاه می‌کند. نمونهٔ زیر کندل‌های روزانهٔ دلار را می‌گیرد، میانگین متحرک ۷ روزه حساب می‌کند و بیشترین تغییر روزانه را پیدا می‌کند:

python
import pandas as pd

r = requests.get(f"{API}/history/usd", params={"interval": "1d", "from": "2026-07-01"},
                 headers={"X-API-Key": KEY}, timeout=15)
df = pd.DataFrame(r.json()["data"])
df["t"] = pd.to_datetime(df["t"])
df = df.set_index("t")
df["ma7"] = df["c"].rolling(7).mean()
df["chg"] = df["c"].pct_change() * 100
print(df[["c", "ma7", "chg"]].tail(10))
print("بیشترین رشد روزانه:", df["chg"].idxmax().date(), round(df["chg"].max(), 2), "٪")

ستون‌های o، h، l و c به ترتیب قیمت باز، بیشترین، کمترین و بسته شدن هر روز هستند. عمق تاریخچه به پلن شما بستگی دارد.

زمان‌بندی اجرا با cron

در لینوکس، با crontab -e یک خط اضافه کنید تا اسکریپت هر ۱۰ دقیقه اجرا شود. متغیر محیطی کلید را هم در همان خط یا در فایل جدا تعریف کنید، چون cron متغیرهای محیطی ترمینال شما را نمی‌بیند:

bash
*/10 * * * * EZRATE_KEY=ezr_live_… /home/me/venv/bin/python /home/me/rates.py >> /home/me/rates.log 2>&1

در ویندوز همین کار با Task Scheduler انجام می‌شود: یک Task جدید بسازید، در بخش Action مسیر python.exe و آدرس اسکریپت را بدهید و در Trigger تکرار هر ۱۰ دقیقه را تنظیم کنید.

نمایش اعداد فارسی و جداکنندهٔ هزارگان

API عدد خام برمی‌گرداند تا شما هر قالبی خواستید بسازید. برای خروجی فارسی، ارقام را تبدیل کنید:

python
FA = str.maketrans("0123456789,", "۰۱۲۳۴۵۶۷۸۹٬")
def fa_num(n: int) -> str:
    return f"{n:,}".translate(FA)

print(fa_num(1234567))   # ۱٬۲۳۴٬۵۶۷
نمودار قیمت روزانهٔ دلار ساخته‌شده با pandas و matplotlib
تحلیل کندل‌های روزانهٔ دلار در پایتون

نرخ‌های لحظه‌ای مرتبط با این مطلب: قیمت دلار، قیمت تتر، قیمت طلای ۱۸ عیار.

برای دریافت قیمت دلار با پایتون کدام کتابخانه بهتر است؟
requests برای اسکریپت‌های معمولی کافی است. اگر برنامهٔ شما async است، از httpx یا aiohttp استفاده کنید؛ آدرس و هدرها همان است.
چرا عدد پایتون با عدد سایت کمی فرق دارد؟
اگر پلن شما تازگی کمتری دارد، پاسخ API چند ثانیه یا چند دقیقه از صفحهٔ سایت عقب‌تر است. فیلد updated_at زمان دقیق عدد را نشان می‌دهد.
می‌توانم با پایتون قیمت تتر را بر حسب دلار هم بگیرم؟
بله. در پاسخ رمزارزها فیلد usd قیمت دلاری را نشان می‌دهد و با quote=usd همهٔ قیمت‌ها بر حسب دلار بازار آزاد برمی‌گردند.
اسکریپت را هر چند دقیقه اجرا کنم؟
برای کارهای شخصی هر ۵ تا ۱۵ دقیقه کافی است. هیچ‌وقت کمتر از freshness_sec پلن خود درخواست نفرستید.
عرفان فضلی
من در حوزه توسعه نرم‌افزار و برنامه‌نویسی فعالیت می‌کنم و به طراحی و پیاده‌سازی راهکارهای کاربردی و بهینه علاقه‌مندم. تمرکز من بر توسعه قابلیت‌های جدید، بهبود عملکرد سیستم‌ها و حل چالش‌های فنی با استفاده از فناوری‌های روز است. در مسیر کاری خود تلاش می‌کنم با یادگیری مستمر و به‌کارگیری روش‌های نوین برنامه‌نویسی، محصولات نرم‌افزاری کارآمد، پایدار و قابل‌اعتماد توسعه دهم.
همهٔ مطالب نویسنده ←

نظرات (۰)

نظرها پس از تأیید نمایش داده می‌شوند؛ برای ارسال، ورود به حساب لازم است.

مطالب مرتبط

API و برنامه‌نویسی
آموزش API قیمت ارز و طلا؛ راهنمای کامل وب‌سرویس نرخ لحظه‌ای برای توسعه‌دهندگان
طلا و سکه
تفاوت سکه امامی و بهار آزادی؛ چرا سکهٔ طرح قدیم ارزان‌تر است و کدام را بخریم؟
ابزار صرافی و طلافروشی
ابزار نمایش قیمت ارز و طلا برای سایت، تلگرام، مغازه و فروشگاه؛ راهنمای جامع