PHP

PHP (8)

Aujourd'hui, nous allons regarder de plus près une fonctionnalité qui pourrait être intéressante pour celles et ceux qui veulent suivre l'évolution d'une vidéo sur la plateforme Youtube. En effet, si vous utilisez YouTube en guise de recherche d'illustration vidéo, par exemple pour des articles de presse, vous n'êtes pas sans savoir que l'utilisateur ayant posté une vidéo, peut la supprimer. Et dans ce cas, elle n'apparaît plus dans votre article. Cet outil pourrait vous permettre de gérer un suivi des vidéos utilisées.
L'idée de ce petit tutoriel et de vous montrer comment savoir et comment faire pour suivre l'évolution d'une vidéo, mais surtout pour être informé de leurs suppressions (ou évidemment de la modification public/privé de chacune des vidéos que vous souhaitez suivre, le résultat étant le même).
Pour effectuer ce suivi, nous allons utiliser qui nous avons déjà vu il y a fort longtemps dans ce blog. Cet exemple n'est qu'une application de ce que l'on peut faire avec les API de YouTube.
En préambule, il faut connaître une information importante pour exploiter ce savoir-faire : lorsqu'une vidéo répond absente, avec l'API que je vais vous montrer, Google vous renvoie un nombre de résultat égal à 0 ou pas (0 symbolisant l'impossibilité de consulter en mode publique une vidéo). Il nous suffit donc de comparer le nombre de résultats obtenus sur l'ID passé en paramètres de l'API.
Dans mon exemple, je renvoie de la fonction vidéo existe, dans laquelle la référence de la vidéo est passé en paramètre, celui-ci étant issu du paramètre de l'URL, une valeur 0 ou 1,0 représentant une valeur, un représentant une valeur vrai. Je n'ai pas réussi à retourner un boulot en tant que tel. Il me semble qu'en PHP cela n'existe pas. À vérifier.
Quelle que soit la valeur retournée, vous pouvez à partir de cette fonction, tester si il y a vidéo que vous souhaitez existe réellement retourner un. Dans le cas contraire je vous savez que la vidéo n'existe pas, ou n'est pas accessible d'une manière public à vos utilisateurs.
 
<?php
function videoExiste($reference_video)
{
$T = array();
$temp = file_get_contents('https://www.googleapis.com/youtube/v3/videos?part=id%2C%20snippet%2C%20status&id='.$reference_video.'&key=VOTRE_CLEF_API');
$T= json_decode($temp, true);
if ($T["pageInfo"]["totalResults"] == 0)
{
return 0;
}
else
{
return 1;
}
}
echo videoExiste($_GET["id_video"]);
?>

 
mercredi, 10 juin 2020 18:30

Et si on instagrammait proprement ?

Écrit par

C'est après plusieurs semaines de recherche d'analyse et de lecture des différentes API, à propos de site internet de photographie Instagram, que j'ai enfin réussi à faire ce que je souhaitais, ou persque, méthode que je vais vous partager ici. ATTENTION : le voulais récupérer des photo en automatique mais je me suis heurté à un probleme humain : quelle photographies choisir ? Du coup, dans cet exemple, ce sera l'intégration de photos choisies une à une.

Sur mon site internet de mon agenda culturel , je ressence régulièrement des événements ayant trait la culture, chacun d'entre eux pouvant être agrémenté d'une ou plusieurs photos, afin d'illustrer les propos sur l'événement culturel. proposé. Parallèlement, avec la montée en puissance des réseaux sociaux, affin d'illustrer les événement que nous devons recenser, les organisateur et surtout artistes en relation avec le graphisme, nous envoient dans le communiqué de presse, un lien vers Instagram.

Ma problématique était la suivante : Instagram ne propose pas forcément d'API permettant de lister un ensemble d'illustrations, pouvant être associé à un événement culturel. De plus, comment mettre en relation es images entre elles afin d'en farie une galerie ? Il faut donc "picorer" dans l'ensemble des galeries ou des images uniques des artistes, pour pouvoir afficher une ou plusieurs photos en relation avec le sujet traité. C'est sur quoi j'ai travaillé aujourd'hui, et ai trouvé une solution afin de pouvoir générer une galerie photos, c'est-à-dire un ensemble de plusieurs photographies retournées par Instagram, Les retours sont en fait l'ensembles de informations "embed" du site de photographie Instagram, récupérés à partir des références. Pour contourner ma problématique, je demande aux utilisateurs de sélectionner même chacune des photos à afficher, ou une galerie si l'utilisateur en a déjà fait une sur Instagram.

A savoir : au niveau Instagram, que ce soit une photographie ou une galerie, Instagram considère que c'est la même chose. En d'autres termes, pour Instagram, une référence concerne toujours une galerie photos, celle-ci pouvant contenir une ou plusieurs photographies. Ce qui peut aussi se traduire ainsi : Il n'y a qu'une seule référence pour une publication, peu importe si cette publication possède une ou plusieurs images.

Parmi les (autres) choses à connaître, il faut aussi savoir qu'une photo sur Instagram possède deux types de références pour la même photo : la référence courte et la référence longue. Dans la documentation de l'API d'Instagram, il est bien stipulé qu'il faut toujours utiliser la référence courte.

Maintenant que nous avons toutes les compétences pour travailler, voici ce que j'ai fait. Mon petit programme prend en paramètre l'ensemble des références courtes de chacune des photos/galeries d'Instagram que vous souhaitez afficher sur votre site. Comme tes références vont être passées dans l'URL, afin de pouvoir les detecter les vidéos, elles sont concaténées avec un point-virgule (ce choix est tout à fait arbitraire, j'aurais pu prendre un autre caractère). Ainsi, je vais pouvoir récupérer cette chaîne de références des photo sous la forme : ref=CBD7I03CBBu;CA0wGqsp4ml;B_-WcOgC57L.

A l'aide de la commande d'explosion de chaîne (explode) sur un caractère (ici le point-virgule), nous allons transformer cette chaîne dans un tableau de références. Pour chacune des références de ce tableau, je récupère le contenu sur Instagram de cette référence, celle-ci m'étant renvoyée au format JSON. Je la decode afin d'en extraire son contenu, pour pouvoir, dans le résultat issu du décodage, en extraire le code html à afficher.

Il ne vous reste plus qu'à intégrer ces images soit en brut dans une balise <IMG SRC="">, soit au travers d'une galerie d'images de votre choix (il en existe des tonnes en JQuery), afin de personnaliser l'ensemble des photos extraites d'Instagram que vous souhaitez d'afficher sur votre site.

Notez au passage que l'API d'instagram stipule bien qu'aucune identification n'est necessaire, il n'y en a donc aucune dans mon fichier, ce qui explique pourquoi vous pouvez le télécharger ici.

 

mardi, 19 mai 2020 22:00

Poster un formulaire simple avec cURL

Écrit par

Je ne sais pas vous, mais moi, cela fait très longtemps que j'essayais de comprendre comment vous pouvez facilement poster un formulaire Web en ligne de commande. Question essentielle au demeurant (je ne sais pas si vous avez tous ce genre de question qui vous vient à l'esprit en marchant, mais moi si !). Cette question, je me la suis posé il y a maintenant une bonne année, en effectuant une marche, lorsque j'étais hospitalisé afin de perdre quelques kilos. Et c'est presque un an plus tard que cette question m'est revenue en tête. Etant devant un serveur web de développement, je me suis atelé à la tâche afin de comprendre et d'essayer de voir comment cela fonctionnait.

Nous sommes bien d'accord que dans cet exemple, nous faisons totalement abstraction des formulaires présentant de la technologie Ajax. L'idée est simple :  Nous avons un formulaire avec 2 éléments:

  • un champ texte que je nomme texte
  • un bouton de validation de type submit

Je ne pense pas qu'il soit possible de faire beaucoup plus simple comme formulaire. Notez toutefois que nous avons besoin du bouton Submit car il va jouer un rôle important puisque justement il envoie, il poste le formulaire. Dans mon exemple, afin de contrôler que le formulaire soit bien posté, je vais simplement afficher, une fois la page postée, le contenu du champ dans lequel j'ai saisi du texte. Vous remarquerez au passage, qu'à des fins de simplification, je mets une valeur par défaut dans ce champ texte. Vous voyez le formulaire HTML est très simple, et ce que nous allons faire, c'est afficher le champ de saisie lorsque l'utilisateur clique sur le bouton Valider, ou plutôt lorsque nous simulons un clic sur le bouton "valider" via la commande en ligne. N'oublions pas l'objectif essentiel de ce tutoriel

Texte :

Je ne pense pas qu'il faille de grandes compétences en programmation pour comprendre ce que fait une code ci-dessus, d'autant plus que je viens de l'expliciter.

Vous reprendrez bien un peu de cURL ?

Sur votre console de votre système d'exploitation, que ce soit un Mac ou une distribution linux, nous allons voir comment fonctionne un POST en ligne de commande. Je souligne le fait que je n'ai aucune compétence Windows qui me permettre de vous certifier que la commande en question existe sur ce système d'exploitation. (Si vous faites ce test, prévenez moi si ca marche ou pas.)

En revanche, sous Linux et sur Mac, la commande et la librairie cURL et fonctionnent à merveille. Dans notre cas très simple, cette commande se décompose en quatre grands groupe :

  • Appel de cette commande,
  • spécification du paramètre spécifiant le type de requête (POST, GET, HEAD...) Http,
  • l'URL de la commande que nous souhaitons lancer,
  • et enfin l'ensemble des paramètres que nous voulons passer à la requête en question.

Dans l'exemple ci-dessus, la requête fonctionne de la manière suivante:

cURL -X POST http://localhost/test.php -d "texte=toto&valider=valider"

Veuillez noter au passage une certaine similitude aux paramètres passés dans une URL d'un navigateur web. Puisque vous êtes sur votre ligne de commande, notez que la réponse retournée est affiché telle qu'elle le serait dans votre navigateur web, puisque c'est ce typed e logiciel qui est sensé l'appeler. Cela explique notamment pourquoi vous avez du code html retourné. Il s'agit en fait de la page que votre navigateur aurait à interpréter. Mais votre requête étant passé, l'action décrite dans l' "action" de la balise form a été effectuée. Nous avons donc lancé notre requête en ligne de commande !

Alors à quoi cela peut-il nous servir?

Il y a encore quelques années, a l'heure où AJAX n'existait encore pas, beaucoup d'éditeurs de logiciels écrivait encore des logiciels à installer sur vos machines, ceci permettant de mettre en place une simplicité et une meilleure ergonomie qui était à l'époque impossible d'obtenir sur le web. Lorsqu'un éditeur écrivait un logiciel dans lequel vous saisissiez des informations qui devaient être publiées sur le web, c'est la méthode par laquelle nous pouvions récupérer les informations saisies dans les champs du logiciel, dans le but de préparer notre requête HTTP, et de faire correspondre les données que vous aviez saisie au formulaire Web adéquat existant sur le serveur. (vous comprenez mieux les antispam des formulaires de saisies maintenant ?)

De nos jours, il peut encore être intéressant de connaître cette technique, notamment pour aller faire du remplissage automatique de site, ou plutôt de formulaire de certains sites, à partir de données que vous possédez, et que vous souhaitez implanter sur un site distant. Inutile de tout ressaisir, vous n'êtes pas secrétaire à mais informaticien, vous pouvez donc lire les données d'origine de votre fichier de départ (un fichier Excel, un fichier texte ...), et les envoyer sur votre base de données de votre serveur par l'intermédiaire de votre formulaire que vous avez mis en place pour cette action, sans remplir manuellement chaque champs de votre formulaire. Cette technique est donc très pratique pour mettre en place des passerelles de saisies c'est la raison pour laquelle je tenais à écrire ce petit article.

mardi, 28 avril 2020 20:50

Je suis nancéen, où puis-je me rendre ?

Écrit par

Suite à l'annonce de ce jour, le rayon d'action est passé à 100Km dans le cadre de la lutte contre le COVID !

mardi, 24 décembre 2019 11:49

Récupérer et afficher des photos Instagram

Écrit par
J'ai décidé aujourd'hui, afin d'agrémenter mon deuxième site aujourd'hui à Nancy, sur lequel je propose un agenda culturel local, d'afficher une liste de photographies issues d'Instagram. Attention je n'ai pas réussi à récupérer une liste des photographies qui sont dans une galerie, au sens Instagram du terme, mon script ne permet donc d'afficher que des photographies récupérées une à une. Je souligne bien le fait que nous devons uniquemenrt passer par les shorten url ou url courtes, l'API d'Instagram ayant été codée ainsi.
L'API d'Instagram ne permettant pas de récupérer l'ensemble des photos d'une galerie créée sur ce site, mon système va donc prendre en paramètre une liste d'URL courtes des photos d'Instagram que nous allons afficher sous forme de gallerie, le tout grace à un plugin jquery qui génère automatiquement la galerie.
 
Je ne m'étendrai pas sur le style CSS utilisé ni sur le plugin jquery, mais je tiens à expliquer utilisation de mon script. Mon fichier php prend en paramètre dans l'URL, une variable qui s'appelle liste. Cette liste ayant l'ensemble des photos que je souhaite afficher, chacune des url dans cette liste étant la shorten url de la photo, chacume des url devant etre séparée par un ; .
Le paramètre ressemblera donc à liste=https://www.instagram.com/p/B6Y_LrSCvbv;http://instagr.am/p/B1zMPDTCNVD;http://instagr.am/p/B6cGF4_g5Aw;http://instagr.am/p/B6biblaiXeW
 
Ainsi, en passant cette chaine dans l'URL de mon script, l'ensemble des photos issue d'Instagram, je vais générer grâce au plugin lightbox de jquery, une galerie des photographies permettant d'agrémenter un événement culturel sur mon site Aujourd'hui à Nancy.
L'aAPI d'Instagram ne permettant pas de récupérer l'ensemble des photos d'une galerie créée sous Instagram, nous ne pouvons que passer en paramètre une liste des photographies présentes sur le site. Aucun droit de sécurité n'est ainsi utilisé et problématique, l'API utilisée de cette façon permettant une utilisation publique de chacune des photos de la file. Attention toutefois aux problèmes d'authentification peuvent évoluer dans le temps. À l'heure où j'écris cet article, il n'y a aucun problème.
 
Comment faire fonctionner mon truc ?
 
Après avoir téléchargé mon fichier php que vous placez sur votre serveur, ainsi que le plugin lightbox.js, le script est fonctionnel. Pour me faire tourner il vous suffit the pointer sur mon fichier php en passant dans d'un paramètres qui s'appelle liste dans l'url, l'ensemble des url court de chacune des photographies que vous souhaitez voir affiché. Le séparateur utilisé est un point-virgule.
 
Alors oui je sais il serait plus intéressant de récupérer l'ensemble des photos d'une galerie tout fait cependant API ne le permettant pas je ne peux faire. Toutefois avec mon système vous pouvez intégrer relativement facilement vient de simple copier-coller et tout fait sur votre propre site
 
Utilisation :
Voila un exemple :
http://localhost/instagram3.php?liste=https://www.instagram.com/p/B6Y_LrSCvbv;http://instagr.am/p/B1zMPDTCNVD;http://instagr.am/p/B6cGF4_g5Aw;http://instagr.am/p/B6biblaiXeW

 Voici comment récupérer un lien court Instagram
lundi, 31 décembre 2018 13:31

PHP array en table

Écrit par

function array2table($array, $recursive = true, $null = '&nbsp;')
{
   // Sanity check
   if (empty($array) || !is_array($array)) {
      return false;
}

if (!isset($array[0]) || !is_array($array[0])) {
   $array = array($array);
}

// Start the table
   $table = '<table>';

   // The header
   $table .= "\t<tr>";
   // Take the keys from the first row as the headings
   foreach (array_keys($array[0]) as $heading) {
      $table .= '<th>' . $heading . '</th>';
   }
   $table .= "</tr>\n";

   // The body
   foreach ($array as $row) {
      $table .= "\t<tr>" ;
      foreach ($row as $cell) {
         $table .= '<td>';

         // Cast objects
         if (is_object($cell)) { $cell = (array) $cell; }

         if ($recursive === true && is_array($cell) && !empty($cell)) {
            // Recursive mode
            $table .= "\n" . array2table($cell, true, true) . "\n";
          else {
            $table .= (strlen($cell) > 0) ?
               htmlspecialchars((string) $cell) :
               $null;
         }

         $table .= '</td>';
}

         $table .= "</tr>\n";
   }

   $table .= '</table>';
   return $table;
}

print array2table($a);

}

 

samedi, 08 décembre 2018 19:58

Extraire du json, du XML en php

Écrit par

Cette fonction convertit un fichier (le contenu d'un fichier) en tableau

function json2array($fichier)
{
   $cnt = file_get_contents($fichier);
   return(json_decode($cnt,true));
}


Cette fonction convertit une URL d'un fichier XML en tableau

function xmlurl2array($fic){
   $x=simplexml_load_file($fic);
   return $x;
}


Cette fonction convertit une chaine XML en tableau associatif :

function xmlToArray($url, $options = array()) {
$xml=file_get_contents($url);
$defaults = array(
'namespaceRecursive' => false, //setting to true will get xml doc namespaces recursively
'removeNamespace' => false, //set to true if you want to remove the namespace from resulting keys (recommend setting namespaceSeparator = '' when this is set to true)
'namespaceSeparator' => ':', //you may want this to be something other than a colon
'attributePrefix' => '@', //to distinguish between attributes and nodes with the same name
'alwaysArray' => array(), //array of xml tag names which should always become arrays
'autoArray' => true, //only create arrays for tags which appear more than once
'textContent' => '$', //key used for the text content of elements
'autoText' => true, //skip textContent key if node has no attributes or child nodes
'keySearch' => false, //optional search and replace on tag and attribute names
'keyReplace' => false //replace values for above search values (as passed to str_replace())
);
$options = array_merge($defaults, $options);
$namespaces = $xml->getDocNamespaces($options['namespaceRecursive']);
$namespaces[''] = null; //add base (empty) namespace

//get attributes from all namespaces
$attributesArray = array();
foreach ($namespaces as $prefix => $namespace) {
if ($options['removeNamespace']) $prefix = "";
foreach ($xml->attributes($namespace) as $attributeName => $attribute) {
//replace characters in attribute name
if ($options['keySearch']) $attributeName =
str_replace($options['keySearch'], $options['keyReplace'], $attributeName);
$attributeKey = $options['attributePrefix']
. ($prefix ? $prefix . $options['namespaceSeparator'] : '')
. $attributeName;
$attributesArray[$attributeKey] = (string)$attribute;
}
}

//get child nodes from all namespaces
$tagsArray = array();
foreach ($namespaces as $prefix => $namespace) {
if ($options['removeNamespace']) $prefix = "";
foreach ($xml->children($namespace) as $childXml) {
//recurse into child nodes
$childArray = xmlToArray($childXml, $options);
list($childTagName, $childProperties) = each($childArray);

//replace characters in tag name
if ($options['keySearch']) $childTagName =
str_replace($options['keySearch'], $options['keyReplace'], $childTagName);
//add namespace prefix, if any
if ($prefix) $childTagName = $prefix . $options['namespaceSeparator'] . $childTagName;

if (!isset($tagsArray[$childTagName])) {
//only entry with this key
//test if tags of this type should always be arrays, no matter the element count
$tagsArray[$childTagName] =
in_array($childTagName, $options['alwaysArray']) || !$options['autoArray']
? array($childProperties) : $childProperties;
} elseif (
is_array($tagsArray[$childTagName]) && array_keys($tagsArray[$childTagName])
=== range(0, count($tagsArray[$childTagName]) - 1)
) {
//key already exists and is integer indexed array
$tagsArray[$childTagName][] = $childProperties;
} else {
//key exists so convert to integer indexed array with previous value in position 0
$tagsArray[$childTagName] = array($tagsArray[$childTagName], $childProperties);
}
}
}

//get text content of node
$textContentArray = array();
$plainText = trim((string)$xml);
if ($plainText !== '') $textContentArray[$options['textContent']] = $plainText;

//stick it all together
$propertiesArray = !$options['autoText'] || $attributesArray || $tagsArray || ($plainText === '')
? array_merge($attributesArray, $tagsArray, $textContentArray) : $plainText;

//return node as array
return array(
$xml->getName() => $propertiesArray
);
}