Aller au contenu

Signature dynamique


Xaelias

Messages recommandés

Bonsoir les gens !

J'ai passé ma soirée à me remettre vite fait au php pour pouvoir me faire une petite signature qui se mette à jour automatiquement à partir d'info contenues dans un fichier xml.

J'ai donc réussi à faire quelque chose de potable, mais cela reste perfectible. J'aurais donc quelques questions à poser :

-> Tout d'abord pour la mise à jour. N'ayant rien trouvé de mieux, pour l'instant je passe par hiwit qui me lance ma page php créant l'image en gros toutes les heures. Le tout étant hébergé sur une pageperso free, a priori je ne peux pas faire une actualisation automatique de là-bas. J'aurais bien tenté un script qui vérifiait la date de dernière actualisation (par date de création de l'image) mais comme on ne peut mettre de .php entre balises pas vraiment réalisable (j'aurais mis un header faisant que la page php renvoyait un png). Quelqu'un a une solution alternative ?

-> Ensuite j'ai fait le barbare (enfin j'ai utilisé ce que j'ai trouvé :transpi:) pour obtenir les infos du fichier xml. Sans rentrer dans les détails sur ma méthode, à partir d'un fichier xml de _azerty_7_7&t=51"]ce type : y'a-t-il un moyen (enfin je pense qu'il existe je l'ai juste pas trouvé ^^) d'obtenir directement l'info du UserID ? En disant par exemple qu'on veut l'info XML->user->userID.

Merci à vous ;)

Lien vers le commentaire
Partager sur d’autres sites

Bah écoute c'est pas bien compliqué en fait ^^

J'ai en gros suivi le tuto du sdz (ici) plus quelques recherches annexes sur des fonctions particulières en php.

Après pour traiter le xml, pour l'instant j'y vais vraiment à la barbare donc j'ai un peu honte de mon code (je n'ai jamais eu de cours de php :pleure:) que j'ai fais à la va comme j'te pousse...

Donc me gueulez pas dessus svp :craint:

[EDIT] Bon euh je sais pas comment faire pour mettre le code dans un truc qui fasse pas un poste de 3 kilomètres (y'a pas de barre de défilement qui s'ajoute :/) donc j'upload le code dans un txt à côté -> http://xaelias.free....ature/image.txt

Pour expliquer brièvement, le code du début n'est pas de moi, je l'ai choppé directement sur internet, il sert juste à convertir un nombre en secondes en une date en jours/h/m/s (faudra que je rajoute le mois à l'occasion d'ailleurs :transpi:). Comme je sais le faire j'ai préféré gagner du temps :transpi:

Ensuite, je gère les xml à l'aide de "dom", technique trouvée au détour d'internet toujours. Ensuite ce qui ne me plait pas dans le code, c'est que pour l'instant je suis obligé de chercher toutes les entrées (à défaut de savoir faire mieux...) du fichier xml qui ont pour intitulé "maxuptime_in_sec" par exemple, puis de traiter ce relevé à l'aide d'une boucle for... quand il n'y a qu'une ou deux valeurs, je me dis qu'il y a sûrement plus simple... surtout que je suis obligé de faire des trucs moches comme de modifier en boucle une variable pour finalement ne garder que la dernière valeur...

Quoi qu'il en soit... Voilà comment ça fonctionne pour le moment.

Ensuite, j'ajoute les différents textes à l'aide d'imagestring, dont l'utilisation se comprend assez bien tout seul (le premier des 3 entiers (qui est compris entre 1 et 5) désigne la taille de la police d'écriture).

Voilà rien de vraiment compliqué comme je le disais plus tôt ;)

[EDIT] Le echo(ok) à la fin n'est là que parce qu'Hiwit génère des erreurs quand le script renvoie une page blanche.

Lien vers le commentaire
Partager sur d’autres sites

[EDIT] Bon euh je sais pas comment faire pour mettre le code dans un truc qui fasse pas un poste de 3 kilomètres (y'a pas de barre de défilement qui s'ajoute :/) donc j'upload le code dans un txt à côté -> http://xaelias.free....ature/image.txt

Il te faut utiliser des balises [ code ] ;)

Et tu coles ton texte là dedans.

Lien vers le commentaire
Partager sur d’autres sites

Essaie de voir pour utiliser xml_parse (http://fr2.php.net/manual/fr/function.xml-parse.php) regarde dans les commentaires, il y a un gars qui renvoie le xml dans un array. Peut être que ce serait plus simple ;)

Enfin je sais pas, j'ai pas trop eu le temps de me pencher dessus (en tout cas, c'est vraiment bien pour un gars qui n'a jamais eu de cours de PHP ;) )

Lien vers le commentaire
Partager sur d’autres sites

Nan mais je me fais tout petit pour pas me faire taper ^^ J'ai quelques bases de programmation (en prépa donc on fait du caml pour ceux qui connaissent) et j'ai déjà fais mumuse avec les cours de c/xhtml/php du site du zéro donc je me lance pas dans l'inconnu total non plus ^^

Je jette un ½il à ton lien dans la soirée ;)

Lien vers le commentaire
Partager sur d’autres sites

Pour le XML, je te conseillerais SimpleXML qui te permet de faire des requêtes XPath :

$fp = simplexml_load_file( "/chemin/vers/mon/fichier.xml");
$userId = array_pop($fp->xpath('/path/to/userId')); // la méthode xpath renvoie un tableau ou FALSE, donc on 'pop' l'élément

Vraiment le plus simple à utiliser.

Son principal inconvénient est que le fichier est chargé entièrement en mémoire, donc attention sur les gros fichiers...

Pour ton problème d'extension, rien ne t'empêche de faire un script php qui se termine par .png hein, après, c'est juste au niveau de la configuration du serveur.

Chez free, la réécriture d'URL est désactivée, il faut utiliser un trick dans un .htaccess:

ErrorDocument 404 http://mon_compte.pagesperso.free.fr/monscript.php

qui redirige toutes les demandes 404 vers ton script, et ça reste transparent.

Il faut ensuite tester dans ton script:

if( $_SERVER['REQUEST_URI'] === "http://mon_compte.pagesperso.free.fr/masignature.png") {
       // ton code ici
} else {
echo 'Désolé, la page spécifiée est introuvable...';
}

De plus, ton image sera générée à chaque appel, à toi de voir si tu fais un système de cache dans ton script (tu écris ton image dans masignature.png.cache, l'heure de la dernière génération dans monscript.log, et si tu dépasses pas un certain délai, tu renvoies simplement l'image en cache sinon tu la régénères avant de l'envoyer).

Lien vers le commentaire
Partager sur d’autres sites

Oua classe ^^

Je regarde ça ce soir tout pareil qu'au-dessus ! Pour éviter que l'image ne soit ré-écrite à chaque fois, j'avais croisé un bout de code javascript qui vérifiait la date de création du fichier, la comparait à la date de l'appel, et ensuite, il suffisait soit de regénérer le truc (dans mon cas l'image) soit de rediriger vers l'ancienne.

En tous cas je vais apprendre des trucs avec tout ça !

Merci à vous tous ;)

[EDIT] J'ai mis à jour le txt avec mes dernières modifications (ajout du cadre que j'avais la flemme de faire sous gimp :transpi:, et des qques infos supplémentaires).

Lien vers le commentaire
Partager sur d’autres sites

Alors j'ai presque réussi à faire ce que je voulais. Je n'ai pas eu le temps de me re-pencher sur le xml pour le moment, je me suis juste intéressé à la mise à jour.

Donc j'ai eu plusieurs pbs de mise en place, principalement causés par mon manque d'habitude du php.

Au final, j'arrive à avoir une page qui recrée la signature si le fichier image n'existe pas ou s'il est plus vieux qu'un temps fixé. Par contre, le

if( $_SERVER['REQUEST_URI'] === "http://mon_compte.pagesperso.free.fr/masignature.png") {
       // ton code ici
} else {
echo 'Désolé, la page spécifiée est introuvable...';
}

me pose problème. Alors qu'il fonctionnait dans mes premières versions (je l'avais ensuite enlevé pour éliminer des sources potentielles d'erreurs), maintenant c'est comme s'il ne faisait plus effet... Déjà j'ai d^remplacé le === par =, sinon il me sort le else systématiquement. Sauf que maintenant il ne me sort jamais le cas else :/

En soit ce n'est pas bien grave, vu que la signature est dans un dossier qui ne sert qu'à ça, mais sur le fond c'est étrange...

A vrai dire j'ai l'impression d'avoir fait tous les tests possibles, et la seule conclusion logique qui m'apparait c'est que la variable if( $_SERVER['REQUEST_URI'] n'est pas bien mise à jour...

Quelqu'un peut vérifier le bout de code ?

En tous cas merci pour l'aide ;)

Lien vers le commentaire
Partager sur d’autres sites

Oui j'ai réalisé après pour le = simple :transpi: Par contre je ne connaissais pas la différence entre le double et le triple merci ;)

Sinon j'ai refais divers tests, et une page (test.php) qui ne contient que :

<?php
echo $_SERVER['REQUEST_URI'];
?>

Page sur laquelle je me redirige avec :

ErrorDocument 404 http://xaelias.free.fr/signature/test.php

dans le .htaccess placé dans le même dossier, me donne :

/signature/test.php

Et ce quelque soit l'adresse (fausse ^^) avec laquelle j'atteins la page. Rien d'étonnant donc à ce que le script ne fonctionne pas comme je le veuille ^^

Lien vers le commentaire
Partager sur d’autres sites

Oui j'ai réalisé après pour le = simple :transpi: Par contre je ne connaissais pas la différence entre le double et le triple merci ;)

Sinon j'ai refais divers tests, et une page (test.php) qui ne contient que :

<?php
echo $_SERVER['REQUEST_URI'];
?>

Page sur laquelle je me redirige avec :

ErrorDocument 404 http://xaelias.free.fr/signature/test.php

dans le .htaccess placé dans le même dossier, me donne :

/signature/test.php

Et ce quelque soit l'adresse (fausse ^^) avec laquelle j'atteins la page. Rien d'étonnant donc à ce que le script ne fonctionne pas comme je le veuille ^^

Essaies avec

if( "masignature.png" === array_pop( explode( '/',$_SERVER['HTTP_REFERER']))) {
// La gestion de cache et génération d'image ici
} else {
echo 'Désolé, page introuvable';
}

? On sait jamais, sur un malentendu, ça peut marcher :transpi:

Petites explications:

  • $_SERVER['HTTP_REFERER'] contient la chaine de la dernière page visitée avant d'atteindre le script, donc peut-être qu'elle contient la page "introuvable"; on explose la chaîne par rapport aux slash, puis on prend le dernier élément du tableau avec array_pop, ce qui renvoie donc le nom du fichier que tu as demandé (quel que soit le nombre de sous-répertoires avant)
  • Le triple égal est plus rapide et plus sûr que le double car il teste le type avant toute chose:
    - avec le double égal, il teste le type, et si le type ne correspond pas, il caste l'élément de droite vers le type de l'élément de gauche avant de comparer les valeurs.
    - avec le triple égal, il teste le type, et s'il ne correspond pas, le test renvoie FALSE
    On évite donc une opération de transtypage (=cast) si le type n'est pas bon, ce qui évite des aberrations du style if( 0 == False) :)

Bon courage pour l'avancement de ton code!

Lien vers le commentaire
Partager sur d’autres sites

J'avais vu pour le request_uri, je faisais donc le test juste sur la fin de l'url de l'image. Quoi qu'il en soit, le $_SERVER['HTTP_REFERER'] semble ne rien renvoyer... (un echo dessus ne donne rien entre autres)

Donc du coup ce code me remet directement sur le texte page introuvable.

Sinon marrant le coup du tableau ^^

Lien vers le commentaire
Partager sur d’autres sites

Je me permets de reposter, j'ai donc quasi fini mon script.

Merci à vous tous pour l'aide que vous m'avez apportée ! Finalement pour gérer le fichier xml je suis passé simpleXML comme préconisé par BarthVonRies. Ça allège vraiment le tout.

Maintenant j'ai même un script facilement adaptable si ça intéresse quelqu'un. Il y a juste à modifier tout ce qui est nom de compte et ids de machines (<- ça va p-ê changerselon ce que fait tugs ^^) et les textes s'adaptent. Reste à modifier à la main la position des textes si vous changez de fond et qu'ils sont mal placés (ou sur une image plus grande).

Reste aussi à régler le pb de la redirection qui ne veut pas se faire correctement mais c'est moins grave ;)

Voilà !

Donc pour cette histoire d'erreur 404 j'attends toujours vos conseils, sinon c'est perfect ;) Encore merci à tous.

<?php
header ("Content-type: image/png");
//Informations à rentrer
$tpsActu = 30; //temps en minutes entre deux actualisation de la signature
//pour F@H
$usernameFatH = "[inpact]_Xaelias";
$teamFatH = "51";
//Pour Tugs Uptime Project
$usernameTUP = "Xaelias";
$nbrMachine = 3;//Bien mettre le bon nombre en fonctione du nombre de machine !
$id1 = "4244";
$id2 = "4248";
$id3 = "4254";
//Créer autant d'Id que nécessaire
//id4 =...;

if(file_exists("sign.png")) {//si la signature a déjà été générée
$lastMaj = filemtime("sign.png"); // on recupere sa date de création en seconde
$today = time(); // on recupere la date du jour en seconde
$diffTime = ($today - $lastMaj)/($tpsActu*60); // on compare les deux date en seconde
} else { //si le fichier n'existe pas, on définit les deux variables suivantes pour que le test suivant soit vrai
$diffTime = 2;
$alerte = 1;
}
if ($diffTime > 1) { //si le fichier a plus de 30 minutes (ou n'existait pas) on va le créer

//fonction permettant l'affichage d'un temps en seconde dans un format plus littéraire
function transforme($time)
{
	$jour = floor($time/86400);
	$reste = $time%86400;

	$heure = floor($reste/3600);
	$reste = $reste%3600;

	$minute = floor($reste/60);
	$seconde = $reste%60;

	// on rassemble les résultats en forme de date
	$result = $jour.'d '.$heure.'h '.$minute.'min '.$seconde.'s';
	return $result;
}

$image = imagecreatefrompng("fond.png"); //sélectionne l'image de base (normalement en 500*150)

//Préparation de plusieurs couleurs
$orange = imagecolorallocate($image, 255, 128, 0);
$bleu = imagecolorallocate($image, 0, 0, 255);
$bleuclair = imagecolorallocate($image, 156, 227, 254);
$noir = imagecolorallocate($image, 0, 0, 0);
$blanc = imagecolorallocate($image, 255, 255, 255);

//traitement des informations de Tugs Uptime Project
$tpsMaxSecondes = 0;//servira à afficher le temps de la machine ayant l'uptime le plus long
$tpsSecondes = 0;//servira à afficher l'uptime total du compte
$nbrReboot = 0;//Nombre de reboot de toutes les machines

for ($i=1;$i<=$nbrMachine;$i++) {
${'dom'.$i} = simplexml_load_file("http://online.uptimeprj.com/export/index/".${'id'.$i}."/fr/fr.xml");//on charge le fichier xml de la machine i

${'maxuptime'.$i} = array_pop(${'dom'.$i}->xpath('/tupxmlexport/machine/maxuptime_in_sec'));//temps maximal d'uptime de la machine i
${'uptime'.$i} = array_pop(${'dom'.$i}->xpath('/tupxmlexport/machine/uptime_in_sec'));//temps d'uptime actuel de la machine i
${'reboot'.$i} = array_pop(${'dom'.$i}->xpath('/tupxmlexport/machine/nbrreboot'));//nombre de reboot de la machine i
$tpsMaxSecondes = max($tpsMaxSecondes,${'maxuptime'.$i});//on prend le maximum entre le précédent maximum et le temps de la machine i
$tpsSecondes = $tpsSecondes + intval(${'uptime'.$i});//on additionne au total précédent le temps d'uptime de la machine i
$nbrReboot = $nbrReboot + intval(${'reboot'.$i});//on additionne tous les reboot
}

//traitement des informations de F@H
$domfah = simplexml_load_file("http://folding.extremeoverclocking.com/xml/user_summary.php?un=".$usernameFatH."&t=".$teamFatH);//on charge le fichier xml associé au compte

$WU = array_pop($domfah->xpath('/EOC_Folding_Stats/user/WUs'));//nombre d'unité complétée
$points = array_pop($domfah->xpath('/EOC_Folding_Stats/user/Points'));//nombre de points du compte
$ptshour = array_pop($domfah->xpath('/EOC_Folding_Stats/user/Points_24hr_Avg'));//nombre de points moyen par heure du compte
$rank = array_pop($domfah->xpath('/EOC_Folding_Stats/user/Overall_Rank'));//rang global du compte
$deltaRank = array_pop($domfah->xpath('/EOC_Folding_Stats/user/Change_Rank_7days'));//progression du compte dans le classement global au cours de la semaine précédente

//incrustation du texte
imagestring($image, 1, 7, 137, "MAJ : ".Date("D d/m/o H:i:s"), $blanc); //Date au format Ddd jj/mm/aa hh:mm:ss (ie Thu 30/04/2010 05:05:05)
imagestring($image, 3, 245, 15, "Tugs Uptime Project ", $blanc);
imagestring($image, 2, 386, 15, "(".$usernameTUP.") :", $blanc);
imagestring($image, 2, 245, 32, "Best uptime : ".transforme($tpsMaxSecondes), $blanc);
imagestring($image, 2, 245, 43, "Total uptime : ".transforme($tpsSecondes), $blanc);
imagestring($image, 2, 245, 54, "Number of reboot : ".$nbrReboot." (".$nbrMachine." active machines)", $blanc);
imagestring($image, 3, 245, 85, "Folding@Home ", $blanc);
imagestring($image, 2, 337, 85, "(".$usernameFatH." ".$teamFatH.") :", $blanc);
imagestring($image, 2, 245, 102, "WUs completed : ".$WU, $blanc);
imagestring($image, 2, 245, 113, "Points : ".$points." (24h avg : ".$ptshour.")", $blanc);
if ($deltaRank<0) {
	imagestring($image, 2, 245, 124, "Rank : ".$rank." (".$deltaRank." last week)", $blanc);
	} else {
	imagestring($image, 2, 245, 124, "Rank : ".$rank." (+".$deltaRank." last week)", $blanc);
}

//Création d'un cadre de taille 2px laissant une marge de 2px autour
$largeur = imagesx($image);
$hauteur = imagesy($image);
ImageLine ($image, 3, 3, $largeur-3, 3, $noir);
ImageLine ($image, 3, 4, $largeur-3, 4, $noir);
ImageLine ($image, 3, 3, 3, $hauteur-3, $noir);
ImageLine ($image, 4, 3, 4, $hauteur-3, $noir);
ImageLine ($image, 3, $hauteur-3, $largeur-3, $hauteur-3, $noir);
ImageLine ($image, 3, $hauteur-4, $largeur-3, $hauteur-4, $noir);
ImageLine ($image, $largeur-3, 3, $largeur-3, $hauteur-3, $noir);
ImageLine ($image, $largeur-4, 3, $largeur-4, $hauteur-3, $noir);

imagepng($image, "sign.png"); //enregistre le résultat dans le fichier sign.png et on l'affiche
} else {
//on affiche l'image qui existe et qui est assez récente
$image = imagecreatefrompng("sign.png");
imagepng($image);
}
?>

[EDIT] 31/12/2010 remplacement du code en ayant modifié quelques détails mineurs

Lien vers le commentaire
Partager sur d’autres sites

:up:

Et question supplémentaire que je me pose grâce à Terminou.

Est-ce que vous pensez que l'ajout d'une bdd qui stockerait les infos présentent dans la dernière signature générée serait utile ? Ainsi la décision de générer ou pas une nouvelle version de la signature se ferait non pas sur l'ancienneté de celle-ci, mais sur le fait qu'au moins une des infos ait changée.

Est-ce que vous voyez un autre moyen de faire ceci ?

Bon et puis toujours cette histoire de redirection 404 assez étrange ^^

Lien vers le commentaire
Partager sur d’autres sites

Le but c'est d'obtenir le plus rapidement possible ton image. Actuellement les deux opérations les plus lourdes (en terme de temps) sont de récupèrer le fichier XML et de générer l'image.

Ta source de données est un fichier XML distant. Ce qui est contraignant, c'est de vérifier régulièrement si les données ont changé afin de générer ou non une nouvelle image.

En gros il faudrait que ton script PHP s'exécute automatiquement (sans navigateur) toutes les 15 minutes (avec CRON par exemple) pour vérifier les mises à jour. Si mise à jour il y a, alors on génère une nouvelle image avec ces informations.

Du coup ta signature sera accessible directement avec un lien vers l'image.

Je ne vois pas l'intérêt d'utiliser une base de données, à moins d'historiser les données pour faire des statistiques.

Lien vers le commentaire
Partager sur d’autres sites

Sauf que pour vérifier s'il y a mise à jour il faut bien stocker les données précédentes quelques part non ?

D'où l'idée de la BDD ;)

Mais je n'avais pas pensé aux statistiques je pense que je vais le faire du coup ^^ Par contre :cartonrouge: à Free qui n'autorise pas le PDO pour le mysql...

Lien vers le commentaire
Partager sur d’autres sites

Peut-être, je n'ai aucune formation concernant la charge nécessaire au traitement d'une BDD. A priori je ne voyais pas de différence flagrante de puissance ou de temps requis. Mais si tu dis le contraire je veux bien te croire ;)

Merci pour ces infos en tous cas. Je vais y réfléchir un peu plus avant de décider si je fais quelque chose ou non.

Lien vers le commentaire
Partager sur d’autres sites

Peut-être, je n'ai aucune formation concernant la charge nécessaire au traitement d'une BDD. A priori je ne voyais pas de différence flagrante de puissance ou de temps requis. Mais si tu dis le contraire je veux bien te croire ;)

Merci pour ces infos en tous cas. Je vais y réfléchir un peu plus avant de décider si je fais quelque chose ou non.

En effet, il n'y aura aucune différence de temps de traitement.

C'est juste qu'une base de données ce n'est pas adapté à ce que tu veux faire, sauf pour conserver un historique en vue de générer des stats.

Ceci dit, rien ne t'empêche d'en utiliser une. :francais:

Lien vers le commentaire
Partager sur d’autres sites

Archivé

Ce sujet est désormais archivé et ne peut plus recevoir de nouvelles réponses.

×
×
  • Créer...