Артём Мáлков

Получаем статистику заражений коронавирусом COVID-19 (2019-nCoV) на PHP+API

8 мая2 комм

Мне трудно представить человека, который в настоящее время не в курсе «гуляющего» по планете коронавируса COVID-19 (2019-nCoV). Интернет переполнен информацией на этот счет, и самая популярная (на мой взгляд) – это статистика. Текстовая статистика распространения коронавируса в отдельных странах и регионах, а также общая во всем мире и в виде интерактивных карт.

Данная тема является сейчас как никогда актуальной, и многие зарубежные разработчики уже успели ее подхватить, запустив свои открытые (бесплатные) API.

Таких API, на самом деле, сейчас существует большое множество (с учетом того, что люди на момент написания статьи знакомы с вирусом больше 4 месяцев), и каждый из них имеет свои «изюминки» в виде времени отклика, вида информации, в котором она предоставляется, и других. Из всего разнообразия мне приглянулся проект Криса Майкла. Со всеми возможностями API вы можете ознакомиться в официальном репозитории на GitHub, а я, с вашего позволения, рассмотрю несколько простых примеров получения и обработки той или иной информации касаемо COVID-19.

Получение общей краткой мировой статистики заражений коронавирусом COVID-19 (2019-nCoV) на PHP+API

Общая краткая мировая статистика включает в себя 3 показателя – это число зараженных (cases), число погибших (deaths) и, соответственно, выздоровевших (recovered).

Получить точечно каждую из них можно с помощью следующей функции:

function get_total_data_covid_19($data_type) {

	$allow_data_type = array_flip(['cases', 'deaths', 'recovered']);

	$total = 0;

	if(isset($allow_data_type[$data_type])) {

		$cache_time_out = '3600'; // Время жизни кэша в секундах
		$file_cache = __DIR__.'/AllReports.json'; // Файл кэша

		if(!is_file($file_cache) || filemtime($file_cache) < (time() - $cache_time_out)) {

			$ch = curl_init();

			curl_setopt($ch, CURLOPT_USERAGENT, filter_input(INPUT_SERVER, 'HTTP_USER_AGENT', FILTER_SANITIZE_STRING, FILTER_FLAG_STRIP_LOW));
			curl_setopt($ch, CURLOPT_AUTOREFERER, 1);
			curl_setopt($ch, CURLOPT_HEADER, 0);
			curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
			curl_setopt($ch, CURLOPT_URL, 'https://covid19api.io/api/v1/AllReports');
			curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);

			$data = curl_exec($ch);

			curl_close($ch);

			file_put_contents($file_cache, $data);

		}

		$data = file_get_contents($file_cache);
		$data = json_decode($data, true);

		$total = intval($data['reports'][0][$data_type]);

	}

	return number_format($total, 0, '', ' ');

}

Пример ее использования:

echo 'Число зараженных: '.get_total_data_covid_19('cases');

Допустимые значения параметра в вызове функции: cases, deaths, recovered.

Получение общей полной мировой статистики заражений коронавирусом COVID-19 (2019-nCoV) на PHP+API

Теперь попробуем сформировать таблицу со статистикой в виде «Страна – Число зараженных – Число погибших – Число выздоровевших» с помощью следующей функции:

function get_country_data_covid_19() {

	$cache_time_out = '3600'; // Время жизни кэша в секундах
	$file_cache = __DIR__.'/AllReports.json'; // Файл кэша

	if(!is_file($file_cache) || filemtime($file_cache) < (time() - $cache_time_out)) {

		$ch = curl_init();

		curl_setopt($ch, CURLOPT_USERAGENT, filter_input(INPUT_SERVER, 'HTTP_USER_AGENT', FILTER_SANITIZE_STRING, FILTER_FLAG_STRIP_LOW));
		curl_setopt($ch, CURLOPT_AUTOREFERER, 1);
		curl_setopt($ch, CURLOPT_HEADER, 0);
		curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
		curl_setopt($ch, CURLOPT_URL, 'https://covid19api.io/api/v1/AllReports');
		curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);

		$data = curl_exec($ch);

		curl_close($ch);

		file_put_contents($file_cache, $data);

	}

	$data = file_get_contents($file_cache);
	$data = json_decode($data, true);

	$total_all_country = '

		<table>

			<tr>
				<td><b>Страна</b></td>
				<td><b>Зараженных</b></td>
				<td><b>Погибших</b></td>
				<td><b>Выздоровевших</b></td>
			</tr>

	';

	for($i = 1; $i < count($data['reports'][0]['table'][0]) - 1; $i++) {

		$total_all_country .= '

			<tr>
				<td>'.htmlspecialchars(strip_tags($data['reports'][0]['table'][0][$i]['Country'])).'</td>
				<td>'.number_format(intval(preg_replace('/[^0-9]/', '', $data['reports'][0]['table'][0][$i]['TotalCases'])), 0, '', ' ').'</td>
				<td>'.number_format(intval(preg_replace('/[^0-9]/', '', $data['reports'][0]['table'][0][$i]['TotalDeaths'])), 0, '', ' ').'</td>
				<td>'.number_format(intval(preg_replace('/[^0-9]/', '', $data['reports'][0]['table'][0][$i]['TotalRecovered'])), 0, '', ' ').'</td>
			</tr>

		';

	}
	
	$total_all_country .= '

		</table>

	';

	return $total_all_country;

}

Вызывается без параметров:

echo get_country_data_covid_19();

Обратите внимание, что данные по API возвращаются на английском языке. Для того чтобы перевести страны на нужный вам язык, строку:

<td>'.htmlspecialchars(strip_tags($data['reports'][0]['table'][0][$i]['Country'])).'</td>

замените на:

<td>'.htmlspecialchars(strip_tags(translation_country($data['reports'][0]['table'][0][$i]['Country']))).'</td>

А выше функции добавьте еще одну:

function translation_country($country) {
		
	$translation_country = [
		'USA' => 'США',
		'Russia' => 'Россия'
	];

	foreach($translation_country as $key => $value) {
			
		$country = str_replace($key, $value, $country);

	}

	return $country;

}

Переменная $translation_country – это массив для перевода в виде «'Искомое название' => 'Желаемый перевод'».

Точечное получение общей краткой статистики заражений коронавирусом COVID-19 (2019-nCoV) по конкретной стране на PHP+API

Ну и в логическое завершение я хотел бы показать простой пример того, как получить информацию только по нужной вам стране.

Функция для решения этой задачи:

function get_total_one_country_data_covid_19($country, $data_type) {

	$allow_data_type = array_flip(['cases', 'deaths', 'recovered']);

	$total = 0;

	if(isset($allow_data_type[$data_type])) {

		$cache_time_out = '3600'; // Время жизни кэша в секундах
		$file_cache = __DIR__.'/ReportsByCountries.json'; // Файл кэша

		if(!is_file($file_cache) || filemtime($file_cache) < (time() - $cache_time_out)) {

			$ch = curl_init();

			curl_setopt($ch, CURLOPT_USERAGENT, filter_input(INPUT_SERVER, 'HTTP_USER_AGENT', FILTER_SANITIZE_STRING, FILTER_FLAG_STRIP_LOW));
			curl_setopt($ch, CURLOPT_AUTOREFERER, 1);
			curl_setopt($ch, CURLOPT_HEADER, 0);
			curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
			curl_setopt($ch, CURLOPT_URL, 'https://covid19api.io/api/v1/ReportsByCountries/'.$country);
			curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);

			$data = curl_exec($ch);

			curl_close($ch);

			file_put_contents($file_cache, $data);

		}

		$data = file_get_contents($file_cache);
		$data = json_decode($data, true);

		$total = intval($data['report'][$data_type]);

	}

	return number_format($total, 0, '', ' ');

}

И пример ее вызова:

echo 'Зараженных в России: '.get_total_one_country_data_covid_19('russia', 'cases');

Допустимые значения первого параметра в вызове функции: название страны из списка, допустимые значения второго параметра: cases, deaths, recovered.

Для лучшего ориентира ниже представлен список доступных на момент написания статьи стран в алфавитном порядке (взято с репозитория API).

afghanistan
albania
algeria
andorra
angola
anguilla
antigua-and-barbuda
argentina
armenia
aruba
australia
austria
azerbaijan
bahamas
bahrain
bangladesh
barbados
belarus
belgium
belize
benin
bermuda
bhutan
bolivia
bosnia-and-herzegovina
botswana
brazil
british-virgin-islands
brunei-darussalam
bulgaria
burkina-faso
burundi
cabo-verde
cambodia
cameroon
canada
caribbean-netherlands
cayman-islands
central-african-republic
chad
channel-islands
chile
china
china-hong-kong-sar
china-macao-sar
colombia
congo
costa-rica
cote-d-ivoire
croatia
cuba
curacao
cyprus
czech-republic
democratic-republic-of-the-congo
denmark
djibouti
dominica
dominican-republic
ecuador
egypt
el-salvador
equatorial-guinea
eritrea
estonia
ethiopia
faeroe-islands
falkland-islands-malvinas
fiji
finland
france
french-guiana
french-polynesia
gabon
gambia
georgia
germany
ghana
gibraltar
greece
greenland
grenada
guadeloupe
guatemala
guinea
guinea-bissau
guyana
haiti
holy-see
honduras
hungary
iceland
india
indonesia
iran
iraq
ireland
isle-of-man
israel
italy
jamaica
japan
jordan
kazakhstan
kenya
kuwait
kyrgyzstan
laos
latvia
lebanon
liberia
libya
liechtenstein
lithuania
luxembourg
macedonia
madagascar
malawi
malaysia
maldives
mali
malta
martinique
mauritania
mauritius
mayotte
mexico
moldova
monaco
mongolia
montenegro
montserrat
morocco
mozambique
myanmar
namibia
nepal
netherlands
new-caledonia
new-zealand
nicaragua
niger
nigeria
norway
oman
pakistan
panama
papua-new-guinea
paraguay
peru
philippines
poland
portugal
qatar
reunion
romania
russia
rwanda
saint-barthelemy
saint-kitts-and-nevis
saint-lucia
saint-martin
saint-vincent-and-the-grenadines
san-marino
saudi-arabia
senegal
serbia
seychelles
sierra-leone
singapore
sint-maarten
slovakia
slovenia
somalia
south-africa
south-korea
spain
sri-lanka
state-of-palestine
sudan
suriname
swaziland
sweden
switzerland
syria
taiwan
tanzania
thailand
timor-leste
togo
trinidad-and-tobago
tunisia
turkey
turks-and-caicos-islands
uganda
uk
ukraine
united-arab-emirates
uruguay
us
uzbekistan
venezuela
viet-nam
zambia
zimbabwe

Во всех описанных вариантах получаемые данные кэшируются на 1 час во избежание лишней нагрузки на сайт-источник. Помимо этого хочется отметить, что все описанное – это лишь малая часть того, что предоставляет API. Надеюсь, вся эта обзорная статья найдет свое место при реализации самых разных ваших идей.

Остались вопросы? Задать их можете в комментариях под данной статьей.

Рекомендуем к просмотру
Информер общей мировой статистики заражений коронавирусом COVID-19 (2019-nCoV)
Модули и скрипты
Новые функции профилей. Время обновляться!
Блог
Получаем курсы валют с сайта Центробанка на PHP
Посты
2
комментария
Форма комментирования этого поста скрыта. Авторизуйтесь, чтобы расширить привилегии гостевого посещения и получить необходимую помощь от сообщества Pandoge.
    • 47
    16
      •  Проверенный
    30 мар в 11:12

    Было бы круто видеть это в виде плагина для DLE Хотя бы с минимальными возможностями

    • 25
    2
      •  Пользователь
    27 мар в 00:40

    Можете сделать этого скрипт модуль для DLE? желательно для всей версии. спасибо

Подняться наверх
«Pandoge» - помощник вебмастера