Получение курсов валют с сайта Центробанка. Курсы валют api
Курсы валют и котировки металлов
currencyTypeИностранная валюта, для которой предоставляется курс обмена.
{ "properties": { "392": { "description": "Иена", "$ref": "#\/definitions\/amountType" }, "756": { "description": "Швейцарский франк", "$ref": "#\/definitions\/amountType" }, "826": { "description": "Фунт стерлингов", "$ref": "#\/definitions\/amountType" }, "840": { "description": "Доллар США", "$ref": "#\/definitions\/amountType" }, "978": { "description": "Евро", "$ref": "#\/definitions\/amountType" }, "A98": { "description": "Золото в граммах", "$ref": "#\/definitions\/amountType" }, "A99": { "description": "Серебро в граммах", "$ref": "#\/definitions\/amountType" }, "A76": { "description": "Платина в граммах", "$ref": "#\/definitions\/amountType" }, "A33": { "description": "Палладий в граммах", "$ref": "#\/definitions\/amountType" } }, "additionalProperties": false } сategoryTypeКатегории обслуживания клиентов
{ "type": "object", "properties": { "first": { "description": "Курсы применяются при совершении операций покупки\/продажи валюты клиентами — держателями пакета услуг Сбербанк Первый", "$ref": "#\/definitions\/currencyType" }, "premium": { "description": "Курсы применяются при совершении операций покупки\/продажи валюты клиентами — держателями пакета услуг Сбербанк Премьер", "$ref": "#\/definitions\/currencyType" }, "beznal": { "description": "Курсы для дистанционных каналов и карт", "$ref": "#\/definitions\/currencyType" }, "base": { "description": "Курсы в отделениях для наличных и безналичных (некарточных) конверсий", "$ref": "#\/definitions\/currencyType" } } } amountTypeКоличество обмениваемых
{ "type": "object", "properties": { "0": { "description": "Курсы обмена для сумм до 999.99 рублей", "$ref": "#\/definitions\/rateType" }, "1000": { "description": "Курсы обмена для сумм от 1000 до 9999999999.99 рублей", "$ref": "#\/definitions\/rateType" } }, "required": [ "0" ] } rateTypeКурс покупки/продажи валюты или металла на указанную дату
{ "properties": { "isoCur": { "type": "string", "example": "EUR", "description": "Код валюты ISO" }, "currencyName": { "type": "string", "example": "Евро", "description": "Наименование валюты\/металла (рус.)" }, "currencyNameEng": { "type": "string", "example": "Euro", "description": "Наименование валюты\/металла (англ.)" }, "rateType": { "type": "string", "example": "CURRENCY", "enum": [ "CURRENCY", "METAL" ], "description": "Тип курса (CURRENCY, METAL)" }, "categoryCode": { "type": "string", "example": "base", "description": "Категория обслуживания (отделения, дистанционные каналы и карты, клиенты с пакетами услуг Премьер, Первый)" }, "scale": { "type": "string", "example": "1", "description": "Масштаб валюты (1,100)" }, "buyValue": { "type": "string", "example": "59.26", "description": "Курс покупки" }, "sellValue": { "type": "string", "example": "62.76", "description": "Курс продажи" }, "activeFrom": { "type": "string", "example": "1493009100000", "description": "Дата и время с точностью до секунды в миллисекундах (Unix timestamp*1000)" }, "buyValuePrev": { "type": "number", "example": 58.82, "description": "Предыдущий курс покупки", "format": "float" }, "sellValuePrev": { "type": "number", "example": 62.32, "description": "Предыдущий курс продажи", "format": "float" }, "amountFrom": { "type": "number", "example": 0, "description": "Действительно для суммы от", "format": "float" }, "amountTo": { "type": "number", "example": 999.99, "description": "Действительно для суммы до", "format": "float" } }, "additionalProperties": true }dev-eyufrolovichevasberbankru-dev.developer.eu.apiconnect.ibmcloud.com
Как я попал в Топ AppStore с простым приложением курса валют / Хабр
Резюме
Я хочу рассказать о том, как создал вполне заурядное и совсем не инновационное приложение, которое объективно стало лучшим в своём роде и даже некоторое время пребывало на самой вершине топа. Это не история успеха и не руководство к действию. Я просто хочу рассказать, как у меня получилось сделать самое популярное приложение в своём сегменте. Основные тезисы следующие:- Если вы чётко осознали, что на рынке нет достойного решения вашей реальной проблемы, нужно всерьёз задуматься о создании такого решения;
- Графический интерфейс пользователя — это самая важная часть приложения;
- Даже самое простое приложение может стать очень популярным;
- Даже самое простое приложение может приносить прибыль;
- Не стоит тратить деньги на отзывы в AppStore;
- Реклама в приложениях это не так уж плохо.
Как я решил сделать приложение
Мы с женой собрались в отпуск за границу. В очередной раз предо мной встала задача покупки валюты по выгодному курсу. Разница цены доллара или евро в 1 рубль даёт 1000 сэкономленных рублей за каждую 1000 купленных долларов или евро. Поэтому я каждый день тратил некоторое время на мониторинг курса валют ЦБ РФ и коммерческих банков Москвы на сайте exocur. Курс Центрального Банка задавал общую тенденцию, а в коммерческих банках можно было произвести настоящий обмен валюты. Если валюта дешевела на протяжении нескольких дней, я шёл в банк с самым выгодным курсом за покупкой валюты.Жена использовала ПК, браузер и Яндекс, что для меня было диковато, ведь мобильный телефон позволяет обновлять информацию, не включая компьютер и вообще ты ж жена программиста. Почему-то только в прошлом году я догадался посмотреть, что предлагает AppStore для решения моих проблем. Вы знаете, в различные периоды жизни у меня было несколько разных идей, попытки реализовать которые я оставлял, найдя десяток готовых сервисов или приложений. Но в этот раз я и не думал создавать приложение, просто хотел решить свою проблему. И я даже не мог поверить — в AppStore нет приличного приложения для отслеживания курса валют! (Здесь и далее я выражаю только собственное мнение по отношению к чужому труду, и оно может отличаться от мнения других людей. Я лишь описываю свои эмоции).
Такое странное положение вещей я замечал лишь среди калькуляторов для айпада, там тоже всё плохо. Стандартный Stocks имеет ужасный интерфейс. Например, для получения курса доллара к рублю нужно ввести недружелюбную строку RUB=X, а евро к рублю — EURRUB=X. Другие приложения либо просто платные, либо ограниченно бесплатные, но за каждый чих просят денег, либо с рекламой. Какие-то приложения не обновляются больше года и застряли в эре скевоморфизма, другие — бесплатные, но нестабильно работающие, как пишут в отзывах, «студент сделал курсач».
Я сразу понял, что вот он, момент. Я хочу, чтобы приложение показывало динамику курса (график) и актуальное значение, ну и калькулятор для подсчётов. Я уже вижу все 2 или максимум 3 экрана приложения. Я точно знаю, что приложение будет лучшим, потому что искренне верю в то, что существующие аналоги никуда не годятся. Я полон энергии и решительности.
Конвенции
Решил, что передо мной стоит не самая сложная задача, но к ней необходимо подойти со всей серьёзностью. Поэтому я, начитавшись Хабра и бизнес-книг, выделил основные правила на время разработки.Работа
- Приходить на работу рано;
- Во сколько бы я ни пришёл, уходить в 17:30, максимум 18 часов, чтобы прибыть домой бодрым. Если возникнут сомнения, желание бесплатно переработать, вспомнить, что для меня важнее и засунуть сомнения подальше;
- Каждый будний вечер выделять час-полтора, а лучше 2 для работы над проектом;
- Не работать после 22, ну или хотя бы 23;
- Не снимать трубку от коллег по работе, когда меня нет на работе;
- Узнавать у родственников, что им будет от меня нужно на выходных и договариваться, в какое время я буду заниматься своими делами.
- Работать в git;
- Проектировать систему красиво и идеологически правильно. Чтобы такой код не стыдно было показать будущему работодателю, чтобы код был гибким и понятным;
- Никаких interface builder’ов;
- Интерфейсом должен заниматься дизайнер. Я — не дизайнер.
Общие требования
- Никакой рекламы;
- Приложение должно быть лёгким и быстрым;
- Приложение должно быть минималистичным и решать одну задачу — показывать динамику курса валют;
- Приложение нужно сделать быстро. Если где-то я забуксую, нужно упростить/забить: доработаю в очередном обновлении;
Как я его делал
Закон Парето сработал и со мной. До первого релиза было потрачено около полутора месяцев. До сих пор я никому не рассказывал — стеснялся. Основное потраченное впустую время ушло на попытки самостоятельно накидать и реализовать дизайн. Глупая затея. Ещё пару дней я ждал от дизайнера картинку для экрана запуска, которую в итоге сделал сам за 5 минут. Ещё куча времени ушла перестановку вьюшек местами. Одним словом, нужно сразу обращаться за помощью к профессионалу. Тем более раз уж я собрался сделать лучшее в своём роде приложение.Я обратился к знакомой дизайнеру за помощью, объяснив, как я вижу дизайн приложения, а сам занялся построением классов для сетевого взаимодействия, моделью данных, парсерами и т.д. Всевозможные идеи, которые приходили мне в голову, я старался как можно быстрее записывать в текстовый файл. Баги тоже записывал, чтобы ничего не забыть. Через некоторое время дизайнер приготовила несколько вариантов иконки. Результат был лучше моих ожиданий, и это добавляло энтузиазма. И нетерпения. Дизайна основного экрана я так и не дождался.
Я неоднокаратно нарушал собственные договоренности. Работал не каждый вечер, пару раз завис до глубокой ночи. Но я не могу сказать, что редкие нарушения правил сильно снижают эффективность. Если у вас болит голова, вечер лучше провести на прогулке. А если вы уже думаете о своём проекте и в туалете, и по пути на работу, и перед сном, что ж, дайте себе поработать.
Для отслеживания падений я интегрировал Crashlytics. Для сбора статистики использовал Mixpanel. Что делать со статистикой я тогда не знал. Просто хотел знать, как часто пользователи запускают приложение. Совет: забейте на статистику, если вы не знаете, что с ней делать. Когда придумаете, что вы хотите узнать про пользователей, тогда и добавите.
Несколько вечеров я потратил на изучение того, как реализовать некоторые детали дизайнерского интерфейса. Потом вспомнил про свои конвенции и понял, что эти детали мне дорого обходятся. Отложил их реализацию.
У меня родилось несколько идей по кастомизации приложения. В том числе я не знал, какой цвет выбрать для фона, какой период выбрать для графика, отображать ли даты на графике. Решил предоставить пользователям возможность выбрать эти настройки для себя. Но реализация таких настроек требовала времени. Тогда решил отложить эти задачи до следующего обновления.
Релиз и результаты
В какой-то момент решил, что минимально допустимый функционал реализован и можно нажать кнопку для сабмита приложения в магазин. Когда релиз случился, я выложил иконку в Instagram, сделал соответствующие посты во «Вконтакте» и Facebook. Написал сообщения со ссылками друзьям и знакомым разработчикам. Попросил родственников написать 5-звёздочные отзывы.Первая версия существовала примерно месяц и была загружена около 4 тыс раз. В рейтинге категории «Бизнес» я оказался выше других бесплатных конвертеров. Это вдохновляло. Однако чужих отзывов было с гулькин нос. Мой курс валют отображался в новых приложениях в AppStore, что увеличивало загрузки.
Crashlitycs и друзья с шаловливыми ручками нашли пару падений в стиле range check error. К тому же у меня ещё оставалось множество нереализованных фич. В следующем обновлении я доработал пользовательский интерфейс, но уже вылетел из новых. Приложение стало красивее, а загрузки уменьшились.
Также я решил добавить возможность пользователям писать мне письма с вопросами и предложениями. Создал почтовый аккаунт на Gmail и добавил учётку к себе на телефон. Это дало возможность очень оперативно отвечать людям на вопросы, отмечать жалобы и предложения и повышать лояльность пользователей. В частности, многие выражали недовольство редкостью обновления курса. Для таких пользователей я добавил пункт «О программе», в котором описал, как работает приложение и объяснил, что курс ЦБ обновляется один раз за рабочий день.
Признаюсь, никогда особо не интересовался рейтингом приложений в AppStore, но после релиза собственного приложения в течение нескольких месяцев, наверное, ежедневно проверял свой, а заодно и чужой рейтинг. За это время я увидел много приложений, которые откуда ни возьмись вырывались на 1 место топа категории «Бизнес», получали массу отзывов, а через 2-3 дня исчезали из топа навсегда. Наверное, это проплаченные отзывы, думал я.
Поинтересовался, сколько стоит такое удовольствие. Выяснил, что примерно 1$-3$ за 1 установку плюс 1 отзыв. Я не раз слышал о том, что нужно любыми силами попасть в Топ, что Топ — это замкнутый круг, из которого сложно выйти. Что ж, это брехня. После релиза ваше приложение попадает в категорию «Новые» — и это уже его продвигает. Если результат вас не удовлетворяет, платные отзывы, по моему мнению, последнее, о чём стоит думать. Вылететь из топа совсем не трудно. Уж лучше заплатить за обзор в интернете.
Встроенные покупки
Давно обратил внимание, что в топе кассовых находится Viber, который продаёт стикеры. Мне казалось это странным, но бесспорно работающим решением. Я решил, что можно сделать платным возможность устанавливать цвет темы для приложения. Заодно заблокировал настройку периода для отображения графика и настройку отображения дат на графике.Беспокойство небольшим количеством отзывов в AppStore помогло мне придумать схему. Продавать эти 3 настройки за 66 рублей, а если пользователь оценит приложение, то ему будет предоставлена 50% скидка. Гениально, да? Apple завернули мою супер идею, пригрозив забанить за нечестную накрутку рейтинга.
Мне не хватало серьёзности по отношению к своему продукту. Казалось, что и 33 рубля — это дорого. Так что для разблокировки этих 3 настроек требовалось заплатить 33 рубля. Такая встроенная покупка приносила от 36$ до 64$ ежемесячно. Если честно, я надеялся, что будет получаться хотя бы 20 тысяч рублей.
Последующие версии в течении около 3 месяцев загружались по 2000-3000 раз в месяц. Я был огорчён таким результатом, утешая себя мыслями, что это всего лишь конвертер.
Реклама
В какой-то момент на меня вышло рекламное агентство с предложением отображать у себя в приложении рекламу. Я не хотел портить своё приложение рекламой, но, немного подумав, посчитал, что это может приносить примерно 3000 рублей в месяц. И вообще что-то я мало экспериментирую. 3000 руб — немало по сравнению с доходами от встроенных покупок и очень мало по сравнению с зарплатой и стоимостью хотя бы проживания.В очередном обновлении добавил ещё 2 встроенные покупки: отключение рекламы за 33 рубля и полный доступ за 66 рублей, который агрегировал две 33-рублёвые покупки. СДК рекламного агентства работало ужасно. У них отображалась какая-то заглушка, а показы не трекались. Но! Доход за 1 месяц превысил 150$, а за второй — 200$! Это был успех! Я понял несколько важных вещей. Во-первых, те, кому приглянулось приложение, готовы заплатить и 66 рублей. А может, и больше? Во-вторых, реклама, если её сделать не очень назойливой (у меня она отображается при запуске приложения, а не при каждом подъёме из фона), тоже приносит свои плоды.
С рекламодателем и его СДК я разобрался и вскоре стал получать прибыль с рекламы. Если пользователи не перестают запускать приложение, их количество с каждым днём только увеличивается, следовательно, увеличивается и количество показов рекламы. Это означает, что за рекламу вы будете получать прибыль по очень грубой оценке не меньшую, чем за предыдущий период. В результате к концу года реклама стала приносить от 1500 до 3500 рублей ежедневно.
Взлёт
В ноябре началась стремительная девальвация рубля. Это подогрело интерес ко всем аналогичным приложениям в магазине и к моему приложению в частности. Я оказался на первом месте в топе бесплатных категории «Бизнес» и стал маячить в топе кассовых. В декабре скорость изменения курса рубля зашкаливала. Зашкаливали и загрузки приложения. Сначала я попал в Топ 100 бесплатных всего AppStore, затем заметил, что ежедневный доход превышает 100$. Потом знакомые стали шутить, что у людей горе, а мне хорошо. Взлёт был поистине ошеломительный! Картинки вместо тысячи слов:Март-ноябрь
Март-декабрь
Замечу, что к приложениям из топа у пользователей особое отношение. Баги и недочёты рассматриваются чуть ли не как личные оскорбления. Многие популярные приложения (VK App, приложения Яндекса, Facebook) получают сотни, тысячи колов и гневных отзывов. Вот и моё приложение со средней оценкой 4.5 звёзды стало лишь 3.5-звёздочным. Вышесказанное не означает, что можно расслабиться или что рейтинг не ничего не значит. Клиент практически всегда прав. И многие колы и двойки моему приложению содержат обоснованную критику. Просто в Топе всё серьёзнее. Здесь нет права на падения или глюки.
Перспектива
Я не бизнесмен и не маркетолог. Но иногда общаюсь с ними. Один такой знакомый озвучил свои замечания. Покупки должны предлагаться пользователю без отрыва от контекста. Отключение рекламы нужно предлагать при показе рекламы. Разблокировать настройки — при попытке нажать на заблокированную ячейку. Были и другие советы в сторону повышения конверсии.Вывод банален: общайтесь и учитесь у успешных бизнесменов.
Кроме того, пользователи давно просят меня сделать виджет. Пуши практически работают, но товарищ, помогающий с серверной частью, забуксовал. Я уже подумываю в сторону специализированных сервисов. В общем, пуши будут.
Некоторые пользователи просят курс сырья (нефть, газ). Есть, над чем задуматься.
Кроме того, получен бесценный опыт развития приложения с нуля и до вершины (пусть и не финансовой), который можно применять в других проектах.
Итоги
У меня была простая проблема. Существовавшие решения меня не устраивали и я создал своё решение, которое стало лучшим. Решение простейшее, можно сказать, примитивное. Но очень полезное. Очень приятно осознавать, что ты сделал что-то полезное, что-то для людей.У меня сформировалось мнение, что если у вас есть проблема, а существующие решения вы находите недостаточно удобными или откровенно неудачными, это повод задуматься над собственным велосипедом. Тут главное чётко понимать, почему существующие решения настолько неудачны, что вам пора показать всем, как решать такие задачи.
С релизом я поспешил, не уделив должного внимания дизайну. Попадание в раздел «Новые» даёт ощутимую помощь.
Я изменил своё отношение к рекламе в приложениях. Она позволяет простому разработчику получать хоть небольшую, но прибыль. Важно не переборщить.
Встроенные покупки, при умелом использовании, способны приносить деньги, достаточные, как минимум, для самоокупаемости, а в перспективе и для ощутимого довеска к вашим доходам.
Да и само приложение, даже самое простое, развиваясь может приносить ощутимый доход.
В результате мое приложение больше месяца удерживает первое место в Топе бесплатных категории Бизнес, 2 дня занимал первое место во всех категориях. Мне даже предлагали продать своё приложение. О приложении написали 2 микрообзора, в одном из которых назвали одним из лучших в прошедшем году. Даже появился один клон, о котором в данный момент я ругаюсь веду переписку с Apple.
Жизнь показывает, что умение правильно продавать, за правильную цену, в правильный момент, может принести прибыль даже самому простому приложению.
habr.com
Парсим курсы валют с сайта Центробанка
При разработке интернет-магазинов или различных информеров для сайтов часто приходится реализовывать получение актуальных курсов валют. Не все разработчики знают, что достаточно удобно получать курсы на любую дату используя API сайта Центрального банка РФ.
Курсы на сутки вперёд доступны в формате XML по адресу
http://www.cbr.ru/scripts/XML_daily.aspДля получения данных на любую прошедшую дату нужно воспользоваться параметром date_req
http://www.cbr.ru/scripts/XML_daily.asp?date_req=12.07.2012Теперь на нашем сайте нам достаточно распарсить XML файл и выбрать нужные валюты. Для выбора элементов из дерева можно использовать DOM или другие расширения для работы с XML.
Напишем класс, загружающий данные о курсах валют:
@author [email protected] @link http://www.elisdn.ru class CBRAgent { protected $list = array(); public function load() { $xml = new DOMDocument(); $url = 'http://www.cbr.ru/scripts/XML_daily.asp?date_req=' . date('d.m.Y'); if (@$xml->load($url)) { $this->list = array(); $root = $xml->documentElement; $items = $root->getElementsByTagName('Valute'); foreach ($items as $item) { $code = $item->getElementsByTagName('CharCode')->item(0)->nodeValue; $curs = $item->getElementsByTagName('Value')->item(0)->nodeValue; $this->list[$code] = floatval(str_replace(',', '.', $curs)); } return true; } else return false; } public function get($cur) { return isset($this->list[$cur]) ? $this->list[$cur] : 0; } }Теперь мы можем загружать и считывать значения курса любой валюты относительно рубля:
$cbr = new CBRAgent(); if ($cbr->load()){ $usd_curs = $cbr->get('USD'); }Обновление курсов нескольких валют в Yii Framework может, например, выглядеть так:
public function updateCurrencies() { $cbr = new CBRAgent(); if ($cbr->load()) { $models = Currency::model()->findAll() foreach ($models as $model) { $model->curs = $cbr->get($model->name); $model->save(); } } }или так:
public function updateCurrencies() { $cbr = new CBRAgent(); if ($cbr->load()) { $currencies = array('USD', 'EUR'); foreach($currencies as $currency) { Yii::app()->config->set('SHOP.CURS_' . $currency, $cbr->get($currency)); } } }если хранение курсов производится в каком-либо компоненте.
Этот метод можно поместить в контроллер магазина и вызывать по таймауту или поместить в консольную команду и вызывать по Cron.
elisdn.ru