<?php
// Автор: Piminoff Nikita (Пиминов Никита) by pimnik98
// OpenWeatherMap - API Class для получение данных о погоде
// HostiW.Ru - Мой хостинг сайтов
class OpenWeatherMap{
// варианты локализации
const Russian = "ru"; // Русский
const English = "en"; // Англиский
const African = "af"; // Африканский
const Albanian = "al"; // Албанский
const Azerbaijani = "az"; // Азербайджанский
const Bulgarian = "bg"; // Болгарский
const Catalan = "ca"; // Каталонский
const Czech = "cz"; // Чешкий
const Danish = "da"; // Датский
const German = "de"; // Немецкий
const Buckwheat = "el"; // Гречиский
const Basque = "eu"; // Баскский
const Persian = "fa"; // Персидский
const Finnish = "fi"; // Финский
const French = "fr"; // Французкий
const Galician = "gl"; // Галицкий
const Ивритский = "he"; // Ивритский
const Hindi = "hi"; // Хинди
const Croatian = "hr"; // Хорватский
const Hungarian = "hu"; // Венгерский
const Indonesian = "id"; // Индонезийский
const Italian = "it"; // Итальянский
const Japanese = "ja"; // Японский
const Korean = "kr"; // Корейский
const Latvian = "la"; // Латышский
const Lithuanian = "lt"; // Литовский
const Macedonian = "mk"; // Македонский
const Norwegian = "no"; // Норвежский
const Netherlandish = "nl"; // Нидерландский
const Polish = "pl"; // Польский
const Portuguese = "pt"; // Португальский
const Romanian = "ro"; // Румынский
const Swedish = "sv"; // Шведский
const Slovak = "sk"; // Словацкий
const Slovenian = "sl"; // Словенский
const Serbian = "sr"; // Сербский
const Thai = "th"; // Тайский
const Turkish = "tr"; // Турецкий
const Ukrainian = "ua"; // Украинский
const Vietnamese = "vi"; // Вьетнамский
const Zulu = "zu"; // Зулусский
// Коды ошибок и описание
const ERROR_0 = [0,"Запрос успешно выполнен"];
const ERROR_1 = [1,"Произошла ошибка при обращении к серверу API"];
const ERROR_2 = [2,"Город не найден"];
const ERROR_3 = [3,"Документация сервера возможно изменилась, необходимо обновить файл запроса API"];
const ERROR_4 = [4,"Нет доступа к серверу API. Проверьте параметры ключа API"];
const ERROR_5 = [5,"Запрос еще не выполнен."];
// Конфиг доступа
const Source = "api.openweathermap.org";
// Меры измерения
const E_S = "standart"; // Стандарт (Кельвин)
const E_I = "imperial"; // Имперский ед. (Фаренгейт)
const E_M = "metric"; // Метрический ед. (Цельсий)
// Режимы вывода
const O_JSON = "json";
const O_XML = "xml";
const O_HTML = "html";
private $source = self::Source;
private $api_key = "";
private $out = "json"; // При изменение: только для Exec фнк.
private $ed_measures = self::E_S;
private $status = self::ERROR_5;
private $lang = self::Russian;
private $result = [];
function __construct($source=false,$key){
$this->source = !$source?$this->source:$source;
$this->api_key = $key;
}
private function APIQuery($url,$json=true){
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10);
curl_setopt($ch, CURLOPT_TIMEOUT, 45);
$returned = curl_exec($ch);
curl_close($ch);
return $json==true?json_decode($returned,true):$returned;
}
private function GenerationEndURL(){
return '&lang='.$this->lang.'&appid='.$this->api_key.'&mode='.$this->out.'&units='.$this->ed_measures;
}
/**
* Получить данные о погоде по индексу
* @param $index - Индекс города
* @param $country - Страна
*/
function GetByIndexCity($index,$country){
$query = $this->ApiQuery("http://".$this->source."/data/2.5/weather?zip=".$index.",".$country.$this->GenerationEndURL());
if ($query == null){
$this->status = self::ERROR_1;
} elseif ($query['cod'] == 404){
$this->status = self::ERROR_2;
} elseif ($query['cod'] == 401){
$this->status = self::ERROR_4;
} elseif ($query['cod'] == 200){
$this->status = self::ERROR_0;
$this->result = $query;
} else {
$this->status = self::ERROR_3;
}
}
/**
* Получить данные о погоде по имени
* @param $name - Имя города
* @param $country - Страна
*/
function GetByNameCity($name,$country){
$query = $this->ApiQuery("http://".$this->source."/data/2.5/weather?q=".$name.",".$country.$this->GenerationEndURL());
if ($query == null){
$this->status = self::ERROR_1;
} elseif ($query['cod'] == 404){
$this->status = self::ERROR_2;
} elseif ($query['cod'] == 401){
$this->status = self::ERROR_4;
} elseif ($query['cod'] == 200){
$this->status = self::ERROR_0;
$this->result = $query;
} else {
$this->status = self::ERROR_3;
}
}
/**
* Получить данные о погоде по ID-города
* @param $id - ID-города
*/
function GetByIDCity($id){
$query = $this->ApiQuery("http://".$this->source."/data/2.5/weather?id=".$id.$this->GenerationEndURL());
if ($query == null){
$this->status = self::ERROR_1;
} elseif ($query['cod'] == 404){
$this->status = self::ERROR_2;
} elseif ($query['cod'] == 401){
$this->status = self::ERROR_4;
} elseif ($query['cod'] == 200){
$this->status = self::ERROR_0;
$this->result = $query;
} else {
$this->status = self::ERROR_3;
}
}
/**
* Получить код ошибки и сообщение ошибки
*/
function GetError(){
return $this->status;
}
/**
* Получение результата от сервера
*/
function GetResult(){
if ($this->GetError()[0]!=0){
return [
'status' => 'error',
'msg' => 'Произошла ошибка при выполнении запроса.',
];
} else {
return [
'status' => 'success',
'root' => $this->result
];
}
}
/**
* Установка локализации ответов
* Язык сервера API
* @param $lang
*/
function SetLanguageAPI($lang){
$this->lang = $lang;
}
/**
* Установка источки запроса API
* Возможность установить зеркало, если у вас есть ссылка на него
* @param $url
*/
function SetSourceAPI($url){
$this->source = $url;
}
/**
* Установка Меры измерения
* Язык сервера API
* @param $elem
*/
function SetMeasuresAPI($elem){
$this->ed_measures = $elem;
}
/**
* Установка режима вывода информации
* Язык сервера API
* При изменении перестают работать GetByIDCity, GetByNameCity, GetByIndexCity
* Использовать только для Exec
* @param $out - Режим (XML,HTML,JSON)
*/
function SetOutputAPI($out){
$this->out = $out;
}
/**
* Выполнение пользовательской команды API-Серверу
* Зависимости:
* SetLanguageAPI - Локализация
* SetOutputAPI - Режим вывода
* Прописан токен-ключ
*/
function Exec($exec) {
$query = $this->ApiQuery("http://".$this->source."/data/2.5/weather?".$exec.'&lang='.$this->lang.'&appid='.$this->api_key.'&mode='.$this->out,false);
return $query;
}
/**
* Сбрасывает настройки окружения на рекомендуемые
*/
function Default(){
$this->source = self::Source;
$this->out = self::O_JSON;
$this->ed_measures = self::E_S;
$this->lang = self::Russian;
}
}
?>