# Page traitement - Meteo monde / Skill Alexa
```
<?php
setlocale(LC_ALL, 'fra', 'fr_FR');
/*Varaibles*/
$all_mois = [
'01' => "Janvier",
'02' => "Février",
'03' => "Mars",
'04' => "Avril",
'05' => "Mai",
'06' => "Juin",
'07' => "Juillet",
'08' => "Août",
'09' => "Septembre",
'10' => "Octobre",
'11' => "Novembre",
'12' => "Décembre",
];
$all_jours = [
1 => "Lundi",
2 => "Mardi",
3 => "Mercredi",
4 => "Jeudi",
5 => "Vendredi",
6 => "Samedi",
7 => "Dimanche",
];
if (isset($_POST['ville']) && (isset($_POST['mode']) && $_POST['mode'] == 'live')) {
$ville = $_POST['ville'];
$json_source_jour = file_get_contents('http://api.openweathermap.org/data/2.5/weather?q='.str_to_noaccent($ville).'&units=metric&appid=440f016b31b5d48aedb7b0c26ea62112');
$data = json_decode($json_source_jour);
$meteo_id = $data->weather[0]->id;
settype($meteo_id, "string");
$meteo_id_p = $meteo_id[0];
$temps = get_temps_current($meteo_id, $meteo_id_p);
echo 'À '.ucfirst($ville).', en ce moment il fait '.round($data->main->temp).'°C et '.$temps.'.';
} else if(isset($_POST['ville']) && (isset($_POST['mode']) && $_POST['mode'] == 'previsions')) {
$ville = $_POST['ville'];
$json_ville = file_get_contents('https://api.opencagedata.com/geocode/v1/json?q='.str_to_noaccent($ville).'&key=4ab148eaf30d4dbeb0bcd409a9d65241');
$data_ville = json_decode($json_ville);
$json_source_jour = file_get_contents('http://api.openweathermap.org/data/2.5/onecall?lat='.$data_ville->results[0]->geometry->lat.'&lon='.$data_ville->results[0]->geometry->lng.'&exclude=hourly&units=metric&appid=440f016b31b5d48aedb7b0c26ea62112');
$data = json_decode($json_source_jour);
$phrase = 'Voici les prévisions des 7 prochains jours pour la ville de '.ucfirst($ville).'. ';
$pre_temps = '';
$has_interval = false;
foreach ($data->daily as $nb => $day) {
//Date
if ($nb == 0) {
$date = get_date($nb, $day->dt, $all_mois, $all_jours);
}
//Météo
$meteo_id = $day->weather[0]->id;
settype($meteo_id, "string");
$meteo_id_p = $meteo_id[0];
$temps = get_temps_prevision($meteo_id, $meteo_id_p);
//Température
$temp_day = round($day->temp->day);
$temp_night = round($day->temp->night);
$temp_max = round($day->temp->max);
$temp_min = round($day->temp->min);
if ($temps == $pre_temps) {
if ($pre_temp_max < $temp_max) {
$pre_temp_max = $temp_max;
}
if ($pre_temp_min > $temp_min) {
$pre_temp_min = $temp_min;
}
$has_interval = true;
} else {
if ($nb != 0) {
if ($has_interval) {
$phrase_temp = get_temp_sentence($pre_temp_min, $pre_temp_max);
$phrase .= $pre_prefix.' '.$pre_date.' '.$pre_suffix.' '.$date.' '.$pre_temps.'. '.$phrase_temp;
$has_interval = false;
} else {
$phrase_temp = get_temp_sentence_v2($pre_temp_min, $pre_temp_max, $pre_temp_day, $pre_temp_night);
$phrase .= $date.' '.$pre_temps.'. '.$phrase_temp;
}
$date = get_date($nb, $day->dt, $all_mois, $all_jours);
}
$pre_prefix = ($nb < 4 ? 'De' : 'Du');
$pre_date = $date;
$pre_temps = $temps;
$pre_temp_max = $temp_max;
$pre_temp_min = $temp_min;
}
//Date
$pre_suffix = ($nb < 4 ? 'à' : 'au');
$date = get_date($nb, $day->dt, $all_mois, $all_jours);
$pre_temp_day = $temp_day;
$pre_temp_night = $temp_night;
}
if ($has_interval) {
$phrase_temp = get_temp_sentence($pre_temp_min, $pre_temp_max);
$phrase .= $pre_prefix.' '.$pre_date.' '.$pre_suffix.' '.$date.' '.$pre_temps.'. '.$phrase_temp;
} else {
$phrase_temp = get_temp_sentence_v2($pre_temp_min, $pre_temp_max, $pre_temp_day, $pre_temp_night);
$phrase .= $date.' '.$pre_temps.'. '.$phrase_temp;
}
echo $phrase;
} else if (isset($_POST['ville']) && isset($_POST['moment']) && (isset($_POST['mode']) && $_POST['mode'] == 'previsions_moment')) {
$ville = $_POST['ville'];
$json_ville = file_get_contents('https://api.opencagedata.com/geocode/v1/json?q='.str_to_noaccent($ville).'&key=4ab148eaf30d4dbeb0bcd409a9d65241');
$data_ville = json_decode($json_ville);
$json_source_jour = file_get_contents('http://api.openweathermap.org/data/2.5/onecall?lat='.$data_ville->results[0]->geometry->lat.'&lon='.$data_ville->results[0]->geometry->lng.'&exclude=hourly&units=metric&appid=440f016b31b5d48aedb7b0c26ea62112');
$data = json_decode($json_source_jour);
$moment = strtolower($_POST['moment']);
switch($moment){
case 'demain':
$nb = 1;
break;
case 'après demain':
case 'apres demain':
case 'après-demain':
case 'apres-demain':
$nb = 2;
break;
default:
$nb = 0;
break;
}
//Météo
$meteo_id = $data->daily[$nb]->weather[0]->id;
settype($meteo_id, "string");
$meteo_id_p = $meteo_id[0];
$temps = get_temps_prevision($meteo_id, $meteo_id_p);
$temp_day = round($data->daily[$nb]->temp->day);
$temp_night = round($data->daily[$nb]->temp->night);
$temp_max = round($data->daily[$nb]->temp->max);
$temp_min = round($data->daily[$nb]->temp->min);
echo ucfirst($moment).' à '.ucfirst($ville).', '.$temps.'. La température en journée sera de '.$temp_day.'°, avec une maximale de '.$temp_max.'° et une minimale de '.$temp_min.'°C. Pendant la nuit il fera aux alentours de '.$temp_night.'°C.';
} else {
echo 'pas de réponse';
}
/*FUNCTION*/
function str_to_noaccent($str)
{
$url = $str;
$url = preg_replace('#Ç#', 'C', $url);
$url = preg_replace('#ç#', 'c', $url);
$url = preg_replace('#è|é|ê|ë#', 'e', $url);
$url = preg_replace('#È|É|Ê|Ë#', 'E', $url);
$url = preg_replace('#à|á|â|ã|ä|å#', 'a', $url);
$url = preg_replace('#@|À|Á|Â|Ã|Ä|Å#', 'A', $url);
$url = preg_replace('#ì|í|î|ï#', 'i', $url);
$url = preg_replace('#Ì|Í|Î|Ï#', 'I', $url);
$url = preg_replace('#ð|ò|ó|ô|õ|ö#', 'o', $url);
$url = preg_replace('#Ò|Ó|Ô|Õ|Ö#', 'O', $url);
$url = preg_replace('#ù|ú|û|ü#', 'u', $url);
$url = preg_replace('#Ù|Ú|Û|Ü#', 'U', $url);
$url = preg_replace('#ý|ÿ#', 'y', $url);
$url = preg_replace('#Ý#', 'Y', $url);
$url = str_replace('_', ' ', $url);
$url = str_replace(' ', '%20', $url);
return ($url);
}
function get_temps_current($meteo_id, $meteo_id_p)
{
$meteo_temps = '';
switch (true) {
case ($meteo_id_p == '2'):
$meteo_temps = 'le temps est orageux';
break;
case ($meteo_id_p == '3'):
$meteo_temps = 'il y a une légère bruine';
break;
case ($meteo_id_p == '5'):
$meteo_temps = 'le temps est pluvieux';
break;
case ($meteo_id_p == '6'):
$meteo_temps = 'de la neige tombe';
break;
case ($meteo_id_p == '7'):
$meteo_temps = 'il y a du brouillard';
break;
case ($meteo_id_p == '8'):
switch (true) {
case ($meteo_id == '800'):
$meteo_temps = 'le temps est ensoleillé';
break;
case ($meteo_id == '801'):
$meteo_temps = 'le temps est nuageux';
break;
case ($meteo_id >= '802' && $meteo_id <= '804'):
$meteo_temps = 'le temps est couvert';
break;
}
break;
}
return $meteo_temps;
}
function get_temps_prevision($meteo_id, $meteo_id_p)
{
$meteo_temps = '';
switch (true) {
case ($meteo_id_p == '2'):
$meteo_temps = 'il y aura majoritairement de l\'orage';
break;
case ($meteo_id_p == '3'):
$meteo_temps = 'une bruine sera presente dans la journée';
break;
case ($meteo_id_p == '5'):
$meteo_temps = 'le temps sera pluvieux';
break;
case ($meteo_id_p == '6'):
$meteo_temps = 'de la neige tombera';
break;
case ($meteo_id_p == '7'):
$meteo_temps = 'du brouillard sera présent';
break;
case ($meteo_id_p == '8'):
switch (true) {
case ($meteo_id == '800'):
$meteo_temps = 'le temps sera ensoleillé';
break;
case ($meteo_id == '801'):
$meteo_temps = 'le temps sera nuageux';
break;
case ($meteo_id >= '802' && $meteo_id <= '804'):
$meteo_temps = 'le temps sera couvert';
break;
}
break;
}
return $meteo_temps;
}
function get_date($nb, $time, $all_mois, $all_jours)
{
switch($nb){
case 0:
$date = 'Aujourd\'hui';
break;
case 1:
$date = 'Demain';
break;
case 2:
$date = 'Après-demain';
break;
default:
$jour = $all_jours[strftime("%u", $time)];
$num = strftime("%e", $time);
$mois = $all_mois[strftime("%m", $time)];
$date = $jour.' '.$num.' '.$mois;
break;
}
return $date;
}
function get_temp_sentence($temp_min, $temp_max)
{
$phrase_temperatures = [
0 => 'Pour les températures la minimale sera de '.$temp_min.'° et la maximale de '.$temp_max.'°C. ',
1 => 'Durant ces jours les températures se trouveront entre '.$temp_min.'° et '.$temp_max.'°C. ',
2 => 'La température minimale sera de '.$temp_min.'° et la maximale de '.$temp_max.'°C. ',
];
return $phrase_temperatures[rand(0,2)];
}
function get_temp_sentence_v2($temp_min, $temp_max, $temp_day, $temp_night)
{
$phrase_temperatures = [
0 => 'Pendant la journée la température moyenne sera de '.$temp_day.'°C. ',
1 => 'La température durant la journée sera de '.$temp_day.'° et durant la nuit de '.$temp_night.'°C. ',
2 => 'La température minimale sera de '.$temp_min.'° et la maximale de '.$temp_max.'°C. ',
];
return $phrase_temperatures[rand(0,2)];
}
```
---
# index.js - Meteo monde / Skill Alexa
```
const Alexa = require('ask-sdk-core');
const http = require('http');
const querystring = require('querystring');
var fs = require('fs');
//Météo du moment
function meteo_ville(ville) {
return new Promise(((resolve, reject) => {
var post_data = querystring.stringify({
'ville' : ville,
'mode' : 'live',
});
var options = {
host: '195.83.128.21',
port: 80,
//path: '/~dev1905/API/alexa.php?ville='+ville,
path: '/~dev1905/API/alexa.php',
method: 'POST',
headers: {
'Content-Type': 'application/x-www-form-urlencoded',
'Content-Length': Buffer.byteLength(post_data)
}
};
const request = http.request(options, (response) => {
response.setEncoding('utf8');
let returnData = '';
console.log(response);
response.on('data', (chunk) => {
returnData += chunk;
});
response.on('end', () => {
resolve(returnData);
});
response.on('error', (error) => {
reject(error);
});
});
request.write(post_data);
request.end();
}));
}
//Prévision météo
function prevision_meteo_ville(ville) {
return new Promise(((resolve, reject) => {
var post_data = querystring.stringify({
'ville' : ville,
'mode' : 'previsions',
});
var options = {
host: '195.83.128.21',
port: 80,
//path: '/~dev1905/API/alexa.php?ville='+ville,
path: '/~dev1905/API/alexa.php',
method: 'POST',
headers: {
'Content-Type': 'application/x-www-form-urlencoded',
'Content-Length': Buffer.byteLength(post_data)
}
};
const request = http.request(options, (response) => {
response.setEncoding('utf8');
let returnData = '';
console.log(response);
response.on('data', (chunk) => {
returnData += chunk;
});
response.on('end', () => {
resolve(returnData);
});
response.on('error', (error) => {
reject(error);
});
});
request.write(post_data);
request.end();
}));
}
//Prévision moment météo
function prevision_moment_meteo_ville(ville, moment) {
return new Promise(((resolve, reject) => {
var post_data = querystring.stringify({
'ville' : ville,
'moment' : moment,
'mode' : 'previsions_moment',
});
var options = {
host: '195.83.128.21',
port: 80,
path: '/~dev1905/API/alexa.php',
method: 'POST',
headers: {
'Content-Type': 'application/x-www-form-urlencoded',
'Content-Length': Buffer.byteLength(post_data)
}
};
const request = http.request(options, (response) => {
response.setEncoding('utf8');
let returnData = '';
console.log(response);
response.on('data', (chunk) => {
returnData += chunk;
});
response.on('end', () => {
resolve(returnData);
});
response.on('error', (error) => {
reject(error);
});
});
request.write(post_data);
request.end();
}));
}
//Démarrage
const monpremiermessage = {
canHandle(handlerInput) {
return handlerInput.requestEnvelope.request.type === 'LaunchRequest';
},
handle(handlerInput) {
const speechText = 'Bonjour, je vous écoute';
return handlerInput.responseBuilder
.speak(speechText)
.reprompt(speechText)
.withSimpleCard('Hello World', speechText)
.getResponse();
}
};
//Météo du moment
const meteovillenow = {
canHandle(handlerInput) {
return Alexa.getRequestType(handlerInput.requestEnvelope) === 'IntentRequest'
&& Alexa.getIntentName(handlerInput.requestEnvelope) === 'meteo_ville';
},
async handle(handlerInput) {
var ville = Alexa.getSlotValue(handlerInput.requestEnvelope, 'ville');
//ville = ville.replace(' ','_');
const lareponse = await meteo_ville(ville);
return handlerInput.responseBuilder
.speak(lareponse)
.reprompt(lareponse)
.withSimpleCard('Hello World', lareponse)
.getResponse();
}
};
//Prévision météo
const previsionmeteoville = {
canHandle(handlerInput) {
return Alexa.getRequestType(handlerInput.requestEnvelope) === 'IntentRequest'
&& Alexa.getIntentName(handlerInput.requestEnvelope) === 'prevision_meteo_ville';
},
async handle(handlerInput) {
var ville = Alexa.getSlotValue(handlerInput.requestEnvelope, 'ville');
//ville = ville.replace(' ','_');
const lareponse = await prevision_meteo_ville(ville);
return handlerInput.responseBuilder
.speak(lareponse)
.reprompt(lareponse)
.withSimpleCard('Hello World', lareponse)
.getResponse();
}
};
//Prévision moment météo
const previsiontimemeteoville = {
canHandle(handlerInput) {
return Alexa.getRequestType(handlerInput.requestEnvelope) === 'IntentRequest'
&& Alexa.getIntentName(handlerInput.requestEnvelope) === 'prevision_time_meteo_ville';
},
async handle(handlerInput) {
var ville = Alexa.getSlotValue(handlerInput.requestEnvelope, 'ville');
var moment = Alexa.getSlotValue(handlerInput.requestEnvelope, 'moment');
const lareponse = await prevision_moment_meteo_ville(ville, moment);
return handlerInput.responseBuilder
.speak(lareponse)
.reprompt(lareponse)
.withSimpleCard('Hello World', lareponse)
.getResponse();
}
};
//Quitter le Skill
const CancelAndStopIntentHandler = {
canHandle(handlerInput) {
return handlerInput.requestEnvelope.request.type === 'IntentRequest'
&& Alexa.getIntentName(handlerInput.requestEnvelope) === 'quitter_meteo';
},
handle(handlerInput) {
const speechText = 'Ok, au revoir';
return handlerInput.responseBuilder
.speak(speechText)
.withSimpleCard('Hello World', speechText)
.withShouldEndSession(true)
.getResponse();
}
};
exports.handler = Alexa.SkillBuilders.custom().addRequestHandlers( monpremiermessage, meteovillenow, previsionmeteoville, previsiontimemeteoville, CancelAndStopIntentHandler ).lambda();
```