Verwenden der OneDrive-API ohne Benutzerinteraktion, z. B. ein Batchprogramm (.NET C#-Version) (keine zusätzlichen Verwendungsbibliotheken)
Betriebsumgebung
- Visuelles Studio
-
- Visual Studio 2022
- .NETTO
-
- .NET 8
- Microsoft-Authentifizierungs-API
-
- 2.0 OAuth 2
- Microsoft OneDrive-API
-
- 1.0
- Arten von Microsoft-Konten
-
- Geschäfts-, Schul- oder Unikonto
Voraussetzungen
- Visuelles Studio
-
- Eine der Varianten
- .NETTO
-
- Eine der Varianten
- Microsoft-Authentifizierungs-API
-
- 2.0 OAuth 2
- Microsoft OneDrive-API
-
- 1.0
- Arten von Microsoft-Konten
-
- Geschäfts-, Schul- oder Unikonto
Über den Zweck dieser Veranstaltung
Jetzt verwenden Sie die OneDrive-APIs, um sich auf das programmgesteuerte Hoch- und Herunterladen von Dateien auf OneDrive vorzubereiten. In diesem Artikel gehen wir darauf ein, was Sie mit der OneDrive-API tun können, also gehen wir nicht darauf ein, was Sie mit der OneDrive-API tun können. Solange Sie jedoch eine Verbindung herstellen können, können Sie die API-Dokumentation lesen und sie danach anwenden.
So führen Sie das Programm aus
Der Zugriff auf OneDrive ist nicht von der Form des Programms abhängig, z. B. von einer Webanwendung, einer Desktopanwendung oder einer Konsolenanwendung, und kann von einer Vielzahl von Programmen ausgeführt werden. In diesem Fall erstellen wir eine Konsolenanwendung und führen sie automatisch ohne Benutzeroperation aus.
Welche verschiedenen Arten von Microsoft-Konten gibt es?
Wenn Sie jemals ein Microsoft-Konto erstellt haben, haben Sie es wahrscheinlich schon gesehen. Es gibt zwei Haupttypen von Microsoft-Konten: persönliche Microsoft-Konten und Geschäfts-, Schul- oder Unikonten. OneDrive ist an ein Microsoft-Konto gebunden, aber der Typ von OneDrive variiert leicht je nach dem oben aufgeführten Kontotyp.
Vorerst kann die OneDrive-API mit beiden oben genannten Arten von Konten verwendet werden. In diesem Programm in der Form "als Konsolenanwendung erstellt und ohne Benutzerbedienung ausgeführt", Bitte beachten Sie, dass es nur mit einem Microsoft-Konto im Konto "Geschäfts-, Schul- oder Unikonto" verwendet werden kann. Dies ist auf Unterschiede bei den Authentifizierungsmethoden zurückzuführen.
Informationen zur Authentifizierungsmethode
Zuerst müssen Sie sich authentifizieren, um programmgesteuert auf OneDrive zugreifen zu können. Wie oben erwähnt, kann jedes Programm auf OneDrive zugreifen, aber die Authentifizierung für die Verbindung mit der API hängt davon ab, wie das Programm ausgeführt wird. Webanwendungen und Desktopanwendungen können durch Benutzerinteraktion authentifiziert werden. Da der Benutzer es nicht in einer Konsolenanwendung bedienen kann, die im Hintergrund ausgeführt wird, unterscheidet sich auch die Authentifizierungsmethode von den oben genannten.
Ich kenne den genauen Grund nicht, weil ich ihn nicht nachschlagen konnte, aber wenn er mir in den Sinn kommt, scheint es an der Sicherheit und der Kontoverwaltung zu liegen. Ich kann nur sagen, dass dies bereits eine Spezifikation ist, wenn Sie also programmgesteuert auf OneDrive zugreifen möchten, das mit einem "persönlichen Microsoft-Konto" verbunden ist, Ich denke, dass es keine andere Wahl gibt, als ein anderes Programm als ein Programm zu verwenden, das im Hintergrund ausgeführt wird, oder eine Konsolenanwendung mit einer Authentifizierungsmethode auszuführen, die Benutzervorgänge umfasst.
Wir werden die Bibliothek zu diesem Zeitpunkt nicht für den Zugriff auf die OneDrive-API verwenden
Der Zugriff auf die OneDrive-API ist über eine Bibliothek namens "Microsoft Graph" relativ einfach zu handhaben. In diesem Fall verwenden wir die Methode, direkt auf die URL der API zuzugreifen und sie auszuführen. Es ist zwar etwas umständlich, aber da es keine Bibliothek verwendet, hat es den Vorteil, dass non-.NET Programme auf die gleiche Weise auf die OneDrive-API zugreifen können. Es verhindert auch den Nachteil, dass sich der Code aufgrund unterschiedlicher Versionen der Bibliothek ändert.
Wie Sie Microsoft Graph nutzen können, zeigen wir Ihnen in einem weiteren Tipp.
Vorbedingung
- Sie verfügen über ein Microsoft-Konto für ein Geschäfts-, Schul- oder Unikonto
- Sie können das OneDrive verwenden, das mit dem oben aufgeführten Microsoft-Konto verknüpft ist (z. B. OneDrive Business)
- Visual Studio 2022 installiert
Richten Sie Ihre Anwendung für den Zugriff auf Ihr Microsoft-Konto oder OneDrive in Azure ein
Melden Sie sich unter der folgenden URL bei Azure an:
Geben Sie im Suchfeld oben "App-Registrierungen" ein und wählen Sie es aus.
Klicken Sie auf Neue Registrierung.
Der Inhalt des "Namens" ist beliebig. Bitte geben Sie einen aussagekräftigen Namen ein.
Wählen Sie einen anderen "Unterstützten Kontotyp" als "Nur persönliche Microsoft-Konten" aus. Dies liegt daran, dass diese Authentifizierung, wie oben erwähnt, nur mit Konten verwendet werden kann, die zu einer Organisation gehören. In diesem Fall haben wir "Konten in einem beliebigen Organisationsverzeichnis (jeder Microsoft Entra ID-Mandant – mehrinstanzenfähig) und persönliche Microsoft-Konten (Skype, Xbox usw.) ausgewählt".
Sie müssen den "Redirect URI" nicht eingeben, da er dieses Mal nicht verwendet wird.
Wenn Sie fertig sind, klicken Sie auf die Schaltfläche "Registrieren".
Sie werden zur Zusammenfassungsseite der von Ihnen erstellten App-Registrierung weitergeleitet, kopieren Sie also die Anwendungs-ID (Client) und die Verzeichnis-ID (Mandant). Sie werden diesen Wert später verwenden.
Wählen Sie "Zertifikate & Geheimnisse" aus der Kategorie "Verwaltung" im linken Menü und stellen Sie sicher, dass "Client Secrets" auf der mittleren Registerkarte ausgewählt ist. Klicken Sie auf Neuer geheimer Clientschlüssel.
Die Eingabe einer Beschreibung ist optional. Wenn Sie es weiterhin verwenden möchten, fügen Sie bitte eine Erklärung bei, in der der Verwendungszweck klar erläutert wird.
Das "Ablaufdatum" ist der Zeitraum, in dem dieser geheime Clientschlüssel gültig ist. Da es sich diesmal um Testzwecke handelt, sind es 90 Tage, aber bitte stellen Sie es entsprechend dem Verwendungszweck ein.
Wenn Sie einen geheimen Clientschlüssel erstellen, wird er der Liste hinzugefügt. In diesem verwenden wir den Wert in der Spalte "Wert", also kopieren Sie ihn. Beachten Sie, dass dieser Wert später nicht mehr kopiert werden kann.
Wählen Sie anschließend im linken Menü in der Kategorie "Administration" die Option "API-Berechtigungen" aus und klicken Sie in der Mitte auf "Berechtigungen hinzufügen".
Klicken Sie in der API-Berechtigungsanforderung auf Microsoft Graph.
Klicken Sie auf Anwendung zulassen. Diese Option ist für persönliche Microsoft-Konten nicht verfügbar.
Eine Liste der Berechtigungen wird unten angezeigt, verwenden Sie also das Suchfeld, um die folgenden Punkte zu überprüfen.
- Dateien.ReadWrite.Alle
Das ist ausreichend, wenn Sie nur OneDrive verwenden möchten, aber wenn Sie auf etwas anderes zugreifen möchten, fügen Sie Berechtigungen hinzu. Die für den Zugriff auf OneDrive erforderlichen Berechtigungen finden Sie auf der offiziellen Seite unten.
Nachdem Sie Ihre Auswahl getroffen haben, klicken Sie auf die Schaltfläche Berechtigungen hinzufügen.
Der hinzugefügte wird der Liste hinzugefügt, und der "Typ" ist "Anwendung". Da der "Status" jedoch "Nicht für XXXX gewährt" lautet, klicken Sie auf "Administrator-Zustimmung für XXXX erteilen". (XXXX ist der Name Ihrer Organisation)
Klicken Sie auf Ja.
Er wechselt in den gewährten Zustand.
Den von Anfang an vorhandenen "delegated User.Read" können Sie übrigens löschen, da wir ihn diesmal nicht verwenden werden. Wenn Sie "User.Read" als Anwendung hinzugefügt haben, verwenden Sie diese.
Überprüfen von Benutzer-IDs
Da Sie auf das OneDrive zugreifen, über das der Zielbenutzer verfügt, überprüfen Sie die Benutzer-ID im Voraus.
Microsoft Entra ID
und öffnen Sie es.
Wählen Sie im Menü auf der linken Seite Benutzer aus.
Es wird eine Liste der Benutzer angezeigt, klicken Sie also auf den Zielbenutzer.
Notieren Sie sich die "Objekt-ID", da es sich um die Benutzer-ID handelt.
Erstellen einer Konsolenanwendung
Starten Sie Visual Studio, und erstellen Sie ein Projekt für Ihre Konsolenanwendung. Sie können es außerhalb von Visual Studio erstellen, aber ich werde vorerst Visual Studio verwenden.
Der Speicherort und der Projektname sind optional. In diesem Fall lautet OneDriveApiDotNetClientCredentialsHttpClient
der Projektname .
Dieses Mal werden wir den Code nicht teilen, sondern Program.cs
ihn gestaffelt von oben schreiben, wenn Sie also die Bewegung überprüfen können, schreiben Sie sie bitte neu, indem Sie den Code nach Bedarf teilen.
using System.Runtime.Serialization.Json;
using System.Text;
using System.Text.Json;
using System.Web;
using System.Xml;
Beschreiben Sie den Namespace, den Sie verwenden möchten.
// 認証結果を格納するクラスです
public record TokenResponse(string token_type, int expires_in, int ext_expires_in, string access_token);
Diese Klasse wird verwendet, um Tokeninformationen nach der Authentifizierung zu erhalten.
Program.cs
, schreiben Sie es bitte an das Ende des Codes.
Sie können diese Klasse in andere Dateien aufteilen.
// JSON 文字列を整形するメソッド
static string ConvertToIndentedJson(string json)
{
byte[] buffer = Encoding.UTF8.GetBytes(json);
using MemoryStream stream = new();
using XmlDictionaryWriter writer = JsonReaderWriterFactory.CreateJsonWriter(stream, Encoding.UTF8, true, true);
using XmlDictionaryReader reader = JsonReaderWriterFactory.CreateJsonReader(buffer, XmlDictionaryReaderQuotas.Max);
writer.WriteNode(reader, true);
writer.Flush();
return Encoding.UTF8.GetString(stream.ToArray());
}
Dabei handelt es sich um eine magische Methode, die JSON-Text, der von der API empfangen wird, mit Einrückung formatiert. Da es sich um einen Code handelt, der aus dem Internet entnommen wurde, werde ich den Inhalt nicht im Detail erläutern.
// 各種 ID などの定義
var clientId = "XXXXXXXX"; // クライアント ID
var tenantId = "XXXXXXXX"; // テナント ID
var clientSecret = "XXXXXXXX"; // クライアント シークレット
var userId = "XXXXXXXX"; // ユーザー ID
var accessToken = ""; // アクセストークン
Legen Sie jeweils die in Azure abgerufene ID fest.
accessToken
ist ein temporäres Token für den Zugriff auf OneDrive, daher wird es zur Laufzeit festgelegt.
// 各種 URL の定義
var urlToken = $"https://login.microsoftonline.com/{tenantId}/oauth2/v2.0/token";
var urlOneDriveGetRootFolders = $"https://graph.microsoft.com/v1.0/users/{userId}/drive/root/children";
Die API-URL für die Authentifizierung und die API-URL zum Abrufen der Liste der Ordner im Stammverzeichnis von OneDvie. Dies ist eine Beschreibung, wie der Zugriff auf die OneDrive-API überprüft wird, daher werde ich den Inhalt der OneDrive-API nicht beschreiben. Wenn Sie Zugriff auf die OneDrive-API haben, ist das Hoch- und Herunterladen eine Anwendung, daher glaube ich nicht, dass es so schwierig ist.
// 使いまわすので最初に定義しておく
HttpClient httpClient = new();
Sie haben eine generiert, um eine Anforderung an HttpClient
die angegebene URL zu senden.
// 「Name1=Value1&Name2=Value2...」形式のクエリパラメータ文字列を作成する
var valueDict = new Dictionary<string, string>
{
{ "client_id", clientId },
{ "scope", "https://graph.microsoft.com/.default" },
{ "client_secret", clientSecret },
{ "grant_type", "client_credentials" },
};
var valueQS = string.Join("&", valueDict.Select(x => string.Format("{0}={1}", x.Key, HttpUtility.UrlEncode(x.Value))));
Console.WriteLine($"valueQS={valueQS}");
Zuerst stellen Sie eine Anfrage mit Daten an die Authentifizierungs-API, also bereiten Sie diese Daten vor. Das Format der zu sendenden Daten ist ein Abfrageparameter-String im Format "Name1=Wert1&Name2=Wert2...", wird also in einem Wörterbuch erstellt und dann in einen Abfrageparameter-String umgewandelt.
Es gibt vier Parameter, die gesendet werden müssen:
Beispiel | für Parameternamenswerte |
---|---|
client_id | Legen Sie die Client-ID fest, die Sie in der App-Registrierung erhalten haben. |
Umfang | Die Authentifizierung mit einem geheimen Clientschlüssel ist behoben https://graph.microsoft.com/.default . |
client_secret | Legen Sie den Wert des geheimen Clientschlüssels fest, den Sie bei der App-Registrierung abgerufen haben. |
grant_type | Da es sich um eine Authentifizierung mit einem geheimen Clientschlüssel handelt, client_credentials wird |
Weitere Informationen finden Sie auf der folgenden offiziellen Website.
// 認証処理
using (HttpRequestMessage request = new(HttpMethod.Post, urlToken))
{
request.Content = new StringContent(valueQS, Encoding.UTF8, "application/x-www-form-urlencoded");
// データを送信し結果を受け取る
using var response = httpClient.SendAsync(request).Result;
Console.WriteLine($"IsSuccessStatusCode={response.IsSuccessStatusCode}");
Console.WriteLine($"StatusCode={response.StatusCode}");
Console.WriteLine($"ReasonPhrase={response.ReasonPhrase}");
if (response.IsSuccessStatusCode == false)
{
Console.WriteLine("トークンの取得に失敗しました。");
return;
}
// レスポンスからアクセストークンを受け取る。
var tokenResultJson = response.Content.ReadAsStringAsync().Result;
Console.WriteLine($"tokenResultJson={ConvertToIndentedJson(tokenResultJson)}");
var tokenResult = JsonSerializer.Deserialize<TokenResponse>(tokenResultJson) ?? throw new Exception("JSON をデシリアライズできませんでした。");
accessToken = tokenResult.access_token;
}
HttpClient
, um eine Anfrage an die Authentifizierungs-API zu senden. HttpClient
Es ist eine weit verbreitete Verwendung, daher glaube ich nicht, dass es viel gibt, worauf man achten sollte.
Die zu sendenden Daten müssen UTF8-kodiert sein und der Content-Type sollte sein application/x-www-form-urlencoded
. Die Methode ist POST
.
Wenn die IsSuccessStatusCode
Antwort erfolgreich überprüft und verarbeitet wurde, erhalten Sie das Ergebnis als JSON-Zeichenfolge.
Der JSON-Code, den Sie erhalten, verfügt über die folgenden Parameter:
{
"token_type": "Bearer",
"expires_in": 3599,
"ext_expires_in": 3599,
"access_token": "XXXXXXXXXXXXXXX"
}
In diesem Fall access_token
verwenden wir . Verwenden Sie diesen Wert mit der OneDrive-API.
Sie können die anderen Parameter ignorieren, aberaccess_token
wenn Sie das Ablaufdatum von wissen möchten, verwenden Sie expires_in
.
Es ist schwierig, es als JSON-Zeichenfolge zu verwenden, daher JsonSerializer.Deserialize
deserialisieren wir es mit und erhalten dann access_token
.
// OneDrive 処理
using (HttpRequestMessage request = new(HttpMethod.Get, urlOneDriveGetRootFolders))
{
// アクセストークンをヘッダーに追加する
request.Headers.Add("Authorization", "Bearer " + accessToken);
// OneDrive API にリクエスト
using var response = httpClient.SendAsync(request).Result;
Console.WriteLine($"IsSuccessStatusCode={response.IsSuccessStatusCode}");
Console.WriteLine($"StatusCode={response.StatusCode}");
Console.WriteLine($"ReasonPhrase={response.ReasonPhrase}");
if (response.IsSuccessStatusCode == false)
{
Console.WriteLine("OneDrive へのアクセスに失敗しました。");
return;
}
// レスポンスからアクセストークンを受け取る。
var apiResultJson = response.Content.ReadAsStringAsync().Result;
Console.WriteLine($"apiResultJson={ConvertToIndentedJson(apiResultJson)}");
}
Verwenden Sie abschließend das Zugriffstoken, um eine Anforderung an die OneDrive-API zu senden.
Die Methode gibt GET
an, hängt jedoch vom Typ der API ab, lesen Sie also die OneDrive-API-Dokumentation.
Fügen Sie dem Header das Zugriffstoken hinzu. Legen Sie den Schlüssel als Authorization
und den Wert im Bearer {アクセストークン}
Format fest.
Alles, was Sie tun müssen, ist, eine Anfrage zu stellen und das Ergebnis als JSON-String zu erhalten. Nachdem wir nun nur noch sicherstellen, dass wir Zugriff auf die OneDrive-API haben, formatieren wir nur noch die JSON-Zeichenfolge und drucken sie in der Konsole. Tatsächlich deserialisiert es das empfangene JSON und verarbeitet es entsprechend.
Ich habe dieses Mal eine Liste von Ordnern erhalten, aber ich denke, der JSON-Code lautet wie folgt.
{
"@odata.context": "https:\/\/graph.microsoft.com\/v1.0\/$metadata#Collection(driveItem)",
"value": [
{
"@microsoft.graph.Decorator": "decorator has been deprecated. Refer to folder.decorator",
"createdBy": {
"フォルダ作成者の情報":""
},
"createdDateTime": "2017-06-20T04:31:24Z",
"eTag": "\"{XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX},1\"",
"id": "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
"lastModifiedBy": {
"フォルダ更新者の情報":""
},
"lastModifiedDateTime": "2017-06-20T04:31:24Z",
"name": "フォルダ名",
"parentReference": {
"親フォルダの情報":""
},
"webUrl": "フォルダにアクセスできる URL",
"cTag": "\"c:{5926E2DA-B7FF-4936-88A8-7908C378ECE2},0\"",
"fileSystemInfo": {
"createdDateTime": "2017-06-20T04:31:24Z",
"lastModifiedDateTime": "2017-06-20T04:31:24Z"
},
"folder": {
"childCount": 0
},
"size": 0,
"specialFolder": {
"name": "フォルダ名"
}
},
:
]
}
Ich glaube nicht, dass Sie alle Informationen benötigen, wenn Sie also beispielsweise nur den Ordnernamen abrufen möchten, können Sie value
nur die Parameter aus name
dem Array in abrufen.
Zusammenfassung
Wenn es soweit gut funktioniert, sollten Sie in der Lage sein, mit einem Batch-Programm auf OneDrive zuzugreifen. Ich weiß nicht, ob die Tipps die Methoden des Hoch- und Herunterladens zusammenfassen, aber grundsätzlich sollte es funktionieren, wenn Sie die oben beschriebene Liste der Ordner im Stammverzeichnis anwenden. Die Arten von APIs sind auf der offiziellen Website unten zusammengefasst, also suchen Sie bitte die API, die Sie verwenden möchten, und implementieren Sie sie.
Danke
Ich hatte dieses Mal einige Fragen zur Verwendung der OneDrive-API, also habe ich eine Frage gestellt.
- Ich möchte etwas gegen OneDrive (API) in einem Programm tun, das im Hintergrund ausgeführt wird (C#)