Brug OneDrive-API'en uden brugerinteraktion, f.eks. et batchprogram (.NET C#-version) (ingen yderligere brugsbiblioteker)
Driftsmiljø
- Visual Studio
-
- Visual Studio 2022
- .NET
-
- .NET 8
- API til Microsoft-godkendelse
-
- 2.0 OAuth 2
- Microsoft OneDrive API
-
- 1.0
- Typer af Microsoft-konti
-
- Arbejds- eller skolekonto
Forudsætninger
- Visual Studio
-
- En af versionerne
- .NET
-
- En af versionerne
- API til Microsoft-godkendelse
-
- 2.0 OAuth 2
- Microsoft OneDrive API
-
- 1.0
- Typer af Microsoft-konti
-
- Arbejds- eller skolekonto
Om formålet med dette arrangement
Nu skal du bruge OneDrive-API'erne til at forberede dig på programmatisk overførsel og download af filer til OneDrive. I denne artikel vil vi gå ind på, hvad du kan gøre med OneDrive API, så vi vil ikke gå ind på, hvad du kan gøre med OneDrive API. Men så længe du kan oprette forbindelse, kan du læse API-dokumentationen og anvende den derefter.
Sådan kører du programmet
Adgang til OneDrive er ikke afhængig af programmets form, f.eks. et webprogram, et skrivebordsprogram eller et konsolprogram, og kan køres af en række forskellige programmer. I dette tilfælde opretter vi en konsolapplikation og udfører den automatisk uden nogen brugerbetjening.
Hvad er de forskellige typer Microsoft-konti?
Hvis du nogensinde har oprettet en Microsoft-konto, har du sikkert set den. Der er to hovedtyper af Microsoft-konti: personlige Microsoft-konti og arbejds- eller skolekonti. OneDrive er bundet til en Microsoft-konto, men typen af OneDrive varierer lidt afhængigt af kontotypen, der er angivet ovenfor.
Indtil videre kan OneDrive API bruges med begge ovenstående typer konti. I dette program i form af "oprettet som en konsolapplikation og udført uden brugerbetjening", Bemærk, at den kun kan bruges med en Microsoft-konto på kontoen "Arbejds- eller skolekonto". Dette skyldes forskelle i godkendelsesmetoder.
Om godkendelsesmetoden
Først skal du godkende for at få adgang til OneDrive programmatisk. Som nævnt ovenfor kan ethvert program få adgang til OneDrive, men godkendelsen for at oprette forbindelse til API'en afhænger af, hvordan programmet kører. Webprogrammer og skrivebordsprogrammer kan godkendes ved brugerinteraktion. Da brugeren ikke kan betjene den i en konsolapplikation, der kører i baggrunden, er godkendelsesmetoden også forskellig fra ovenstående.
Jeg kender ikke den detaljerede årsag, fordi jeg ikke har været i stand til at slå det op, men hvis det kommer til at tænke på, ser det ud til at skyldes sikkerhed og kontoadministration. Jeg kan kun sige, at dette allerede er en specifikation, så hvis du vil have programmatisk adgang til OneDrive forbundet med en "personlig Microsoft-konto", Jeg mener, at der ikke er andet valg end at bruge et andet program end et program, der kører i baggrunden, eller at køre et konsolprogram med en godkendelsesmetode, der inkluderer brugeroperationer.
Vi bruger ikke biblioteket til at få adgang til OneDrive-API'en på nuværende tidspunkt
Adgang til OneDrive API er relativt let at håndtere ved hjælp af et bibliotek kaldet "Microsoft Graph". I dette tilfælde vil vi bruge metoden til direkte adgang til API'ens URL og udføre den. Det er lidt besværligt, men da det ikke bruger et bibliotek, har det den fordel, at non-.NET programmer kan få adgang til OneDrive API på samme måde. Det forhindrer også den ulempe, at koden ændres på grund af forskellige versioner af biblioteket.
Vi viser dig, hvordan du bruger Microsoft Graph i et andet tip.
forudsætning
- Du har en Microsoft-konto til en arbejds- eller skolekonto
- Du kan bruge det OneDrive, der er knyttet til den Microsoft-konto, der er angivet ovenfor (f.eks. OneDrive Business)
- Visual Studio 2022 installeret
Konfigurer dit program til at få adgang til din Microsoft-konto eller OneDrive i Azure
Log på Azure på følgende URL-adresse:
Fra søgefeltet ovenfor skal du skrive "app-registreringer" og vælge det.
Klik på Ny registrering.
Indholdet af "Navnet" er vilkårligt. Indtast venligst et beskrivende navn.
Vælg en anden "Understøttet kontotype" end "Kun personlige Microsoft-konti". Dette skyldes, som nævnt ovenfor, at denne godkendelse kun kan bruges med konti, der tilhører en organisation. I dette tilfælde har vi valgt "Konti i enhver organisationsmappe (enhver Microsoft Entra ID-lejer - multi-tenant) og personlige Microsoft-konti (Skype, Xbox osv.)".
Du behøver ikke indtaste "Redirect URI", fordi den ikke vil blive brugt denne gang.
Når du er færdig, skal du klikke på knappen "Registrer".
Du føres til oversigtssiden for den appregistrering, du har oprettet, så kopiér program-id'et (klient) og katalog-id'et (lejer). Du skal bruge denne værdi senere.
Vælg "Certifikater og hemmeligheder" fra administrationskategorien i menuen til venstre, og sørg for, at "Klienthemmeligheder" er valgt i den midterste fane. Klik på Ny klienthemmelighed.
Det er valgfrit at angive en beskrivelse. Hvis du vil fortsætte med at bruge det, skal du inkludere en forklaring, der tydeligt forklarer formålet med brugen.
"Udløbsdatoen" er det tidsrum, hvor denne klienthemmelighed er gyldig. Da det er til testformål denne gang, er det 90 dage, men indstil det venligst i henhold til formålet med brugen.
Når du opretter en klienthemmelighed, føjes den til listen. I dette vil vi bruge værdien i kolonnen "Værdi", så kopier den. Bemærk, at denne værdi ikke kan kopieres senere.
Vælg derefter "API-tilladelser" fra kategorien Administration i menuen til venstre og klik på "Tilføj tilladelser" i midten.
I API-tilladelsesanmodningen skal du klikke på Microsoft Graph.
Klik på Tillad ansøgning. Denne indstilling er ikke tilgængelig for personlige Microsoft-konti.
En liste over tilladelser vil blive vist nedenfor, så brug søgefeltet til at kontrollere følgende elementer.
- Filer.ReadWrite.All
Det er nok, hvis du kun vil bruge OneDrive, men hvis du vil have adgang til noget andet, skal du tilføje tilladelser. De tilladelser, der kræves for at få adgang til OneDrive, kan findes på den officielle side nedenfor.
Når du har foretaget dine valg, skal du klikke på knappen Tilføj tilladelser.
Den tilføjede føjes til listen, og "Type" er "Ansøgning". Men da "Status" er "Ikke givet til XXXX", skal du klikke på "Giv administratorsamtykke til XXXX". (XXXX er navnet på din organisation)
Klik på Ja.
Det ændres til den bevilgede tilstand.
Du kan i øvrigt slette den "delegerede User.Read", der er der fra begyndelsen, fordi vi ikke vil bruge den denne gang. Hvis du har tilføjet "User.Read" som et program, skal du bruge det.
Bekræftelse af bruger-id'er
Da du får adgang til den OneDrive, som målbrugeren har, skal du kontrollere bruger-id'et på forhånd.
Microsoft Entra ID
og åbne den.
Vælg Brugere i menuen til venstre.
En liste over brugere vises, så klik på målbrugeren.
Noter "Objekt-id'et", da det vil være bruger-id'et.
Opret et konsolprogram
Start Visual Studio, og opret et projekt til dit konsolprogram. Du kan oprette det uden for Visual Studio, men jeg vil bruge Visual Studio indtil videre.
Placeringen og projektnavnet er valgfrie. I dette tilfælde er OneDriveApiDotNetClientCredentialsHttpClient
projektnavnet .
Denne gang vil vi ikke opdele koden, men Program.cs
vil skrive den forskudt fra toppen, så hvis du kan kontrollere bevægelsen, skal du omskrive den ved at opdele koden efter behov.
using System.Runtime.Serialization.Json;
using System.Text;
using System.Text.Json;
using System.Web;
using System.Xml;
Beskriv det navneområde, du vil bruge.
// 認証結果を格納するクラスです
public record TokenResponse(string token_type, int expires_in, int ext_expires_in, string access_token);
Denne klasse bruges til at modtage tokenoplysninger efter godkendelse.
Program.cs
, skriv det i slutningen af koden.
Du kan opdele denne klasse i andre filer.
// 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());
}
Dette er en magisk metode, der formaterer JSON-tekst modtaget fra API'et med indrykning. Da det er en kode, der er hentet fra internettet, vil jeg ikke forklare indholdet i detaljer.
// 各種 ID などの定義
var clientId = "XXXXXXXX"; // クライアント ID
var tenantId = "XXXXXXXX"; // テナント ID
var clientSecret = "XXXXXXXX"; // クライアント シークレット
var userId = "XXXXXXXX"; // ユーザー ID
var accessToken = ""; // アクセストークン
Angiv det id, der er hentet på Azure for hver af dem.
accessToken
er et midlertidigt token til at få adgang til OneDrive, så det er indstillet på kørselstidspunktet.
// 各種 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";
API-URL'en til godkendelse og API-URL'en for at få listen over mapper i roden af OneDvie. Dette er en beskrivelse af, hvordan du kontrollerer adgangen til OneDrive API, så jeg vil ikke beskrive indholdet af OneDrive API. Hvis du har adgang til OneDrive API, er upload og download en applikation, så jeg synes ikke, det er så svært.
// 使いまわすので最初に定義しておく
HttpClient httpClient = new();
Du har genereret en for at lave en anmodning til HttpClient
den angivne 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}");
Først skal du sende en anmodning til godkendelses-API'en med data, så forbered disse data. Formatet på de data, der skal sendes, er en forespørgselsparameterstreng i formatet "Name1=Value1&Name2=Value2...", så den oprettes i en ordbog og konverteres derefter til en forespørgselsparameterstreng.
Der er fire parametre, der skal sendes:
Eksempelpå parameternavnværdier | |
---|---|
client_id | Angiv det klient-id, du fik i appregistreringen. |
Omfanget | Godkendelse med en klienthemmelighed er rettet https://graph.microsoft.com/.default . |
client_secret | Angiv værdien af den klienthemmelighed, du har fået i appregistreringen. |
grant_type | Da det er godkendelse med en klienthemmelighed, client_credentials vil det være |
For mere information henvises til følgende embedsmand webwebsted.
// 認証処理
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
for at foretage en anmodning til godkendelses-API'en. HttpClient
Det er en almindelig brug, så jeg tror ikke, der er meget at være opmærksom på.
De data, der skal sendes, skal være UTF8-kodet, og indholdstypen skal være application/x-www-form-urlencoded
. Metoden er POST
.
Hvis IsSuccessStatusCode
svaret kontrolleres og behandles korrekt, modtager du resultatet som en JSON-streng.
Det JSON, du modtager, har følgende parametre:
{
"token_type": "Bearer",
"expires_in": 3599,
"ext_expires_in": 3599,
"access_token": "XXXXXXXXXXXXXXX"
}
I dette access_token
vil vi bruge . Brug denne værdi sammen med OneDrive-API'en.
Du kan ignorere de andre parametre, menaccess_token
hvis du vil kende udløbsdatoen for , skal du bruge expires_in
.
Det er svært at bruge som en JSON-streng, så JsonSerializer.Deserialize
vi deserialiserer det med og får derefter 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)}");
}
Til sidst skal du bruge adgangstokenet til at foretage en anmodning til OneDrive API.
Metoden angiver GET
, men det afhænger af typen af API, så se OneDrive API-dokumentationen.
Føj adgangstokenet til overskriften. Indstil nøglen som Authorization
og værdien i Bearer {アクセストークン}
formatet .
Alt du skal gøre er at lave en anmodning og modtage resultatet som en JSON-streng. Nu hvor vi bare sørger for, at vi har adgang til OneDrive-API'en, formaterer vi bare JSON-strengen og udskriver den til konsollen. Faktisk deserialiserer den den modtagne JSON og behandler den i overensstemmelse hermed.
Jeg har modtaget en liste over mapper denne gang, men jeg tror, at JSON er som følger.
{
"@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": "フォルダ名"
}
},
:
]
}
Jeg tror ikke, du har brug for alle oplysningerne, så hvis du for eksempel kun vil have mappenavnet, kan du value
kun få parametrene fra name
arrayet i .
Resumé
Hvis det fungerer fint indtil videre, bør du kunne få adgang til OneDrive med et batchprogram. Jeg ved ikke, om tipsene opsummerer metoderne til upload og download, men dybest set burde det fungere, hvis du anvender listen over mapper i roden beskrevet ovenfor. Typerne af API'er er opsummeret på den officielle hjemmeside nedenfor, så find venligst den API, du vil bruge, og implementer den.
Tak
Jeg havde nogle spørgsmål om brugen af OneDrive API denne gang, så jeg stillede et spørgsmål.