Gebruik de OneDrive-API zonder tussenkomst van de gebruiker, zoals een batchprogramma (.NET C#-versie) (geen bibliotheken voor extra gebruik)
Werkomgeving
- Visuele Studio
-
- Visuele Studio 2022
- .NET
-
- .NET 8
- Microsoft Verificatie API
-
- 2.0 OAuth 2
- Microsoft OneDrive-API
-
- 1.0
- Typen Microsoft-accounts
-
- Werk- of schoolaccount
Voorwaarden
- Visuele Studio
-
- Een van de versies
- .NET
-
- Een van de versies
- Microsoft Verificatie API
-
- 2.0 OAuth 2
- Microsoft OneDrive-API
-
- 1.0
- Typen Microsoft-accounts
-
- Werk- of schoolaccount
Over het doel van dit evenement
Nu gebruikt u de OneDrive-API's om u voor te bereiden op het programmatisch uploaden en downloaden van bestanden naar OneDrive. In dit artikel gaan we in op wat u kunt doen met de OneDrive-API, dus we gaan niet in op wat u kunt doen met de OneDrive-API. Zolang u echter verbinding kunt maken, kunt u de API-documentatie lezen en daarna toepassen.
Hoe het programma uit te voeren
Toegang tot OneDrive is niet afhankelijk van de vorm van het programma, zoals een webtoepassing, een bureaubladtoepassing of een consoletoepassing, en kan door verschillende programma's worden uitgevoerd. In dit geval maken we een console-applicatie en voeren we deze automatisch uit zonder enige gebruikersbediening.
Wat zijn de verschillende soorten Microsoft-accounts?
Als je ooit een Microsoft-account hebt gemaakt, heb je het waarschijnlijk wel gezien. Er zijn twee hoofdtypen Microsoft-accounts: persoonlijke Microsoft-accounts en werk- of schoolaccounts. OneDrive is gekoppeld aan een Microsoft-account, maar het type OneDrive varieert enigszins, afhankelijk van het hierboven vermelde accounttype.
Voorlopig kan de OneDrive API gebruikt worden met beide bovenstaande soorten accounts. In dit programma in de vorm van "gemaakt als een console-applicatie en uitgevoerd zonder gebruikersbediening", Houd er rekening mee dat het alleen kan worden gebruikt met een Microsoft-account in het "Werk- of schoolaccount"-account. Dit komt door verschillen in authenticatiemethoden.
Over de verificatiemethode
Eerst moet u zich verifiëren om programmatisch toegang te krijgen tot OneDrive. Zoals hierboven vermeld, heeft elk programma toegang tot OneDrive, maar de verificatie om verbinding te maken met de API is afhankelijk van hoe het programma wordt uitgevoerd. Webapplicaties en desktopapplicaties kunnen worden geverifieerd door interactie van de gebruiker. Aangezien de gebruiker het niet kan bedienen in een console-applicatie die op de achtergrond wordt uitgevoerd, is de authenticatiemethode ook anders dan hierboven.
Ik weet de gedetailleerde reden niet omdat ik het niet heb kunnen opzoeken, maar als het in me opkomt, lijkt het te wijten te zijn aan beveiliging en accountbeheer. Ik kan alleen zeggen dat dit al een specificatie is, dus als je programmatisch toegang wilt tot OneDrive die is gekoppeld aan een "persoonlijk Microsoft-account", Ik denk dat er geen andere keuze is dan een ander programma te gebruiken dan een programma dat op de achtergrond draait, of om een console-applicatie uit te voeren met een authenticatiemethode die gebruikersbewerkingen omvat.
We gebruiken de bibliotheek op dit moment niet om toegang te krijgen tot de OneDrive-API
Toegang tot de OneDrive-API is relatief eenvoudig te beheren met behulp van een bibliotheek met de naam "Microsoft Graph". In dit geval zullen we de methode gebruiken om rechtstreeks toegang te krijgen tot de URL van de API en deze uit te voeren. Het is een beetje omslachtig, maar omdat het geen bibliotheek gebruikt, heeft het het voordeel dat non-.NET programma's op dezelfde manier toegang hebben tot de OneDrive-API. Het voorkomt ook het nadeel dat de code verandert door verschillende versies van de bibliotheek.
In een andere tip laten we je zien hoe je Microsoft Graph gebruikt.
voorwaarde
- U hebt een Microsoft-account voor een werk- of schoolaccount
- U kunt de OneDrive gebruiken die is gekoppeld aan het hierboven vermelde Microsoft-account (bijv. OneDrive Business)
- Visual Studio 2022 geïnstalleerd
Stel uw toepassing in voor toegang tot uw Microsoft-account of OneDrive in Azure
Meld u aan bij Azure via de volgende URL:
Typ in het zoekveld hierboven "app-registraties" en selecteer het.
Klik op Nieuwe registratie.
De inhoud van de "Naam" is willekeurig. Voer een beschrijvende naam in.
Selecteer een ander 'Ondersteund accounttype' dan 'Alleen persoonlijke Microsoft-accounts'. Dit komt omdat, zoals hierboven vermeld, deze authenticatie alleen kan worden gebruikt met accounts die tot een organisatie behoren. In dit geval hebben we "Accounts in elke organisatiedirectory (elke Microsoft Entra ID-tenant - multi-tenant) en persoonlijke Microsoft-accounts (Skype, Xbox, enz.)" geselecteerd.
U hoeft de "Redirect URI" niet in te voeren, omdat deze deze keer niet wordt gebruikt.
Als u klaar bent, klikt u op de knop "Registreren".
U wordt naar de overzichtspagina van de app-registratie geleid die u hebt gemaakt, dus kopieer de toepassings-id (client) en de directory-id (tenant). Deze waarde gebruik je later.
Selecteer "Certificaten en geheimen" in de beheercategorie in het linkermenu en zorg ervoor dat "Clientgeheimen" is geselecteerd in het middelste tabblad. Klik op Nieuw clientgeheim.
Het invoeren van een beschrijving is optioneel. Als je het wilt blijven gebruiken, voeg dan een uitleg toe waarin het doel van het gebruik duidelijk wordt uitgelegd.
De "vervaldatum" is de periode dat dit clientgeheim geldig is. Aangezien het deze keer voor testdoeleinden is, is het 90 dagen, maar stel het in op basis van het gebruiksdoel.
Wanneer u een clientgeheim maakt, wordt het aan de lijst toegevoegd. Hierin gebruiken we de waarde in de kolom "Waarde", dus kopieer deze. Houd er rekening mee dat deze waarde later niet kan worden gekopieerd.
Selecteer vervolgens "API-machtigingen" in de categorie Beheer in het linkermenu en klik in het midden op "Machtigingen toevoegen".
Klik in de API-machtigingsaanvraag op Microsoft Graph.
Klik op Toepassing toestaan. Deze optie is niet beschikbaar voor persoonlijke Microsoft-accounts.
Hieronder wordt een lijst met machtigingen weergegeven, dus gebruik het zoekveld om de volgende items te controleren.
- Bestanden.ReadWrite.All
Dat is genoeg als u alleen OneDrive wilt gebruiken, maar als u toegang wilt tot iets anders, voegt u machtigingen toe. De machtigingen die nodig zijn om toegang te krijgen tot OneDrive zijn te vinden op de officiële pagina hieronder.
Nadat u uw selecties heeft gemaakt, klikt u op de knop Machtigingen toevoegen.
De toegevoegde wordt toegevoegd aan de lijst en het "Type" is "Toepassing". Aangezien de "Status" echter "Niet verleend aan XXXX" is, klikt u op "Beheerderstoestemming geven aan XXXX". (XXXX is de naam van uw organisatie)
Klik op Ja.
Het verandert in de toegekende staat.
Trouwens, je kunt de "gedelegeerde User.Read" die er vanaf het begin is, verwijderen omdat we het deze keer niet zullen gebruiken. Als u "User.Read" als toepassing hebt toegevoegd, gebruikt u deze.
Gebruikers-ID's verifiëren
Aangezien u toegang krijgt tot de OneDrive die de doelgebruiker heeft, moet u de gebruikers-ID van tevoren controleren.
Microsoft Entra ID
en open het.
Selecteer Gebruikers in het menu aan de linkerkant.
Er wordt een lijst met gebruikers weergegeven, dus klik op de doelgebruiker.
Noteer de "Object-ID", aangezien dit de gebruikers-ID zal zijn.
Een consoletoepassing maken
Start Visual Studio en maak een project voor uw consoletoepassing. Je kunt het buiten Visual Studio maken, maar ik gebruik voorlopig Visual Studio.
De locatie en de projectnaam zijn optioneel. In dit geval is OneDriveApiDotNetClientCredentialsHttpClient
de projectnaam .
Deze keer zullen we de code niet verdelen, maar Program.cs
zullen we deze verspringend van bovenaf schrijven, dus als je de beweging kunt controleren, herschrijf deze dan door de code indien nodig te splitsen.
using System.Runtime.Serialization.Json;
using System.Text;
using System.Text.Json;
using System.Web;
using System.Xml;
Beschrijf de naamruimte die u wilt gebruiken.
// 認証結果を格納するクラスです
public record TokenResponse(string token_type, int expires_in, int ext_expires_in, string access_token);
Deze klasse wordt gebruikt om tokeninformatie te ontvangen na verificatie.
Program.cs
, schrijf het aan het einde van de code.
U kunt deze klasse scheiden in andere bestanden.
// 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());
}
Dit is een magische methode die JSON-tekst die van de API is ontvangen, opmaakt met inspringing. Aangezien het een code is die van internet is opgepikt, zal ik de inhoud niet in detail uitleggen.
// 各種 ID などの定義
var clientId = "XXXXXXXX"; // クライアント ID
var tenantId = "XXXXXXXX"; // テナント ID
var clientSecret = "XXXXXXXX"; // クライアント シークレット
var userId = "XXXXXXXX"; // ユーザー ID
var accessToken = ""; // アクセストークン
Stel voor elke id de id in die op Azure is verkregen.
accessToken
is een tijdelijk token voor toegang tot OneDrive, dus het is ingesteld op runtime.
// 各種 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";
De API-URL voor authenticatie en de API-URL om de lijst met mappen in de root van OneDvie te krijgen. Dit is een beschrijving van hoe u de toegang tot de OneDrive-API kunt controleren, dus ik zal de inhoud van de OneDrive-API niet beschrijven. Als je toegang hebt tot de OneDrive API, is uploaden en downloaden een applicatie, dus ik denk niet dat het zo moeilijk is.
// 使いまわすので最初に定義しておく
HttpClient httpClient = new();
U heeft een verzoek gegenereerd om een verzoek in te dienen op HttpClient
de opgegeven URL.
// 「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}");
Eerst doe je een verzoek aan de authenticatie-API met gegevens, dus bereid die gegevens voor. Het formaat van de te verzenden gegevens is een queryparameterreeks in de indeling "Name1=Value1&Name2=Value2...", dus deze wordt gemaakt in een woordenboek en vervolgens geconverteerd naar een queryparameterreeks.
Er zijn vier parameters die moeten worden verzonden:
Voorbeeldvan parameternaamwaarden | |
---|---|
client_id | Stel de client-ID in die u hebt verkregen bij de app-registratie. |
draagwijdte | Verificatie met een clientgeheim staat vast https://graph.microsoft.com/.default . |
client_secret | Stel de waarde in van het clientgeheim dat u hebt verkregen bij de app-registratie. |
grant_type | Aangezien het authenticatie is met een clientgeheim, client_credentials zal het dat wel zijn |
Raadpleeg voor meer informatie de volgende officiële 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
om een verzoek in te dienen bij de authenticatie-API. HttpClient
Het is een veelgebruikt gebruik, dus ik denk niet dat er veel is om op te letten.
De te verzenden gegevens moeten UTF8-gecodeerd zijn en het inhoudstype moet application/x-www-form-urlencoded
zijn. De methode is POST
.
Als het IsSuccessStatusCode
antwoord is gecontroleerd en met succes is verwerkt, ontvangt u het resultaat als een JSON-tekenreeks.
De JSON die u ontvangt, heeft de volgende parameters:
{
"token_type": "Bearer",
"expires_in": 3599,
"ext_expires_in": 3599,
"access_token": "XXXXXXXXXXXXXXX"
}
Hierin access_token
zullen we . Gebruik deze waarde met de OneDrive-API.
U kunt de andere parameters negeren, maaraccess_token
als u de vervaldatum van wilt weten, gebruikt u expires_in
.
Het is moeilijk te gebruiken als een JSON-string, dus JsonSerializer.Deserialize
we deserialiseren het met en krijgen dan 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)}");
}
Gebruik ten slotte het toegangstoken om een aanvraag in te dienen bij de OneDrive-API.
De methode specificeert GET
, maar dit is afhankelijk van het type API, dus controleer de documentatie van de OneDrive API.
Voeg het toegangstoken toe aan de koptekst. Stel de sleutel in als Authorization
en de waarde in het Bearer {アクセストークン}
formaat .
Het enige wat je hoeft te doen is een aanvraag doen en het resultaat als JSON-string ontvangen. Nu we er alleen voor zorgen dat we toegang hebben tot de OneDrive-API, hoeven we alleen maar de JSON-tekenreeks te formatteren en af te drukken naar de console. In feite deserialiseert het de ontvangen JSON en verwerkt het dienovereenkomstig.
Ik heb deze keer een lijst met mappen ontvangen, maar ik denk dat de JSON als volgt is.
{
"@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": "フォルダ名"
}
},
:
]
}
Ik denk niet dat je alle informatie nodig hebt, dus als je bijvoorbeeld alleen de mapnaam wilt krijgen, kun je value
alleen de parameters van name
de array in krijgen.
Samenvatting
Als het tot nu toe goed werkt, zou je toegang moeten hebben tot OneDrive met een batchprogramma. Ik weet niet of de tips de methoden van uploaden en downloaden samenvatten, maar in principe zou het moeten werken als je de lijst met mappen in de hierboven beschreven hoofdmap toepast. De soorten API's worden samengevat op de officiële website hieronder, dus zoek de API die u wilt gebruiken en implementeer deze.
Bedankt
Ik had deze keer wat vragen over het gebruik van de OneDrive-API, dus ik heb een vraag gesteld.