Que vous ayez mis en place une Webcam publique, une station de surveillance de vols de condors au-dessus de votre village, ou tout simplement un système de surveillance, vous avez peut-être déjà eu envie de pouvoir stocker quelque part les photos prises par votre caméra IP, par simple déclenchement ?
Voici comment faire, en profitant du très pratique service Dropbox, ce service qui vous permet d’échanger des fichiers de n’importe quel PC ou appareil mobile, directement via l’appli dédiée ou par le web !
Pour mettre ceci en place, il vous faudra :
- Une caméra IP (et ses identifiants)
- Un compte dropbox (gratuit ou pas)
- Un serveur php (vous pouvez l’installer sur une RaspberryPi, ou utiliser un hébergement)
- Éventuellement une box domotique pour lancer la prise de photo à distance
Je vous conseille de lire l’article en entier avant de choisir votre méthode, car sur la fin nous indiquons la méthode la plus simple, et c’est peut-être celle qui vous conviendra le mieux !
Le numéro d’API Dropbox
Identifiez-vous à votre compte Dropbox et créez une Application en allant sur la page https://www.dropbox.com/developers/apps
Acceptez les conditions d’utilisation et cliquez sur Create App :
Ensuite, configurez l’application comme suit :
- What type of app do you want to create? : Dropbox API app
- What type of data does your app need to store on Dropbox? : Files and Datastores
- Can your app be limited to its own, private folder? : No
- What type of files does your app need access to? : All File Types
- Provide an app name, and you’re on your way. : Camera_Save
Validez, et gardez la page de l’application sous la main.
[divider]
Le script
Récupérez le script « Camera Dropbox » sur le Github de Planète Domotique (script réalisé par les bons soins de Mickael, et avec un script d’identification Dropbox par Fabian Schlieper) :
[button color= »green » size= »small » link= »https://github.com/PlaneteDomo/eeDomus-Scripts/tree/master/Camera_Dropbox » target= »blank » ]Script Camera IP/Dropbox sur le Github de Planète Domotique[/button]
Faire une copie du fichier config_sample.php que vous appellez config.php.
Ouvrez-le dans un éditeur de texte, et indiquez les paramètres demandés.
Pour les identifiants d’API DropBox :
define("DROPBOX_APP_KEY", "xxxxxxxxxx"); define("DROPBOX_APP_SECRET", "xxxxxxxxxxx");
Référez-vous à l’onglet « Settings » de votre application, où ils sont présents :
Pour chaque caméra, vous devez spécifier nom d’utilisateur, mot de passe, adresse IP et port.
Sur la ligne suivante, vous pouvez spécifier le répertoire dans lequel les images seront placées. L’adresse est basée sur le répertoire Public, ce qui signifie qu’avec la valeur par défaut « Camera/ », l’image est placée dans le répertoire /Public/Camera/ de la Dropbox. Il faut au préalable créer le répertoire ou les répertoires en question pour que l’envoi fonctionne.
define("DROPBOX_UPLOAD_DIR", "Camera/");
[box type= »info » ]
Il est possible d’envoyer l’image de la caméra dans un autre répertoire que le répertoire public, cela dit, on ne pourra pas faire de lien vers l’image dans l’e-mail envoyé par le script. Pour ce faire, allez dans [highlight]mail_camera.php[/highlight] et modifiez la ligne suivante :
$dropbox->UploadFile($tmpfilename, "Public/".DROPBOX_UPLOAD_DIR.$img_name[$i]);
Encore une fois, il est nécessaire d’indiquer un chemin de répertoires qui existe sur la Dropbox[/box]
Le fichier de base vous propose une section pour Edimax et une section pour Foscam. Notez que selon la caméra, la ligne $full_url est à adapter :
[toggle title= »Code selon le type de caméra » state= »close » ]
Caméras de type Foscam / Apexis / Heden :
$full_url[x] = "https://".$cam_ip.":".$cam_port."/snapshot.cgi?user=".$cam_user."&pwd=".$cam_pwd;
Caméras de type Edimax :
$full_url[x] = "https://".$cam_user.":".$cam_pwd."@".$cam_ip.":".$cam_port."/jpg/image.jpg";
Caméras de type Trendnet :
$full_url[x] = "https://".$cam_user.":".$cam_pwd."@".$cam_ip.":".$cam_port."/cgi/jpg/image.cgi";
[/toggle]
Envoyez le tout (fichiers du script et config.php paramétré correctement) sur votre serveur php. Créez également, au même niveau que les scripts, un répértoire « tokens » qui servira à stocker les jetons d’authentification à Dropbox, et un repertoire « tmp » qui servira à stocker les photos avant leur envoi sur Dropbox. Mettez les droits d’accès en écriture au groupe (chmod 757 ou 777) pour ces deux dossiers.
Chargez une première fois la page https://[adresse de votre serveur web]/mail_camera.php : une authentification du script vous sera demandé (il faut être identifié au compte Dropbox créateur de l’application pour l’accepter).
Et voilà, c’est opérationnel !
Le petit oiseau va sortir !
Il ne vous reste plus qu’à charger la page https://[adresse de votre serveur web]/mail_camera.php, et la photo prise par la caméra apparaîtra directement dans la Dropbox (plusieurs photos si vous avez indiqué plusieurs caméras), tout en vous envoyant un e-mail pour vous donner le lien des photos envoyées.
Une autre petite astuce en complément de cette méthode : vous pouvez très bien utiliser un déclencheur http dans votre box domotique (ou un scénario qui lance la requête http) pour y faire un composant d’interface sur lequel il suffit de cliquer pour prendre une photo.
Enregistrer directement l’image sur le même serveur que le script
Si le script est hébergé lui-même sur l’espace web où vous voulez stocker vos photos, vous pouvez directement y enregistrer les photos en ne gardant que la partie du script où le fichier récupère l’image et créée un fichier temporaire (avant l’envoi sur la Dropbox).
Ça se situe à cet endroit dans mail_camera.php :
$content = file_get_contents($full_url[$i]); $tmpfilename = dirname(__FILE__) ."/tmp/".$img_name[$i]; file_put_contents($tmpfilename, $content);
Il suffit de remplacer /tmp/ par un répertoire de votre cru. La photo est directement sous la forme image avec un numéro de caméra, une date l’heure. Bien sûr, le repertoire en question doit avoir les droits d’écriture (chmod 777 comme vu ci-dessus).
À la place de la fonction de classe [highlight]$dropbox->UploadFile()[/highlight] appelée juste en-dessous (qu’on peut enlever si on n’envoie pas les fichiers sur Dropbox), vous pouvez par exemple faire un affichage de l’image qui vient d’être envoyée (voir code ci-dessous), ou un message de statut qui pourra être utilisé comme capteur HTTP dans certaines box.
if (file_exists($tmpfilename)) { echo '<h1> Image enregistrée sur la caméra '.$i.' :</h1><br/><img src="tmp/'.$img_name[$i].'"/><br/>'; }
Gardez le reste du code, il vous préviendra si l’image n’a pas été envoyé et enverra un e-mail avec les liens vers les photos. Il faudra cependant l’adapter un peu pour qu’il fasse un lien non pas vers les images de la dropbox, mais les images ftp.
Et pour l’envoi par FTP ?
En plus d’envoyer sur une DropBox, vous pouvez directement envoyer le fichier sur un serveur ftp. Pour ce faire, copiez le contenu ci-dessous dans un fichier ftp_upload.php à mettre à côté des autres fichiers du script.
Pensez à changer les lignes $ftp_server, $ftp_user_name et $ftp_user_pass respectivement par l’adresse ftp de votre serveur, votre nom d’utilisateur et votre mot de passe.
<?php function envoi_ftp($src_file, $dst_file) { $ftp_server='adresse.fr'; $ftp_user_name='login'; $ftp_user_pass='mot de passe'; // Mise en place d'une connexion basique $conn_id = ftp_connect($ftp_server); // Identification avec un nom d'utilisateur et un mot de passe $login_result = ftp_login($conn_id, $ftp_user_name, $ftp_user_pass); // Verification de la connexion if ((!$conn_id) || (!$login_result)) { echo "La connexion FTP a échoué !"; echo "Tentative de connexion au serveur $ftp_server pour l'utilisateur $ftp_user_name"; exit; } else { echo "Connexion au serveur $ftp_server, pour l'utilisateur $ftp_user_name"; } $destination_file = '/'.$dst_file; // Chargement d'un fichier $upload = ftp_put($conn_id, $destination_file, $src_file, FTP_BINARY); // Verification du status du chargement if (!$upload) { echo "Le chargement FTP a echoue"; } else { echo "Chargement de $source_file vers $ftp_server en tant que $destination_file"; } // Fermeture du flux FTP ftp_close($conn_id); } ?>
Dans ce fichier, à la ligne [highlight]$destination_file = ‘/’.$dst_file;[/highlight], vous pouvez indiquer tout un chemin de répertoires de la forme /Repertoire1/Repertoire2/Repertoire3/. Par exemple :
$destination_file = '/Cameras/Photos/'.$dst_file;
Il va sans dire qu’il vous faudra aussi faire un chmod 777 sur le repertoire cible pour que notre script puisse y accéder en écriture !
Ouvrez le fichier mail_camera.php et ajoutez un appel à ce fichier avec la fonction require_once() :
<?php require_once("DropboxClient.php"); require_once("config.php"); require_once("upload_ftp.php");
Ensuite, recherchez la ligne [highlight] if (file_exists($tmpfilename, « ))[/highlight] et ajoutez l’appel de la fonction envoi_ftp(); comme suit :
if (file_exists($tmpfilename, ")) { $dropbox->UploadFile($tmpfilename, "Public/".DROPBOX_UPLOAD_DIR.$img_name[$i]); envoi_ftp($tmpfilename, $img_name[$i]); }
Désormais, le script enverra pour chaque caméra l’image à la fois sur la Dropbox et par FTP.
Sur le même principe, vous pouvez faire en sorte que l’image prise par la caméra soit uniquement envoyée par FTP en enlevant tout ce qui concerne Dropbox dans les scripts. Il est cependant important de conserver la partie sur la configuration des caméras et la partie du script qui récupère l’image auprès des caméras.
[divider]
Sur ces bases, à vous d’accommoder votre enregistrement d’image à distance sur Caméra IP à votre bon plaisir : on peut par exemple imaginer une page complète montrant les dernières photos prises par la/les caméra(s), et avec un bouton de déclenchement qui appelle le script de capture d’image.
Nous espérons que ce guide vous aura été utile, et si quelque chose n’est pas clair, n’hésitez pas : direction les commentaires !
Genialissime, bravo Pierre…
En rubrique « SCRIPT » il est indiqué de Faire une copie du fichier config_sample.php que vous appellez config.php. »
Par quel moyen cela peut se faire. Merci
Il vous suffit de copier-coller le fichier Config_sample.php, vous obtiendrez un fichier appellé
[Copie de config_sample.php], ou [config_sample – Copie.php] (ou autre nom selon le système).
Sur ce fichier-là, vous faites clic-droit > renommer et vous remplacez tout le nom du fichier par « config » (ou config.php si l’extension s’affiche). Vous pouvez désormais éditer le fichier et personnaliser son contenu 🙂
Bonjour,
je me lance tout récemment dans la mise en place d’un système de surveillance par caméra IP.
La caméra est une AXIS M1031, comment savoir de quel type elle est (heden, Foscam…)
Merci de votre réponse.
Bonjour Montus,
En fait Axis c’est encore une autre marque de Caméra qui n’est pas citée dans ce tutorial.
J’ai regardé comment étaient faites les URL de flux pour l’AXIS M1031 et ça devrait fonctionner en utilisant la ligne indiquée pour les caméras de type Edimax (adresse se terminant par « /jpg/image.jpg »).
J’espère que ça fonctionnera ! 😉
Bonjour Pierre,
D’accord, je vais essayer ça alors 🙂
Merci
bonjour
je voulais savoir si le script prévoit un écrasement si plus de place sur dropbox…ou comment ça se passe si dépasser mets 3Go.? meme si j’ai une synchronisation sur syno.(10 cams et beaucoupe de vent donc de detection de mouvement, donc beaucoup de pics….
merci
Bonjour Philippe,
Non, ce script ne prévoit pas d’écrasement, une fois l’espace complétement occupé, le script aura un refus d’écriture. Il faut prévoir ce délestage d’une autre manière.
bonjour,
Existe il la meme solution pour google drive ?
Bonjour surik,
Rien à ce jour sur Google Drive mais c’est une idée à creuser, à voir si Google Drive a la capacité de mettre en place le même type de solution ! Si c’est le cas nous pourrons faire un article à ce sujet.
Bonjour,
j’essaye votre script qui m’intéresse beaucoup mais je n’arrive pas à le faire fonctionner, à lal première connexion à la page http://monsite/mail_camera.php il me retourne des erreur au lieu de m’identifier…
Comme je ne suis pas programmeur ni PHP freak, j’ai probablement loupé quelque chose…
les erreurs que je reçois:
Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /htdocs/DropboxClient.php on line 256
Warning: file_get_content : failed to open stream: no suitable wrapper could be found in /htdocs/DropboxClient.php on line 256
Fatal error: Uncaught exception ‘DropboxException’ with message ‘Could not get request token!’ in /htdocs/DropboxClient.php:50 Stack trace: #0 /htdocs/DropboxClient.php(81): DropboxClient->GetRequestToken() #1 /htdocs/mail_camera.php(46): DropboxClient->BuildAuthorizeUrl(‘http://ecollart…’) #2 {main} thrown in /htdocs/DropboxClient.php on line 50
Merci de toute aide éventuelle…
Eric Collart
Bonjour
j’ai mis en place votre script et j’ai un petit soucis.
Je pensais qu’on pouvait le lancer automatiquement (tâche cron), mais en fait, il me demande à chaque fois de cliquer sur le bouton d’autorisation dropbox au début (en lançant mail_camera.php).
Est-ce normal ?
Lionel
@Lionel : probablement une modification du fonctionnement de dropbox. Nous ne pouvons malheureusement pas tout le temps assurer le suivi des scripts que nous proposons au fur et à mesure des modifications des divers services. Si toutefois vous trouver un moyen de contourner cela, n’hésitez pas à nous en faire part. Il y a peut être une option « toujours autoriser » proposée quelque part dans Dropbox ?
Bonjour,
Je cherchais une solution pour envoyer une image par interval régulier sur mon site web depuis un camera ip exterieure. Les differents scripts présentés vont certaiement m’aider à trouver la solution.
Par contre comment peut-on identifier l’URL pour capturer l’image depuis la camera IP ?
J’ai testé une camera SEDEA et je ne trouve rien dans la doc.
Auriez vous une idée.?
Merci pour le patage !
Olvier
Bonjour Olivie,
Première chose à noter : malheureusement, ce n’est pas systématique qu’il soit possible de récupérer le flux URL depuis une caméra IP. Certaines ont un flux encodé d’une certaine manière qui fait qu’il n’est récupérable que par les applis de la marque ou le serveur interne à la caméra.
Cependant, si ce flux existe, il y a plusieurs méthodes pour l’obtenir :
– Accéder au serveur interne de la caméra si elle en a un, et essayer de copier l’adresse l’image ou de chercher dans le code source s’il y a une adresse
– Rechercher la marque et le modèle de la caméra sur internet avec des mots clés comme « flux image », « flux vidéo », « flux mpeg »… et voir si le flux est indiqué.
Si cela ne donne rien, il y a une autre méthode, à réserver plutôt aux utilisateurs avertis : utiliser le logiciel Wireshark, qui est un analyseur de paquets réseaux, et qui, lors de la consultation du flux vidéo, peut trouver une adresse pour le flux en question. Nous ne rentrerons pas dans les détails de son utilisation, mais c’est la méthode de la dernière chance quand un flux ne peut pas être trouvé.
Dans le cas où aucune de ces méthodes ne fonctionne, il est fort probable que le flux n’est malheureusement pas récupérable.
Bonjour,
Merci pour le retour rapide 🙂
Je vais tester tout ça..
Bonjour,
A toutes fins utiles, l’URL pour une camera SEDEA est sous la forme :
http://@ip//goform//CaptureV2?s_username=default&s_psw=&s_ch=1
Bonne journée
Olivier
Bonjour
Est on obligé de passer par un serveur PHP…un script …?
Bonjour Cristo
Malheureusement, suite à des modifications du fonctionnement de DropBox, cette technique n’est plus fonctionnelle.
Impossible de trouver Planète Domotique sur Github.
Les informations de cette pages sont-elles toujours d’actualité?
Bonjour,
En effet il semblerait que Le GitHub ne soit plus disponible,
De plus, l’article ayant 10 ans, les méthodes ont grandement évoluée, il sera donc nécessaire de procéder autrement,