From 753cc4e486e9e9fcb95b8c4eaff084cc33e3703c Mon Sep 17 00:00:00 2001 From: serega404 Date: Thu, 8 Sep 2022 10:09:34 +0300 Subject: [PATCH] Code upload --- README.md | 28 +++++- grafana.json | 250 +++++++++++++++++++++++++++++++++++++++++++++++++++ grafana.png | Bin 0 -> 32790 bytes main.py | 55 ++++++++++++ 4 files changed, 332 insertions(+), 1 deletion(-) create mode 100644 grafana.json create mode 100644 grafana.png create mode 100644 main.py diff --git a/README.md b/README.md index e5126b7..873e827 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,28 @@ # MetricAliexpressExchangeRate -CSV экспортер курса Aliexpress и курса ЦБ РФ + +[![MIT License](https://img.shields.io/github/license/serega404/EasyESPRealy)](https://github.com/serega404/MetricAliexpressExchangeRate) + +Экспортер курса Aliexpress и ЦБ РФ + +Для сбора метрик я использую [Victoria Metric](https://github.com/VictoriaMetrics/VictoriaMetrics) в режиме CSV + +Особая благадарность сайту cbr-xml-daily.ru за предоставление данных с сайта cbr.ru + +### Запуск через Cron + +``` Cron +*/10 * * * * python3 /home/bots/KursExporter/main.py +``` + +### Отображение в Grafana + +Файл для импорта: [grafana.json](./grafana.json) + + +### Библиотеки + +* [BeautifulSoup](https://www.crummy.com/software/BeautifulSoup/) + +### Лицензия + +Распространяется под MIT License. Смотри файл [`LICENSE`](./LICENSE) для того что бы узнать подробности. diff --git a/grafana.json b/grafana.json new file mode 100644 index 0000000..37a9fea --- /dev/null +++ b/grafana.json @@ -0,0 +1,250 @@ +{ + "annotations": { + "list": [ + { + "builtIn": 1, + "datasource": { + "type": "grafana", + "uid": "-- Grafana --" + }, + "enable": true, + "hide": true, + "iconColor": "rgba(0, 211, 255, 1)", + "name": "Annotations & Alerts", + "target": { + "limit": 100, + "matchAny": false, + "tags": [], + "type": "dashboard" + }, + "type": "dashboard" + } + ] + }, + "editable": true, + "fiscalYearStartMonth": 0, + "graphTooltip": 0, + "id": 34, + "links": [], + "liveNow": false, + "panels": [ + { + "datasource": { + "type": "prometheus", + "uid": "RvWcMg1nk" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "#EAB839", + "value": 5 + }, + { + "color": "red", + "value": 10 + } + ] + }, + "unit": "currencyRUB" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 0 + }, + "id": 4, + "interval": "10m", + "options": { + "colorMode": "value", + "graphMode": "area", + "justifyMode": "auto", + "orientation": "auto", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "textMode": "auto" + }, + "pluginVersion": "9.1.1", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "RvWcMg1nk" + }, + "editorMode": "code", + "exemplar": false, + "expr": "last_over_time(exchange_usd_rub{source=\"Central Bank Of Russia\"}[1h])", + "format": "time_series", + "hide": false, + "instant": true, + "legendFormat": "CBRF", + "range": false, + "refId": "B" + }, + { + "datasource": { + "type": "prometheus", + "uid": "RvWcMg1nk" + }, + "editorMode": "code", + "exemplar": false, + "expr": "last_over_time(exchange_usd_rub{source=\"AliExpress\"}[1h])", + "format": "time_series", + "hide": false, + "instant": true, + "interval": "", + "legendFormat": "Ali", + "range": false, + "refId": "A" + } + ], + "title": "Разница", + "transformations": [ + { + "id": "calculateField", + "options": { + "mode": "reduceRow", + "reduce": { + "reducer": "diff" + }, + "replaceFields": true + } + } + ], + "type": "stat" + }, + { + "datasource": { + "type": "prometheus", + "uid": "RvWcMg1nk" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineStyle": { + "fill": "solid" + }, + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": true, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "decimals": 1, + "mappings": [], + "max": 100, + "min": 40, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + } + ] + }, + "unit": "currencyRUB" + }, + "overrides": [] + }, + "gridPos": { + "h": 9, + "w": 12, + "x": 0, + "y": 8 + }, + "id": 2, + "interval": "10m", + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "RvWcMg1nk" + }, + "editorMode": "code", + "expr": "exchange_usd_rub{}", + "legendFormat": "{{source}}", + "range": true, + "refId": "A" + } + ], + "title": "Курс доллара", + "type": "timeseries" + } + ], + "refresh": "5s", + "schemaVersion": 37, + "style": "dark", + "tags": [], + "templating": { + "list": [] + }, + "time": { + "from": "now-30m", + "to": "now" + }, + "timepicker": { + "hidden": false + }, + "timezone": "", + "title": "Курс AliExpress", + "uid": "ghA0PTGVk", + "version": 10, + "weekStart": "" +} \ No newline at end of file diff --git a/grafana.png b/grafana.png new file mode 100644 index 0000000000000000000000000000000000000000..dcad1ff94f925036f6f5300a6f559be361b9d7fb GIT binary patch literal 32790 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 R=#&a=Wnp);{K!wg{uj{P)sFxG literal 0 HcmV?d00001 diff --git a/main.py b/main.py new file mode 100644 index 0000000..424e5b1 --- /dev/null +++ b/main.py @@ -0,0 +1,55 @@ +import requests, re, json +from bs4 import BeautifulSoup + +# Config + +Ali1USDPageURL = 'https://aliexpress.ru/item/32892046259.html' +CBRFApiSiteURL = 'https://www.cbr-xml-daily.ru/daily_json.js' +MetricServerURL = 'http://192.168.0.100:8428/' + +KursAli = "" +KursCBRF = "" + +# Ali + +site = requests.get(Ali1USDPageURL) + +if (site.status_code != 200): + print("Ali request error: " + str(site.status_code)) + exit() + +soup = BeautifulSoup(site.text, "html.parser") + +for tag in soup.find_all("span", class_="product-price-current"): + KursAli = (''.join(x for x in tag.text if (x.isdigit() or x == ','))).replace(',','.') + +print("Курс Ali: " + KursAli) + +# ЦБ РФ + +site = requests.get(CBRFApiSiteURL) + +if (site.status_code != 200): + print("Kurs request error: " + str(site.status_code)) + exit() + +KursCBRF = str(json.loads(site.text)["Valute"]["USD"]["Value"]) +print("Курс ЦБ РФ: " + KursCBRF) + +# Send metrics ↓ + +url = MetricServerURL + 'api/v1/import/csv?format=1:label:source,2:metric:exchange_usd_rub' + +if KursCBRF != '': + x = requests.post(url, "Central Bank Of Russia," + KursCBRF) + if (x.status_code != 200 and x.status_code != 204): + print("Не удалось отправить метрику: " + str(x.status_code)) +else: + print("Курс ЦБ РФ пуст") + +if KursAli != '': + x = requests.post(url, "AliExpress," + KursAli) + if (x.status_code != 200 and x.status_code != 204): + print("Не удалось отправить метрику: " + str(x.status_code)) +else: + print("Курс Али пуст") \ No newline at end of file