Upload files to "/"
This commit is contained in:
39
CurrencyAnalyzer.java
Normal file
39
CurrencyAnalyzer.java
Normal 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
38
CurrencyParser.java
Normal 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
34
Main.java
Normal 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
52
TelegramNotifier.java
Normal 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
33
WebLoader.java
Normal 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();
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user