Как это работает · Урок 3 из 4Для начинающих · 5 мин чтения
Откуда берутся курсы валют — и как сделать сайт, которому верят
Почему у каждого числа должны быть источник и дата, ловушка «10 KZT», которая ломает конвертеры, и как сайт работает, когда источник упал. На настоящих курсах.
🎯 Из этого урока вы узнаете
- кто устанавливает официальный курс сомони и откуда сайт его берёт
- почему числу без даты и источника нельзя верить
- ловушку «номинала», из-за которой конвертеры ошибаются в десять и сто раз
- как сайт продолжает показывать верные данные, когда источник не работает
Содержание
Вы хотите узнать, сколько сомони стоят ваши 100 долларов. Открываете сайт, видите число и верите ему. Но задумайтесь на секунду: почему вы ему верите? Кто сказал, что это число правильное? За какой оно день?
Этот урок — о доверии: откуда берутся числа на сайте и какие скучные, аккуратные решения делают их достойными доверия. Пример — Kursi Tojik, сайт, который я сделал: он показывает официальные курсы таджикского сомони.
Кто решает, какой курс?
Каждый рабочий день Национальный банк Таджикистана публикует официальные курсы: сколько сомони стоят один доллар, один евро, один рубль и другие валюты. Он размещает их на своём сайте nbt.tj, в том числе в виде, который могут читать программы.
Коммерческие банки устанавливают свои курсы покупки и продажи наличных — обычно немного отличающиеся от официального. Эти курсы Нацбанк тоже публикует.
Поэтому честный ответ на вопрос «откуда число?» простой: от Национального банка, на конкретную дату. Kursi Tojik не придумывает, не оценивает и не вбивает руками ни одного числа. Он копирует то, что публикует банк, и прямо говорит об этом.
Правило первое: у каждого числа есть источник и дата
В первой версии Kursi Tojik был «калькулятор комиссии за денежные переводы». Он выглядел полезным, а тарифы — настоящими. Но в файле данных за ним они назывались иллюстративными — примерами, а не реальными тарифами реальных компаний. Ещё там были курсы банков, вбитые руками, — они устаревают уже на следующее утро.
И то, и другое удалено. Не «улучшено» — удалено. Функция, которая не может указать на настоящий актуальный источник, хуже, чем никакой: люди принимают по ней денежные решения.
Ловушка номинала
Вот ошибка, которую легко сделать и трудно заметить. Для некоторых валют банк публикует цену не одной единицы, а десяти или ста. Один казахский тенге или один узбекский сум стоят так мало, что банк пишет «10 KZT = …» или «100 UZS = …». Это число — 10 или 100 — называется номиналом.
Если конвертер забудет про номинал, он ошибётся в десять или сто раз. Попробуйте на настоящих официальных курсах 2 октября 2026 года:
Попробуйте
Ловушка номинала
Нацбанк публикует некоторые курсы за 10 или 100 единиц. Выберите валюту и сумму.
Банк публикует
10 KZT = 0,2089 TJS
✗ Забыли номинал
1 000 × 0,2089 = 208,9 TJS
✓ Правильно
1 000 × 0,2089 ÷ 10 = 20,89 TJS
Официальные курсы Национального банка Таджикистана на 2 октября 2026 года. Сегодняшние курсы: kursi-tojik.pages.dev
Kursi Tojik всегда делит на номинал и показывает на табло «10 KZT» ровно так, как публикует банк, — чтобы вы сами могли сверить с источником.
Когда источник падает
Первая версия спрашивала курсы у сайта банка при каждом посещении. Звучит свежо и просто. Но когда nbt.tj работал медленно или был недоступен, Kursi Tojik показывал… ничего. Или, хуже, мог показать ноль.
Поэтому сайт перестроили вокруг собственного блокнота:
- Каждые три часа задание по расписанию (cron — таймер на сервере) заходит на nbt.tj и копирует новые курсы в небольшую базу данных.
- Сайт и Telegram-бот читают только из этой базы, никогда напрямую из банка.
- Если сайт банка не работает, в базе всё равно есть последний официальный курс — с его датой.
Выключите банк и сравните два подхода:
Попробуйте
Когда источник падает
A · Сайт А спрашивает банк при каждом посещении
USD = 9,2331 TJS
B · Сайт Б читает свою сохранённую копию
USD = 9,2331 TJS
официальный курс на 2 октября 2026 · источник nbt.tj
Это как семья, которая раз в день записывает расписание автобусов. Если сайт автобусной компании сломается, семья всё равно знает, когда придёт автобус, — и знает, что расписание сегодняшнее.
nbt.tj ──(каждые 3 ч)──▶ сборщик ──▶ база данных ◀── API ◀── сайт
◀── Telegram-ботМелочи, которые важны
- «Лучший» словом, а не только цветом. В таблице курсов наличных лучший курс покупки и продажи отмечен словом «лучший». Некоторые люди не различают зелёный и красный; слово работает для всех.
- Дата всегда на экране. Не спрятана в подсказке — рядом с числами.
- Три языка. По умолчанию таджикский, плюс русский и английский: курсы важны всем в стране и тем, кто присылает деньги из-за границы.
- Тот же приём, что в уроке 1. Бот Kursi Tojik понимает сообщения вроде «100 usd» — ровно то пошаговое чтение, которое вы пробовали в первом уроке.
Глубже: как это устроено
Весь сервис работает в сети Cloudflare:
- Worker — небольшая программа, которая работает на серверах Cloudflare по всему миру, — отвечает на запросы API и запускает сбор по расписанию;
- D1 — небольшая база данных SQLite в той же сети — хранит курсы, историю и курсы наличных в банках;
- сайт написан на чистом TypeScript без фреймворка, поэтому быстро загружается даже на слабом мобильном интернете.
Правило пересчёта в коде — одна строка, и именно о ней вся ловушка номинала:
// api/src/money.ts — сомони за одну единицу
export const perUnit = (rate: Rate) => rate.value / rate.nominal;Автоматические тесты запускаются при каждом изменении, поэтому ошибку вроде забытого номинала поймает тест раньше, чем её увидит посетитель.
Вывод для любого продукта с данными
Доверие в основном складывается из скучных решений:
- Называйте источник. Каждое число, каждый раз.
- Показывайте дату. Данные всегда «на какой-то момент».
- Убирайте то, что не можете доказать. Даже если выглядит красиво.
- Ошибайтесь громко. Понятное «не удалось загрузить» лучше тихого неверного числа.
Это верно для курсов валют, цен в магазине, расписания клиники или оценок в школе.
Проверьте себя
Попробуйте
Проверьте себя
1. Откуда Kursi Tojik берёт официальные курсы сомони?
2. Банк публикует «10 KZT = 0,2089 TJS». Сколько сомони стоят 1000 тенге?
3. Сайт банка не работает. Что должен показать хороший сайт курсов?
4. Почему удалили «калькулятор комиссии за переводы»?
5. Почему в таблице банков написано «лучший», а не только используется зелёный цвет?
Маленький словарь
- Официальный курс — курс, который Национальный банк публикует на дату.
- Курс наличных — цена, по которой коммерческий банк покупает или продаёт наличные.
- Номинал — за сколько единиц валюты указан опубликованный курс (1, 10 или 100).
- Источник — откуда взято число.
- Cron-задание — задача, которую сервер выполняет по расписанию, например каждые три часа.
- База данных — аккуратный блокнот сайта, где он хранит собранные данные.
- Кэш / сохранённая копия — данные, которые держат под рукой, чтобы не спрашивать источник каждый раз.
Нужны числа, которым верят?
Цены, расписания, курсы, отчёты — если ваш сайт или бот показывает числа, я сделаю их с источником, датой и надёжными, на таджикском, русском и английском. Живой пример: kursi-tojik.pages.dev. Пишите: @SimorghDev.