TUTOS.EU

Sauvegarder les photos et vidéos de sa caméra sur Google Drive

Sauvegarder les photos et vidéos de sa caméra de surveillance IP dans le cloud de Google

Le principe est simple :

  • Il faut que la caméra ip soit connectée au réseau et qu'elle puisse envoyer ses images ou vidéos en pièces jointes dans un email.
  • Les emails seront envoyés sur une adresse gmail.
  • De là, un script va s'exécuter régulièrement et il va sauvegarder les photos et vidéos envoyées sur une adresse Gmail dans un répertoire de Google Drive.

 

Le script a été mis à jour le 07/03/2020. La nouveauté étant qu'on place maintenant les fichiers dans un répertoire qui porte la date du jour et l'heure. Cela permet de répartir les nombreuses photos dans différents dossiers. C'est plus pratique.

 

Rendez-vous sur
https://script.google.com/home

et créer un nouveau script

Effacez la fonction vide d'exemple

Coller ensuite ce code

// GLOBALS
//Array of file extension which you would like to extract to Drive
var folderName = 'GmailToDrive'; //Nom du répertoire google drive dans lequel seront placés les documents
var labelName = 'GmailToDrive'; //Nom du label qui sera appliqué aux mails après opération
var now = Utilities.formatDate(new Date(), "GMT+1", "yyyy-MM-dd HH")

 //Note : Les journaux sont visibles sous Afficher>Journaux ou avec les touches CTRL+Entrée
Logger.log('Début du script à ' + Utilities.formatDate(new Date(), "GMT+1", "yyyy/MM/dd HH:mm:ss"));

function GmailToDrive(){

  //Création d'une requête de recherche de mails
  query = 'in:inbox subject:UnSujet'
  //query = 'label:gmailtodrive subject:UnSujet newer_than:1D'
  Logger.log('Recherche des messages avec le filtre ' + query); 
  var objGmailThreadArray = GmailApp.search(query); //Recherche des messages basée sur le filtre. Cela retourne un tableau
  var label = getGmailLabel_(labelName); //Pointe ou crée un label nommé labelName
  
  if(objGmailThreadArray.length > 0){ //Si la recherche de mails à donné un résultat, on point ou on crée le répertoire cible
	Logger.log('Il y a  ' + objGmailThreadArray.length + ' résultats'); 
	var objGdriveRootFolder = DriveApp.getRootFolder(); //On pointe sur le répertoire racine de Gdrive
	var folderRacineImages = CreationRepertoire_(objGdriveRootFolder, folderName); //On pointe sur la racine du répertoire qui contient les images
	var objRepertoireCible = CreationRepertoire_(folderRacineImages, now.toString()); //On pointe sur la racine du répertoire qui contient les images
  }
  var objGdriveRootFolder = DriveApp.getRootFolder(); //On pointe sur le répertoire racine de Gdrive
  for(var UnMail in objGmailThreadArray){
    var mesgs = objGmailThreadArray[UnMail].getMessages();
	for(var j in mesgs){
      //get attachments
      var attachments = mesgs[j].getAttachments();
      for(var k in attachments){
        var attachment = attachments[k];
        var isDefinedType = checkIfDefinedType_(attachment);
    	if(!isDefinedType) continue;
    	var attachmentBlob = attachment.copyBlob();
        var file = DriveApp.createFile(attachmentBlob); //On récupère le fichier contenu dans le mail et on le stocke à la racine de Gdrive. La fonction ne donne pas le choix de la cible
        objRepertoireCible.addFile(file); //On copie ce même fichier sur le répertoire cible voulu
        objGdriveRootFolder.removeFile(file); //On efface le fichier qui a été créé à la racine
      }
      mesgs[j].moveToTrash(); //Move message to trash
	}
	objGmailThreadArray[UnMail].addLabel(label);
  }
}

//Cette fonctione cherche un répertoire donné dans Gdrive. Si elle ne le trouve pas, elle le crée
function CreationRepertoire_(Parent, folderName){
	//var objGdriveRootFolder = DriveApp.getRootFolder(); //On pointe sur le répertoire racine de Gdrive
  var objMyFolders = Parent.getFoldersByName(folderName); //Gets a collection of all folders that are children of the current folder and have the given name.
  if(objMyFolders.hasNext()){
    folder = objMyFolders.next();
  }
  else{
    folder = Parent.createFolder(folderName);
  }
  return folder;
}

//getDate n days back
// n must be integer
function getDateNDaysBack_(n){
  n = parseInt(n);
  var date = new Date();
  date.setDate(date.getDate() - n);
  return Utilities.formatDate(date, Session.getScriptTimeZone(), 'yyyy/MM/dd');
}

function getGmailLabel_(name){
  var label = GmailApp.getUserLabelByName(name);
  if(!label){
	label = GmailApp.createLabel(name);
  }
  return label;
}

//this function will check for filextension type.
// and return boolean
function checkIfDefinedType_(attachment){
  var fileName = attachment.getName();
  var temp = fileName.split('.');
  var fileExtension = temp[temp.length-1].toLowerCase();
  if(fileTypesToExtract.indexOf(fileExtension) !== -1) return true;
  else return false;
}
Logger.log('Fin du script à ' + Utilities.formatDate(new Date(), "GMT+1", "yyyy/MM/dd HH:mm:ss"));
Lien vers le fichier : cliquez ici Copier le code

Vous devez alors avoir quelque chose du genre

Rechercher et modifier cette ligne. Il faut remplacer UnSujet par le nom des mails que vous voulez traiter. Pour résumer vos caméras vont envoyer des mails avec un nom de sujet, il faudra le mettre ici.

query = 'in:inbox subject:UnSujet'
Lien vers le fichier : cliquez ici Copier le code

Donnez un nom au projet

Et sauvegardez le

Allez sur
https://drive.google.com/

et créez un nouveau dossier

Nommez le GmailToDrive

Retourner sur
https://script.google.com

et lancez le script

Il faudra donner des droits d'accès

Le script indique qu'il est en cours d'éxécution

Votre répertoire GmailtoGdrive doit se remplir avec les pièces attachées qui sont dans la boite mail Gmail

Maintenant, pour que le script s'exécute automatiquement à intervalles réguliers, cliquez sur l'horloge

Cliquez sur le lien bleu

Déclenchez par exemple le script toutes les 10 minutes

Si vous voulez modifier ou ajouter les actions faites sur vos messages, cette page vous liste toutes les fonctions existantes
https://developers.google.com/apps-script/reference/gmail/gmail-message

Si vous voulez modifier le script, cette page vous en donne :
https://support.google.com/mail/answer/7190?hl=en

Vous pouvez par exemple modifier le script pour lui dire de ne traiter que les mails qui ont pour sujet CameraIP
Vous pouvez également lui demander d'effacer le mail, une fois son contenu copier dans Google Drive

Notez également qu'au niveau de votre projet Google, vous pouvez afficher l'historique des exécutions

Cela peut vous permettre de contrôler quand vos script s'est exécuté et si il s'est bien exécuté

Encore une autre info :
Gmail impose un quota sur ses serveurs smtp. Vous ne pouvez envoyer que 500 emails par jour.
Si votre caméra passe son temps a envoyer des mails, vous y serez vite.
On trouve l'info ici :
https://support.google.com/mail/answer/22839?hl=fr

Donc si vous atteignez cette limite, en solution on peut installer une passerelle smtp sur un raspberry pi ou sur un serveur que le loue chez OVH, Dedibox ou autre.

Pages Web

Site WebDescription
Google Apps Script TutorialAuteur du code source à l'origine

Article(s) en relation(s)

2