chore: snapshot current working tree changes
Save all currently accumulated repository changes as a backup snapshot for Gitea so no local work is lost.
This commit is contained in:
@@ -463,38 +463,77 @@ if(!function_exists('wf_days_between')) {
|
||||
if(!function_exists('wf_getcourse')) {
|
||||
function wf_getcourse($date, $ticker) {
|
||||
// Сначала приведем дату к нужному формату: d.m.Y
|
||||
$date = date('d.m.Y', strtotime($date));
|
||||
$originalDate = date('d.m.Y', strtotime($date));
|
||||
$currentDate = $originalDate;
|
||||
|
||||
// Потом вытащим страницу со всеми курсами валют на заданную дату
|
||||
$url = "https://cbr.ru/currency_base/daily/?UniDbQuery.Posted=True&UniDbQuery.To=".$date;
|
||||
|
||||
$ch = curl_init();
|
||||
curl_setopt($ch, CURLOPT_URL, $url);
|
||||
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
|
||||
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
|
||||
$html = curl_exec($ch);
|
||||
curl_close($ch);
|
||||
$maxAttempts = 30; // Максимум 30 дней назад
|
||||
$attempts = 0;
|
||||
|
||||
// А теперь получим структуру страницы
|
||||
$doc = new DOMDocument();
|
||||
@$doc->loadHTML($html);
|
||||
$xpath = new DOMXPath($doc);
|
||||
// Логируем начало поиска
|
||||
file_put_contents('logs/CurrencyRate.log', date('Y-m-d H:i:s').' wf_getcourse: Ищем курс валюты '.$ticker.' на дату '.$originalDate.PHP_EOL, FILE_APPEND);
|
||||
|
||||
// Находим строку таблицы с курсом доллара США
|
||||
$rows = $xpath->query('//table[contains(@class, "data")]//tr');
|
||||
|
||||
foreach ($rows as $row) {
|
||||
$cols = $row->getElementsByTagName('td');
|
||||
if ($cols->length > 0 && trim($cols->item(1)->nodeValue) == $ticker) {
|
||||
// Поднимаем курс искомой валюты
|
||||
$course = floatval(str_replace(',', '.', trim($cols->item(4)->nodeValue)));
|
||||
// Её кратность - цена указана за единицу, или за большее количество?
|
||||
$multiplicity = intval(trim($cols->item(2)->nodeValue));
|
||||
// Возвращаем с учетом кратности
|
||||
return floatval($course / $multiplicity);
|
||||
while ($attempts < $maxAttempts) {
|
||||
$attempts++;
|
||||
|
||||
// Пробуем новый формат URL (date_req) и старый (UniDbQuery.To) для совместимости
|
||||
$url = "https://cbr.ru/currency_base/daily/?date_req=".$currentDate;
|
||||
|
||||
$ch = curl_init();
|
||||
curl_setopt($ch, CURLOPT_URL, $url);
|
||||
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
|
||||
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
|
||||
curl_setopt($ch, CURLOPT_TIMEOUT, 30);
|
||||
curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36');
|
||||
$html = curl_exec($ch);
|
||||
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
|
||||
curl_close($ch);
|
||||
|
||||
if ($html === false || $httpCode != 200) {
|
||||
file_put_contents('logs/CurrencyRate.log', date('Y-m-d H:i:s').' wf_getcourse: Ошибка загрузки страницы для даты '.$currentDate.' (HTTP '.$httpCode.')'.PHP_EOL, FILE_APPEND);
|
||||
// Крутим дату назад
|
||||
$currentDate = date('d.m.Y', strtotime($currentDate . ' -1 day'));
|
||||
continue;
|
||||
}
|
||||
|
||||
// А теперь получим структуру страницы
|
||||
$doc = new DOMDocument();
|
||||
@$doc->loadHTML($html);
|
||||
$xpath = new DOMXPath($doc);
|
||||
|
||||
// Находим строку таблицы с курсом валюты
|
||||
$rows = $xpath->query('//table[contains(@class, "data")]//tr');
|
||||
|
||||
foreach ($rows as $row) {
|
||||
$cols = $row->getElementsByTagName('td');
|
||||
if ($cols->length > 0 && trim($cols->item(1)->nodeValue) == $ticker) {
|
||||
// Поднимаем курс искомой валюты
|
||||
$course = floatval(str_replace(',', '.', trim($cols->item(4)->nodeValue)));
|
||||
// Её кратность - цена указана за единицу, или за большее количество?
|
||||
$multiplicity = intval(trim($cols->item(2)->nodeValue));
|
||||
if ($multiplicity == 0) $multiplicity = 1; // Защита от деления на ноль
|
||||
|
||||
// Вычисляем курс с учетом кратности
|
||||
$rate = floatval($course / $multiplicity);
|
||||
|
||||
// Логируем успешный результат
|
||||
if ($currentDate != $originalDate) {
|
||||
$daysBack = $attempts - 1;
|
||||
file_put_contents('logs/CurrencyRate.log', date('Y-m-d H:i:s').' wf_getcourse: Курс найден на дату '.$currentDate.' ('.$daysBack.' дней назад от '.$originalDate.'), курс: '.$rate.PHP_EOL, FILE_APPEND);
|
||||
} else {
|
||||
file_put_contents('logs/CurrencyRate.log', date('Y-m-d H:i:s').' wf_getcourse: Курс найден на указанную дату '.$currentDate.', курс: '.$rate.PHP_EOL, FILE_APPEND);
|
||||
}
|
||||
|
||||
return $rate;
|
||||
}
|
||||
}
|
||||
|
||||
// Курс не найден на эту дату, крутим назад
|
||||
file_put_contents('logs/CurrencyRate.log', date('Y-m-d H:i:s').' wf_getcourse: Курс не найден на дату '.$currentDate.', пробуем предыдущую дату'.PHP_EOL, FILE_APPEND);
|
||||
$currentDate = date('d.m.Y', strtotime($currentDate . ' -1 day'));
|
||||
}
|
||||
|
||||
// Курс не найден за весь период
|
||||
file_put_contents('logs/CurrencyRate.log', date('Y-m-d H:i:s').' wf_getcourse: ОШИБКА - Курс валюты '.$ticker.' не найден за период '.$maxAttempts.' дней назад от даты '.$originalDate.PHP_EOL, FILE_APPEND);
|
||||
return -1; // В случае, если курс не найден
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user