Cargue fotos o archivos en Google Photos mediante la API de Google Photos, REST y C#.NET

 C Programming >> Programación C >  >> Tags >> API
Cargue fotos o archivos en Google Photos mediante la API de Google Photos, REST y C#.NET
¡Buenos dias!

Escribí una aplicación de consola antes de Leer archivos de Google Fotos usando la API de Google Fotos, REST y C#.NET que lee elementos multimedia de Google Fotos usando la API de Google Fotos, C# y REST. Esa aplicación de consola fue la base de uno de mis proyectos usando la API del cliente del mundo real. Sin embargo, ese proyecto está limitado a solo leer archivos y no tiene las capacidades de carga. Ahora que estoy libre con los proyectos en el trabajo, es hora de volver a visitar la API de Google Photos y crear una aplicación de consola simple que cargue fotos/imágenes o archivos a Google Photos usando REST, la API de Google Photos y C#.
Entonces, para comenzar, asegúrese de haber leído la documentación para configurar la API aquí Comenzar con REST. Una vez que haya configurado correctamente la API, descargue el archivo JSON que contiene sus credenciales específicamente Client Secret y ID de cliente y agregue ese archivo a su proyecto de aplicación de consola. Asegúrese de configurar Copiar en el directorio de salida del archivo JSON para Copiar siempre en el Explorador de soluciones de Visual Studio. Agregue también estos paquetes Nuget Google.Apis , Google.Apis.Auth y Google.Apis.Core ya que se utilizarán para autenticar la aplicación de tu consola al acceder a la nube de Google Fotos.
El método principal de la aplicación de la consola obtiene los archivos que se cargarán desde un directorio existente, establece el alcance de la aplicación para crear elementos multimedia y cargar en bytes, que es appendonly y realiza la autorización y autenticación de su solicitud. Luego llamará al método de carga de archivos que pasará el directorio, el objeto UserCredential y los archivos recuperados.
static void Main(string[] args)
{
	string UserName = "[email protected]";
	string credPath = @"D:\Codes\GooglePhotosUpload\";
	string filesRepository = @"D:\FilesToUploadFolder";
	string[] files = Directory.GetFiles(filesRepository);
    UserCredential credential;
	string[] scopes = {
		"https://www.googleapis.com/auth/photoslibrary.appendonly"
	 };

	

	using (var stream = new FileStream("credentials.json", FileMode.Open, FileAccess.Read))
	{
		credential = GoogleWebAuthorizationBroker.AuthorizeAsync(
			GoogleClientSecrets.Load(stream).Secrets,
			scopes,
			UserName,
			CancellationToken.None,
			new FileDataStore(credPath, true)).Result;
	}

	try
	{          
		if (files.Length > 0)
		{
			UploadFileWebRequest(filesRepository, credential, files);
		}
	}
	catch (Exception ex)
	{
		Console.WriteLine("Error occured: " + ex.Message);
	}

	Console.WriteLine("Files Uploaded Successfully!!!");
	Console.ReadLine();
}
El método de carga de archivos recorre los archivos y crea un objeto de tarea para cada archivo individual que, a su vez, enviará una solicitud POST a la API junto con los encabezados de solicitud POST definidos en esta documentación Cargar medios. Si la publicación de un archivo es exitosa, devolverá un token de carga para ese archivo que se utilizará para crear ese elemento multimedia en la nube. Agregué el token de carga junto con el nombre del archivo a un diccionario que se usará para crear los elementos multimedia. Lo siguiente es crear la cadena JSON que contiene los elementos multimedia que se enviarán a la nube que sigue el formato definido en la documentación anterior. . Se crea un objeto de solicitud independiente que incluye la URL y los encabezados correctos que cargarán los elementos multimedia en la nube.
private static void UploadFileWebRequest(string filesRepository, UserCredential credential, string[] fileNames)
{
	string jsonData = string.Empty;
	List<Task> tasks = new List<Task>();
	Dictionary<string, string> fileUploads = new Dictionary<string, string>();

	//Get upload-token 
	foreach (var fileName in fileNames)
	{
		var task = new Task(() =>
		{
			byte[] byteArr = File.ReadAllBytes(Path.Combine(filesRepository, Path.GetFileName(fileName)));

			var request = WebRequest.Create("https://photoslibrary.googleapis.com/v1/uploads");
			request.Method = "POST";
			request.Headers.Add("Authorization:" + credential.Token.TokenType + " " + credential.Token.AccessToken);
			request.Headers.Add("X-Goog-Upload-Content-Type", "raw");
			request.Headers.Add("X-Goog-Upload-Content-Type", "image/jpeg");
			request.Headers.Add("X-Goog-Upload-File-Name", Path.GetFileName(fileName));
			request.ContentType = "application/octet-stream";
			request.ContentLength = byteArr.Length;
			request.Credentials = CredentialCache.DefaultCredentials;

			Stream dataStream = request.GetRequestStream();
			dataStream.Write(byteArr, 0, byteArr.Length);
			dataStream.Close();

			WebResponse response = request.GetResponse();
			using (dataStream = response.GetResponseStream())
			{
				StreamReader reader = new StreamReader(dataStream);
				string uploadToken = reader.ReadToEnd();
				fileUploads.Add(Path.GetFileName(fileName), uploadToken);
			}

			response.Close();
		});

		tasks.Add(task);
		task.Start();
	}

	Task.WaitAll(tasks.ToArray());

	//Prepare to create media items
	jsonData = "{";
	jsonData += "\"newMediaItems\": [";
	foreach (var fileUpload in fileUploads)
	{
		jsonData += "{";
		jsonData += "\"description\": \"" + Path.GetFileName(fileUpload.Key) + "\"" + ",";
		jsonData += "\"simpleMediaItem\": {";
		jsonData += "\"fileName\": \"" + Path.GetFileName(fileUpload.Key) + "\"" + ",";
		jsonData += "\"uploadToken\": \"" + fileUpload.Value + "\"";
		jsonData += "}";
		jsonData += "},";
	}
	jsonData += "]";
	jsonData += "}";
	jsonData = jsonData.Remove(jsonData.Length - 3, 1);

	var requestUpload = WebRequest.Create("https://photoslibrary.googleapis.com/v1/mediaItems:batchCreate");
	requestUpload.ContentType = "application/json";
	requestUpload.Method = "POST";
	requestUpload.Credentials = CredentialCache.DefaultCredentials;
	requestUpload.Headers.Add("Authorization:" + credential.Token.TokenType + " " + credential.Token.AccessToken);

	using (var streamWriter = new StreamWriter(requestUpload.GetRequestStream()))
	{
		streamWriter.Write(jsonData.ToString());
	}

	try
	{
		var httpResponse = (HttpWebResponse)requestUpload.GetResponse();
		using (var streamReader = new StreamReader(httpResponse.GetResponseStream()))
		{
			var result = streamReader.ReadToEnd();
		}
	}
	catch (WebException ex)
	{
		using (WebResponse responseError = ex.Response)
		{
			var httpResponse = (HttpWebResponse)responseError;

			using (Stream data = responseError.GetResponseStream())
			{
				StreamReader sr = new StreamReader(data);
				Console.WriteLine(sr.ReadToEnd());
			}
		}
	}
}
Una vez que todo esté configurado correctamente y los códigos no tengan errores durante el modo de depuración, se abrirá un navegador Internet Explorer o Microsoft Edge que le pedirá que inicie sesión en Google Photos usando su cuenta y autorice su aplicación para poder cargar los elementos multimedia. Luego descargará un código de verificación a su aplicación. Para verificar si la carga de elementos multimedia o si los archivos se cargaron correctamente, vaya a Google Photos y inicia sesión con tu cuenta de gmail. Debería poder ver sus archivos guardados en la nube de fotos. Aquí está el código fuente completo de la aplicación de consola.
using Google.Apis.Auth.OAuth2;
using Google.Apis.Util.Store;
using System;
using System.Collections.Generic;
using System.IO;
using System.Net;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Threading;
using System.Threading.Tasks;

namespace GooglePhotosUpload
{
    class Program
    {
        static void Main(string[] args)
        {
            string UserName = "[email protected]";
            string credPath = @"D:\Codes\GooglePhotosUpload\";
            string filesRepository = @"D:\FilesToUploadFolder";
            string[] files = Directory.GetFiles(filesRepository);

            UserCredential credential;
            string[] scopes = {
                "https://www.googleapis.com/auth/photoslibrary.appendonly"
             };

            
            using (var stream = new FileStream("credentials.json", FileMode.Open, FileAccess.Read))
            {
                credential = GoogleWebAuthorizationBroker.AuthorizeAsync(
                    GoogleClientSecrets.Load(stream).Secrets,
                    scopes,
                    UserName,
                    CancellationToken.None,
                    new FileDataStore(credPath, true)).Result;
            }

            try
            {          
                if (files.Length > 0)
                {
                    UploadFileWebRequest(filesRepository, credential, files);
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine("Error occured: " + ex.Message);
            }

            Console.WriteLine("Files Uploaded Successfully!!!");
            Console.ReadLine();
        }

        private static void UploadFileWebRequest(string filesRepository, UserCredential credential, string[] fileNames)
        {
            string jsonData = string.Empty;
            List<Task> tasks = new List<Task>();
            Dictionary<string, string> fileUploads = new Dictionary<string, string>();

            //Get upload-token 
            foreach (var fileName in fileNames)
            {
                var task = new Task(() =>
                {
                    byte[] byteArr = File.ReadAllBytes(Path.Combine(filesRepository, Path.GetFileName(fileName)));

                    var request = WebRequest.Create("https://photoslibrary.googleapis.com/v1/uploads");
                    request.Method = "POST";
                    request.Headers.Add("Authorization:" + credential.Token.TokenType + " " + credential.Token.AccessToken);
                    request.Headers.Add("X-Goog-Upload-Content-Type", "raw");
                    request.Headers.Add("X-Goog-Upload-Content-Type", "image/jpeg");
                    request.Headers.Add("X-Goog-Upload-File-Name", Path.GetFileName(fileName));
                    request.ContentType = "application/octet-stream";
                    request.ContentLength = byteArr.Length;
                    request.Credentials = CredentialCache.DefaultCredentials;

                    Stream dataStream = request.GetRequestStream();
                    dataStream.Write(byteArr, 0, byteArr.Length);
                    dataStream.Close();

                    WebResponse response = request.GetResponse();
                    using (dataStream = response.GetResponseStream())
                    {
                        StreamReader reader = new StreamReader(dataStream);
                        string uploadToken = reader.ReadToEnd();
                        fileUploads.Add(Path.GetFileName(fileName), uploadToken);
                    }

                    response.Close();
                });

                tasks.Add(task);
                task.Start();
            }

            Task.WaitAll(tasks.ToArray());

            //Prepare to create media items
            jsonData = "{";
            jsonData += "\"newMediaItems\": [";
            foreach (var fileUpload in fileUploads)
            {
                jsonData += "{";
                jsonData += "\"description\": \"" + Path.GetFileName(fileUpload.Key) + "\"" + ",";
                jsonData += "\"simpleMediaItem\": {";
                jsonData += "\"fileName\": \"" + Path.GetFileName(fileUpload.Key) + "\"" + ",";
                jsonData += "\"uploadToken\": \"" + fileUpload.Value + "\"";
                jsonData += "}";
                jsonData += "},";
            }
            jsonData += "]";
            jsonData += "}";
            jsonData = jsonData.Remove(jsonData.Length - 3, 1);

            var requestUpload = WebRequest.Create("https://photoslibrary.googleapis.com/v1/mediaItems:batchCreate");
            requestUpload.ContentType = "application/json";
            requestUpload.Method = "POST";
            requestUpload.Credentials = CredentialCache.DefaultCredentials;
            requestUpload.Headers.Add("Authorization:" + credential.Token.TokenType + " " + credential.Token.AccessToken);

            using (var streamWriter = new StreamWriter(requestUpload.GetRequestStream()))
            {
                streamWriter.Write(jsonData.ToString());
            }

            try
            {
                var httpResponse = (HttpWebResponse)requestUpload.GetResponse();
                using (var streamReader = new StreamReader(httpResponse.GetResponseStream()))
                {
                    var result = streamReader.ReadToEnd();
                }
            }
            catch (WebException ex)
            {
                using (WebResponse responseError = ex.Response)
                {
                    var httpResponse = (HttpWebResponse)responseError;

                    using (Stream data = responseError.GetResponseStream())
                    {
                        StreamReader sr = new StreamReader(data);
                        Console.WriteLine(sr.ReadToEnd());
                    }
                }
            }
        }
    }
}