Laden Sie Fotos oder Dateien mit der Google Fotos-API, REST und C#.NET in Google Fotos hoch

 C Programming >> C-Programmierung >  >> Tags >> API
Laden Sie Fotos oder Dateien mit der Google Fotos-API, REST und C#.NET in Google Fotos hoch
Guten Morgen!

Ich habe vor dem Lesen von Dateien aus Google Fotos mit der Google Fotos-API, REST und C#.NET eine Konsolenanwendung geschrieben, die Medienelemente aus Google Fotos mit der Google Fotos-API, C# und REST liest. Diese Konsolenanwendung war die Grundlage für eines meiner Projekte, das eine reale Client-API verwendet. Dieses Projekt ist jedoch darauf beschränkt, nur Dateien zu lesen, und verfügt nicht über die Upload-Funktionen. Jetzt, da ich mit den Projekten bei der Arbeit frei bin, ist es an der Zeit, die Google Fotos-API erneut zu besuchen und eine einfache Konsolenanwendung zu erstellen, die Fotos/Bilder oder Dateien mithilfe von REST, der Google Fotos-API und C# in Google Fotos hochlädt.
Stellen Sie also zunächst sicher, dass Sie die Dokumentation zum Einrichten der API hier gelesen haben. Erste Schritte mit REST. Nachdem Sie die API erfolgreich eingerichtet haben, laden Sie die JSON-Datei herunter, die Ihre Anmeldeinformationen enthält, insbesondere Client Secret und Client-ID und fügen Sie diese Datei Ihrem Konsolen-App-Projekt hinzu. Stellen Sie sicher, dass In Ausgabeverzeichnis kopieren eingestellt ist der JSON-Datei auf Immer kopieren im Projektmappen-Explorer von Visual Studio. Fügen Sie auch diese Nuget-Pakete Google.Apis hinzu , Google.Apis.Auth und Google.Apis.Core da sie zur Authentifizierung Ihrer Konsolenanwendung beim Zugriff auf die Google Fotos-Cloud verwendet werden.
Die Hauptmethode der Konsolen-App ruft die hochzuladenden Dateien aus einem vorhandenen Verzeichnis ab, legt den Umfang der Anwendung fest, um Medienelemente zu erstellen und in Bytes hochzuladen, was appendonly ist und führt die Autorisierung und Authentifizierung Ihrer Anwendung durch. Anschließend wird die Methode zum Hochladen von Dateien aufgerufen, die das Verzeichnis, das UserCredential-Objekt und die abgerufenen Dateien weitergibt.
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();
}
Die Methode zum Hochladen von Dateien durchläuft die Dateien und erstellt ein Aufgabenobjekt für jede einzelne Datei, die wiederum eine POST-Anfrage an die API sendet, zusammen mit den POST-Anfrage-Headern, die in dieser Dokumentation zum Hochladen von Medien definiert sind. Wenn das Hochladen einer Datei erfolgreich ist, wird ein Upload-Token zurückgegeben für diese Datei, die verwendet wird, um dieses Medienelement in der Cloud zu erstellen. Ich habe das Upload-Token zusammen mit dem Dateinamen zu einem Wörterbuch hinzugefügt, das zum Erstellen der Medienelemente verwendet wird. Als Nächstes muss die JSON-Zeichenfolge erstellt werden, die die in die Cloud zu übertragenden Medienelemente enthält, die dem in der obigen Dokumentation definierten Format folgt . Es wird ein separates Anforderungsobjekt erstellt, das die URL und die korrekten Header enthält, die die Medienelemente in die Cloud hochladen.
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());
			}
		}
	}
}
Sobald alles korrekt eingerichtet ist und die Codes im Debug-Modus keine Fehler aufweisen, wird ein Internet Explorer- oder Microsoft Edge-Browser geöffnet, in dem Sie aufgefordert werden, sich mit Ihrem Konto bei Google Fotos anzumelden und Ihre App zu autorisieren, um die Medienelemente hochladen zu können. Anschließend wird ein Bestätigungscode in Ihre App heruntergeladen. Um zu überprüfen, ob Medienelemente hochgeladen wurden oder ob die Dateien erfolgreich hochgeladen wurden, gehen Sie zu Google Fotos und Melden Sie sich mit Ihrem Gmail-Konto an. Sie sollten Ihre in der Foto-Cloud gespeicherten Dateien sehen können. Hier ist der vollständige Quellcode der Konsolen-App.
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());
                    }
                }
            }
        }
    }
}