Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

ENREGISTRER UNE IMAGE D'UN SITE DISTANT


Information sur la source

Catégorie :Réseau & Internet Classé sous : socket, image, connection serveur, HTTP Niveau : Débutant Date de création : 07/04/2008 Date de mise à jour : 08/04/2008 09:28:11 Vu : 4 270

Note :
8 / 10 - par 1 personne
8,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

Commentaire sur cette source (23)
Ajouter un commentaire et/ou une note

Description

Cette class permet d'enregistrer localement une image d'un site web.
Il faut pour cela connaître l'adresse (URL) exacte de l'image (voir WebPage).

 

Source

  • <?php
  • class WebImage {
  • private $sHost;
  • private $sPath = "/";
  • private $sUrl;
  • private $sFile;
  • private $sReferer;
  • private $iCode; // réponse du serveur
  • private $aHeader = Array(); // entête de la réponse du serveur
  • private $sData = ""; // donnée de l'image
  • private $aLinksToImages = Array(); // tableau contenant les liens vers les images
  • private $bExist = false; // l'image n'existe pas encore
  • private $sFolderRoot = "../distant/"; // dossier contenant les sous dossier
  • //############################## accesseur ##########################################
  • function getHost() { return $this->sHost;}
  • function getFile() { return $this->sFile;}
  • function getArrayOfLinksToImages() { return $this->aLinksToImages;}
  • function isSaved() { return $this->bExist;}
  • //############################## constructeur ##########################################
  • function __construct ( $sUrlImage, $sUrlPage)
  • {
  • $this->sUrl = $sUrlImage; // adresse de l'image
  • $this->sReferer = $sUrlPage; // adresse de la page de l'image
  • $aTmp = explode("/", $sUrlImage);
  • $this->sHost = $aTmp[0]; // nom du site distant
  • $this->sFile = $aTmp[sizeof($aTmp)-1]; // nom de l'image
  • for ($i=1;$i < sizeof($aTmp)-1;$i++) { // chemin vers le dossier de l'image
  • $iPos_Interrogation = strpos($aTmp[$i], "?");
  • if ($iPos_Interrogation === false) { // si on trouve pas de "?"
  • $this->sPath .= $aTmp[$i] . "/"; // ajout de tous les dossiers
  • }
  • else {
  • $i = sizeof($aTmp); // arrêt de la boucle
  • }
  • }
  • }
  • // renvoi un tableau avec l'entête et l'image
  • function Save() {
  • if (!file_exists($this->sFolderRoot.$this->sPath.$this->sFile) ) {
  • $rFp = fsockopen($this->sHost, 80, $errno, $errstr, 30);
  • if (!$rFp) {
  • return 404; // en cas d'erreur de flux, on renvoi le code 404 "Page Not Found"
  • } else {
  • fputs($rFp, "GET ".$this->sPath.$this->sFile." HTTP/1.1\r\n");
  • fputs($rFp, "Host: ".$this->sHost."\r\n");
  • fputs($rFp, "Referer: ".$this->sReferer."\r\n");
  • fputs($rFp, "User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)\r\n\r\n");
  • fputs($rFp, "\r\n");
  • $bInHeader = true;
  • while (!feof($rFp)) {
  • // récupération des données
  • $sLigne = fgets($rFp, 4096);
  • if ($bInHeader == true) {
  • $this->aHeader[] = $sLigne;
  • // on récupère le code sur la première ligne qui est comme ceci : HTTP/1.1 200 OK
  • $aTmpCode = explode(" ", $this->aHeader[0]);
  • $this->iCode = $aTmpCode[1];
  • }
  • else {
  • // si l'image est trouvée (HTP/1.1 200 OK)
  • if ($this->iCode == 200) {
  • $this->sData .= $sLigne;
  • }
  • }
  • if ( (strlen($sLigne) < 3) && ($bInHeader == true) ) {
  • $bInHeader = false;
  • }
  • }
  • fclose($rFp);
  • // enregistrement du fichier
  • $sFolder = str_replace("/", "", $this->sPath)."/";
  • $filename = $this->sFolderRoot.$sFolder.$this->sFile; // chemin complet vers l'image
  • // création du dossier
  • if (!file_exists($this->sFolderRoot.$sFolder."/")) {
  • mkdir($this->sFolderRoot."/".$sFolder, 0777);
  • }
  • // écriture du fichier
  • if (!$handle = fopen($filename, 'wb')) {
  • return false;
  • }
  • if (fwrite($handle, $this->sData) === FALSE) {
  • return false;
  • }
  • fclose($handle);
  • // vérification
  • if (file_exists($filename)) {
  • $this->bExist = true;
  • }
  • }
  • // return
  • return true;
  • }
  • else {
  • $this->bExist = true;
  • }
  • }
  • // renvoi le chemin vers le fichier downloadé
  • function showImage() {
  • $sFolder = str_replace("/", "", $this->sPath)."/";
  • return $this->sFolderRoot.$sFolder.$this->sFile;
  • }
  • function Resize() {
  • }
  • }
  • ?>
<?php
	class WebImage {
		private $sHost; 
		private $sPath = "/";
		private $sUrl;
		private $sFile;
		private $sReferer;
		private $iCode;                                              // réponse du serveur
		private $aHeader = Array();                                  // entête de la réponse du serveur
		private $sData = "";                                         // donnée de l'image
		private $aLinksToImages = Array();                           // tableau contenant les liens vers les images
		private $bExist = false;                                     // l'image n'existe pas encore
		private $sFolderRoot = "../distant/";                         // dossier contenant les sous dossier
		
		
		//############################## accesseur ##########################################
		function getHost() { return $this->sHost;}
		function getFile() { return $this->sFile;}
		function getArrayOfLinksToImages() { return $this->aLinksToImages;}
		function isSaved() { return $this->bExist;}			
		//############################## constructeur ##########################################
		function __construct ( $sUrlImage, $sUrlPage) 
		{
			$this->sUrl = $sUrlImage;                                // adresse de l'image
			$this->sReferer = $sUrlPage;                             // adresse de la page de l'image
			$aTmp = explode("/", $sUrlImage);
						
			$this->sHost = $aTmp[0];                                 // nom du site distant
			$this->sFile = $aTmp[sizeof($aTmp)-1];                   // nom de l'image
		
			for ($i=1;$i < sizeof($aTmp)-1;$i++) {                   // chemin vers le dossier de l'image
				$iPos_Interrogation = strpos($aTmp[$i], "?");
				if ($iPos_Interrogation === false) {                 // si on trouve pas de "?"
					$this->sPath .=  $aTmp[$i] . "/";                // ajout de tous les dossiers
				}
				else {
					$i = sizeof($aTmp);                              // arrêt de la boucle
				}
			}
			
		}
		
		// renvoi un tableau avec l'entête et l'image
		function Save() {
			if (!file_exists($this->sFolderRoot.$this->sPath.$this->sFile) ) {
				
				$rFp = fsockopen($this->sHost, 80, $errno, $errstr, 30);
				if (!$rFp) {
					return 404; // en cas d'erreur de flux, on renvoi le code 404 "Page Not Found"
				} else {
							
					fputs($rFp, "GET ".$this->sPath.$this->sFile." HTTP/1.1\r\n");
					fputs($rFp, "Host: ".$this->sHost."\r\n");
					fputs($rFp, "Referer: ".$this->sReferer."\r\n");
					fputs($rFp, "User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)\r\n\r\n");
					fputs($rFp, "\r\n");
			
					$bInHeader = true;
				
					while (!feof($rFp)) {
						// récupération des données
						$sLigne = fgets($rFp, 4096); 
						
						if ($bInHeader == true) {
							$this->aHeader[] = $sLigne; 
							// on récupère le code sur la première ligne qui est comme ceci : HTTP/1.1 200 OK
							$aTmpCode = explode(" ", $this->aHeader[0]);
							$this->iCode = $aTmpCode[1];
						}
						else {
							// si l'image est trouvée (HTP/1.1 200 OK)
							if ($this->iCode == 200) {
								$this->sData .= $sLigne;
							}
						}
					
						if ( (strlen($sLigne) < 3)  && ($bInHeader == true) ) {
							$bInHeader = false;
						}
				}
					fclose($rFp);
			
					// enregistrement du fichier
					$sFolder = str_replace("/", "", $this->sPath)."/";
					$filename = $this->sFolderRoot.$sFolder.$this->sFile;      // chemin complet vers l'image
									
					// création du dossier
					if (!file_exists($this->sFolderRoot.$sFolder."/")) {
						mkdir($this->sFolderRoot."/".$sFolder, 0777);
					}
				
					// écriture du fichier
					if (!$handle = fopen($filename, 'wb')) {
						return false;
					}	
					if (fwrite($handle, $this->sData) === FALSE) {
						return false;
					}
					fclose($handle);
				
					// vérification
					if (file_exists($filename)) {
						$this->bExist = true;
					}	
				}
				// return
				return true;
			}
			else {
				$this->bExist = true;
			}
			
		}
		
		// renvoi le chemin vers le fichier downloadé
		function showImage() {
			$sFolder = str_replace("/", "", $this->sPath)."/";
			return $this->sFolderRoot.$sFolder.$this->sFile;
		}
		
		function Resize() {
			
		}
		
		
	}
?>

Conclusion

ne me tappez pas ... :-D
 

Historique

07 avril 2008 16:56:14 :
Source illégale...
08 avril 2008 09:28:11 :
remise en ligne de la source ... Aïe Aïe

Commentaires et avis

signaler à un administrateur
Commentaire de depression le 07/04/2008 16:52:30

C'est illégal!

signaler à un administrateur
Commentaire de coucou747 le 07/04/2008 18:21:43

qu'y avait-il d'illegal ?

signaler à un administrateur
Commentaire de yoman64 le 07/04/2008 18:39:38

J'aimerais bien savoir aussi ce qu'il y a d'illégal à enregistrer une image en php ? lol

signaler à un administrateur
Commentaire de malalam le 07/04/2008 19:37:12 administrateur CS

Hello,

heu, moi aussi...? D'autant plus que la source n'a pas été supprimée par un admin apparemment...

signaler à un administrateur
Commentaire de codefalse le 07/04/2008 21:40:34 administrateur CS

vraiment je suis aussi curieux !! :p

signaler à un administrateur
Commentaire de kiki67100 le 08/04/2008 04:41:32

Moi aussi j'aimerais savoir en quoi cette source est illégal . faudrais que l'auteur s'explique.

signaler à un administrateur
Commentaire de waterw72 le 08/04/2008 08:27:15

Bonjour,
Bon oK, je vais donc m'expliquer (...)
Ma source (une classe) permettait d'enregistrer une image d'un site web en connaissant son URL exacte( ex :nom_de_domaine/chemin/nom_du_fichier.jpg).
J'envoyais au serveur distant la même chose qu'un navigateur internet en utilisant "fsockopen".
Je lisais les données en retour avec fgets et enregistrais l'image dans un répertoire de mon site web (local).

A titre d'info, je récupérais les URL des images en parcourant les balise <a> d'une page web dont la cible (href) contenait ".jpg".

Voila, c'est vrai qu'en voyant le premier commentaire, je me suis posé des questions et ai effacé ma source.

signaler à un administrateur
Commentaire de VestaX le 08/04/2008 09:07:41

dommage, moi qui débute dans les sockets, ca aurrais pu m'aider :(
snifff

signaler à un administrateur
Commentaire de codefalse le 08/04/2008 09:25:48 administrateur CS

D'apres ton commentaire, Waterw72, je ne vois toujours pas ce qu'il y a d'illégal !!

Je te propose de remettre ta source, si elle est vraiment illégale, un admin cs s'en chargera, t'inquiete pas :)
Tant que tu propose pas un systeme pour cracker les cb, tu risque pas de te faire virer :p Tu peux pas tout savoir au niveau légalité, bien que "nul n'est sensé ignorer la loi" :p

@Depression : Pourrais-tu détailler la raison de ton commentaire ?

signaler à un administrateur
Commentaire de winwarrior le 08/04/2008 09:49:58

Pourquoi pas utiliser:
file_put_contents('/path/to/local/image.ext', file_get_contents('http://site.tld/path/to/image.ext')) ?

signaler à un administrateur
Commentaire de waterw72 le 08/04/2008 09:53:44

Je sais pas.
Peut-être parce que je suis débutant et que je ne connais pas ces fonctions. :)

signaler à un administrateur
Commentaire de codefalse le 08/04/2008 10:01:53 administrateur CS

Les fonctions file_*_contents fonctionneront sur des url seulement si les fopen wrappers sont activés, ce qui n'est pas forcément le cas :/
Apres tu peux aussi implémenter ton propre stream_wrapper :)

Je ne sais pas si faire une classe pour récuperer une image soit une bonne idée. Une simple fonction suffirait dans ce cas.

Indique la portée des fonctions aussi. Tu le fait pour les variables (private, c'est bien), fait le aussi pour les fonctions, public/protected/private :)

signaler à un administrateur
Commentaire de jantosze le 08/04/2008 10:59:37

Salut,

Une indication du type d'erreur eût été à point, par exemple,
private $statusHandle = 0;
getStatus { return $this->statusHandle;}
Puis avant l'un des return false de Save() un petit code indicatif dans statusHandle et voila un utilisateur pas pris au dépourvu...

signaler à un administrateur
Commentaire de webdeb le 09/04/2008 09:16:46

Cette pratique est illégale dans la mesure où l'on ne possède pas les droits / permissions du propriétaire du site pour récupérer son contenu iconographique. Si en revanche, tu t'amuses à récupérer des images qui t'appartiennent et que tu héberges sur ton Flickr par exemple, c'est tout à fait légal. Il faut juste savoir faire la différence entre "une pratique illégale" et une source qui quant à elle est légale.

signaler à un administrateur
Commentaire de jantosze le 09/04/2008 10:38:04

Bonjour,

Si je regarde les différentes spécifiées de la loi j'ai quoi:
- Les droits de l'auteur tels que définis dans L112-1 et 112-2, donc c'est bien le propriétaire de la photo( graphisme...) qui conserve la propriété du bien,
- Mais le fait de le déposer (le bien) sur un espace public il prend (le propriétaire) la décision de la diffuser et de l'exploiter alors nous rentrons dans le régime des droits patrimoniaux càd:
- Le droit de reproduction, concrètement c'est un contrat (écrit ou orale) par lequel le propriétaire vend à un éditeur de son choix (dans notre cas tout le monde puisque le bien est téléchargeable sur un espace public) qui permet une rétribution de l'auteur par l'éditeur d'un certain % des ventes ( donc dans le pire des cas n% de 0 = 0).
- Le droit de représentation, c'est la communication au public (càd tu as télécharger la photo et d'autres viennent la visiter ou la télécharger pour un usage personnel) Dans ce cas il existe un contrat tacite ou formuler qui règle une rémunération de l'auteur en fonction du CA dégagé des ventes de représentations ( ici aussi n% de 0 = 0).
- Le droit de suite, c'est-à-dire que l'auteur perçoit n% lors d'une vente aux enchères par exemple, donc même raisonnement que dans les cas précédents,
- Le droit moral càd:
- Le droit de divulgation, seul l'auteur décide de la façon de divulguer l'œuvre, dans notre cas c'est claire elle est mise à dispos sur un espace public.
- Le droit de paternité, donc la photo doit être identifiée (sauf anonymat ou pseudo) donc attention à ce point
le droit au respect de œuvre, son intégrité doit être préservée, le fait de copier respecte cette condition,
- Le droit de repentir ou de retrait, il permet à l'auteur de faire retirer l'œuvre à tout moment. Attention l'exposant peut demander une indemnisation d'un préjudice subi!!!

Un peu long certes, mais dans ces conditions copier une photo, un graphisme, ne comportant pas une formulation de protection de droits d'auteur et de conditions d'exploitation,  mis à disposition sur un site ne me semble pas illégal.C'est bien à l'auteur de prendre ses dispositions de protection.


signaler à un administrateur
Commentaire de webdeb le 09/04/2008 10:56:44

Quelle que soit l'oeuvre (images, article, poème, roman, vidéo, musique, son...) diffusée publiquement sur Internet, elle ne peut être récupérée sans autorisation expresse de la part de son auteur. C'est pourquoi il faut faire très attention avec cette pratique. Ce n'est pas parceque l'oeuvre est diffusée publiquement que l'on a le droit de se l'accaparer.

C'est comme lorsque vous allez au cinéma, à un concert ou bien dans une exposition de peinture. Vous allez dans un lieu public pour apprécier une oeuvre mais ce n'est pas pour autant que vous allez enregistrer le film avec votre camescope, ou bien enregistrer en live le concert ou encore repartir avec le Picasso que vous avez devant les yeux.

Sur Internet, c'est pareil ! L'auteur diffuse sa création (oeuvre de l'esprit) au public mais n'autorise pas forcément sa reprise, sa modification, sa rediffusion...

Notez également que pour "linker" une page externe de son site perso, il faudrait en théorie demander l'autorisation du propriétaire du site externe ainsi que des auteurs des oeuvres présentes sur la page si ce dernier héberge des créations d'auteur. Bien sûr presque personne ne respecte cette règle mais c'est bon de le savoir quand même.

signaler à un administrateur
Commentaire de jantosze le 09/04/2008 11:20:43

C'est ce que j'ai écrit, et comme tu le soulignes c'est bien à l'auteur à spécifier que l'œuvre exposée est soumise à la législation des droits patrimoniaux le (c) et nécessite pour son exploitation un contrat spécifique (même si tacitement il en existe un ).
Attention de ne pas faire l'amalgame entre lieux publics et privés. Par exemple se rendre chez UGC et enregistrer le film en douce c'est du vol, par contre si UGC projette sur la place publique un film et je l'enregistre c'est légal au sens des droits patrimoniaux, c'est l'usage de l'enregistrement qui peut présenter des problèmes. Pour internet il est vrai que l'espace public et privé n'est pas toujours évident (si le nom d'un domaine appartient au patrimoine le fait de le citer ou de le référencer - au même titre qu'une référence dans un texte - est de l'ordre du domaine public): donc dans le doute abstient toi...
Ce que nous évoquons rentre en droite ligne dans la problématique de la CNIL concernant la sécurité et la protection des données personnelles.

signaler à un administrateur
Commentaire de coucou747 le 09/04/2008 13:33:23

ca sert pas a grand chose d'en discuter, la source n'est pas illegale, c'est son utilisation dans un cadre particulier qui peut l'etre...

Sinon, la source se limite aux pages accessiles en GET directement, impossible de s'authentifier puis d'acceder a une image.

une solution pour proposer cette fonctionalite : utiliser curl, coder une interface "web driver", puis un "curl-driver" et considerer le chemin pour acceder a une image comme une route, faut la modeliser, puis faire en sorte que le web-driver puisse l'emprunter ;)

si tu veux pousser a l'analyse de ces pages, il faut alors faire une class web-ressource et utiliser un pattern genre "visitable/visiteur", une ressource web contient des headers, et un content, qui peut-etre soit xml, soit "gd-openable"

voila, t'as un schemat d'abstraction pour curl qui semble assez complet :)

signaler à un administrateur
Commentaire de twisteurwin le 14/04/2008 13:06:23 8/10

yop bonne source :)
Excellent le débat, on achète bien des couteaux de cuisine et c'est pas pour autant qu'on découpe tout le monde avec :p

bon courage pour la suite,

signaler à un administrateur
Commentaire de amezghal le 29/04/2008 18:37:06

Salut,
$img = file_get_contents($url);
file_put_contents('toto.ext', $img);
ça doit aussi fonctionné

signaler à un administrateur
Commentaire de malalam le 29/04/2008 19:22:22 administrateur CS

Oui, certes, on ne devient pas assassin en achetant des couteaux de cuisine. Ce code peut être pratique quand on sait ce que l'on fait avec, et qu'on s'en sert à but personnel.
néanmoins, s'il y a une mention légale indiquant qu'il est interdit de copier les images d'un site...c'est que c'est interdit. Parce que contrairement à ce que j'ai lu, c'est bel et bien soumis à la loi de la propriété intellectuelle.

signaler à un administrateur
Commentaire de kiki67100 le 01/05/2008 18:00:52

Mon je croyais autre chose quand j'ai vue le titre je pensais a un code qui enregistrer l'image du site une fois intérprété , sinon quand je veut upload un fichier d'un autre site j'utilise copy() ou file_get_contents

signaler à un administrateur
Commentaire de kiki67100 le 01/05/2008 18:01:56

Oublie on sinon je recrée la requette http pour changer des information comme le user-agent ou mettre un cookie par exemple

Ajouter un commentaire

Discussions en rapport avec ce code source dans le forum

Prob Upload d'image... [ par zzzzzz ] yepj'ai un formulaire qui envoie une image cela marche parfaitement. Mais dans la partie vérification (les conditions marchent parfaitement) l'image n Socket:réponses? [ par magicyoda ] Voila je cherche à charge une page web grâce aux sockets.Lorsque ma demande est simple:"GET / HTTP/1.0\n\n"tout se passe bien,mais lorsque ma demande Image aléatoire ! [ par rezan16000 ] Bonjour, voila j'aurais aim&#233; avoir une image qui appara&#238;t al&#233;atoirement. Cependant j'aimerais que cette image soit tir&#233; d'un des m Combine Image ? [ par TIFISTEF ] Chers tous,voila le cas d'exemple :J'ai 2 website http://www.1.com et http://www.2.comLorsque j'affiche une page depuis www.1.com, et que dans cette p .htaccess [ par Filipe35 ] Bonjour &#224; tous, voila je viens de fini mon site: http://signzdyn.free.fr (une g&#233;n&#233;rateur de signatures dynamiques (comme danasoft)) J Recupere l'adresse d'une image [ par cyberastuces ] Bonjour a tous,je chercher un systeme permetant de cuperer l'adresse d'une image directement depuis sa balise, exemple :&lt;<span class="s socket et HTTP [ par McFlyScript ] Bonjour,Je ne suis pas s&#251;r que le forum choisi soit le plus adapt&#233; enfin bon ;Je programme sur mIRC (aucune utilit&#233; de poster sur un fo prb d'adresse d'une image sur le web (redirection [ par jmcorp ] bonjourje suis bloqu&#233; sur le probleme final du site, l'affichage d'une image. je sais pourquoi &#231;a marche pas mais j'arrive pas a repar&#233; upload fichier socket [ par yvesyves ] Bonjour,Je m'explique en tant que passagé car je programme pas en php mais je le comprend :J'ai 2 formulaires html avec un bouton submit et un champ d MySQL et images [ par Marneus Calgar ] SalutJ'aimerais savoir s'il est possible de stocker des images dans une table MySQL et d'y accéder depuis une page PHP. En fait, je voudrais faire un


Nos sponsors

Sondage...

CalendriCode

Octobre 2008
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Téléchargements



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel BAÏSE, Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,296 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.