Upload files to "/"

This commit is contained in:
2026-05-23 15:11:39 +00:00
commit a808355f00
5 changed files with 196 additions and 0 deletions

39
CurrencyAnalyzer.java Normal file
View File

@@ -0,0 +1,39 @@
public class CurrencyAnalyzer {
private static double lastValue = -1;
public static void analyze(double current) {
if (lastValue == -1) {
lastValue = current;
// Уведомление при запуске
String startMsg = "✅ <b>Мониторинг курса USD запущен</b>\n" +
"Текущий курс: <b>" + current + "</b> ₽";
TelegramNotifier.sendMessage(startMsg);
System.out.println("Начальное значение USD: " + current);
return;
}
String changeMsg = "";
if (current > lastValue) {
changeMsg = "📈 Курс доллара <b>вырос ↑</b>";
} else if (current < lastValue) {
changeMsg = "📉 Курс доллара <b>упал ↓</b>";
} else {
return; // без изменений — не спамим
}
// Уведомление в Telegram
String telegramMsg = changeMsg + "\n" +
"Было: <b>" + lastValue + "</b> ₽\n" +
"Стало: <b>" + current + "</b> ₽";
TelegramNotifier.sendMessage(telegramMsg);
// Вывод в консоль (чистый текст)
System.out.println(changeMsg.replace("<b>", "").replace("</b>", "") +
" (было " + lastValue + ", стало " + current + ")");
lastValue = current;
}
}

38
CurrencyParser.java Normal file
View File

@@ -0,0 +1,38 @@
import java.util.regex.*;
public class CurrencyParser {
/**
* Парсит курс USD с актуальной страницы ЦБ
* РФ[](https://cbr.ru/currency_base/daily/)
* Структура: таблица с строкой
* <tr>
* <td>840</td>
* <td>USD</td>...
* <td>76,0535</td>
* </tr>
*/
public static double parseUSD(String html) {
// Более точный и надёжный regex под текущую верстку сайта
Pattern pattern = Pattern.compile(
"<td>USD</td>\\s*" +
"<td>1</td>\\s*" +
"<td>Доллар США</td>\\s*" +
"<td>([0-9,]+)</td>",
Pattern.DOTALL | Pattern.CASE_INSENSITIVE);
Matcher matcher = pattern.matcher(html);
if (matcher.find()) {
String rateStr = matcher.group(1).replace(',', '.'); // заменяем запятую на точку
try {
return Double.parseDouble(rateStr);
} catch (NumberFormatException e) {
System.err.println("Ошибка парсинга числа: " + matcher.group(1));
}
}
return -1; // не удалось найти
}
}

34
Main.java Normal file
View File

@@ -0,0 +1,34 @@
public class Main {
public static void main(String[] args) {
String botToken = "8586609598:AAHRN6eqpkqCOP4xjX_FH20jdpjbJncmqBY";
String chatId = "462049828";
TelegramNotifier.init(botToken, chatId);
System.out.println("Telegram-уведомления активированы!");
String url = "https://cbr.ru/currency_base/daily/";
while (true) {
try {
String html = WebLoader.loadPage(url);
double usd = CurrencyParser.parseUSD(html);
if (usd != -1) {
System.out.println("USD: " + usd);
ExcelWriter.write(usd);
CurrencyAnalyzer.analyze(usd);
} else {
System.err.println("Не удалось спарсить курс USD");
}
Thread.sleep(60 * 1000);
} catch (Exception e) {
e.printStackTrace();
}
}
}
}

52
TelegramNotifier.java Normal file
View File

@@ -0,0 +1,52 @@
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
public class TelegramNotifier {
private static String botToken;
private static String chatId;
/**
* Инициализация бота один раз в начале программы
*/
public static void init(String token, String chatId) {
TelegramNotifier.botToken = token;
TelegramNotifier.chatId = chatId;
}
/**
* Отправка сообщения в Telegram
*/
public static void sendMessage(String text) {
if (botToken == null || chatId == null || botToken.isEmpty() || chatId.isEmpty()) {
return; // если не настроено — тихо пропускаем
}
try {
String encodedText = URLEncoder.encode(text, StandardCharsets.UTF_8);
String urlString = "https://api.telegram.org/bot" + botToken +
"/sendMessage?chat_id=" + chatId +
"&text=" + encodedText +
"&parse_mode=HTML";
URL url = new URL(urlString);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("GET");
conn.setConnectTimeout(10000);
conn.setReadTimeout(10000);
int responseCode = conn.getResponseCode();
if (responseCode != 200) {
System.err.println("Ошибка Telegram API: " + responseCode);
}
} catch (Exception e) {
System.err.println("Не удалось отправить сообщение в Telegram:");
e.printStackTrace();
}
}
}

33
WebLoader.java Normal file
View File

@@ -0,0 +1,33 @@
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.nio.charset.StandardCharsets;
public class WebLoader {
public static String loadPage(String urlString) {
StringBuilder result = new StringBuilder();
try {
URL url = new URL(urlString);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("GET");
conn.setRequestProperty("User-Agent", "Mozilla/5.0"); // чтобы сайт не блокировал
try (BufferedReader reader = new BufferedReader(
new InputStreamReader(conn.getInputStream(), StandardCharsets.UTF_8))) {
String line;
while ((line = reader.readLine()) != null) {
result.append(line).append("\n");
}
}
} catch (Exception e) {
e.printStackTrace();
}
return result.toString();
}
}