Utilizați API-ul OneDrive fără interacțiunea utilizatorului, cum ar fi un program batch (versiunea .NET C#) (fără biblioteci de utilizare suplimentare)
Mediul de operare
- Visual Studio
-
- Visual Studio 2022
- .NET
-
- .NET 8
- API de autentificare Microsoft
-
- 2.0 OAuth 2
- API-ul Microsoft OneDrive
-
- 1.0
- Tipuri de conturi Microsoft
-
- Cont de la locul de muncă sau de la școală
Cerințe preliminare
- Visual Studio
-
- Una dintre versiuni
- .NET
-
- Una dintre versiuni
- API de autentificare Microsoft
-
- 2.0 OAuth 2
- API-ul Microsoft OneDrive
-
- 1.0
- Tipuri de conturi Microsoft
-
- Cont de la locul de muncă sau de la școală
Despre scopul acestui eveniment
Acum veți utiliza API-urile OneDrive pentru a vă pregăti pentru încărcarea și descărcarea programatică a fișierelor în OneDrive. În acest articol, vom analiza ce puteți face cu API-ul OneDrive, deci nu vom intra în detalii despre ce puteți face cu API-ul OneDrive. Cu toate acestea, atâta timp cât vă puteți conecta, puteți citi documentația API și o puteți aplica după aceea.
Cum se rulează programul
Accesul la OneDrive nu depinde de forma programului, cum ar fi o aplicație web, o aplicație desktop sau o aplicație de consolă și poate fi rulat de o varietate de programe. În acest caz, vom crea o aplicație de consolă și o vom executa automat fără nicio operațiune de utilizator.
Care sunt diferitele tipuri de conturi Microsoft?
Dacă ați creat vreodată un cont Microsoft, probabil că l-ați văzut. Există două tipuri principale de conturi Microsoft: conturi Microsoft personale și conturi de la locul de muncă sau de la școală. OneDrive este legat de un cont Microsoft, dar tipul de OneDrive variază ușor în funcție de tipul de cont enumerat mai sus.
Deocamdată, API-ul OneDrive poate fi utilizat cu ambele tipuri de conturi de mai sus. În acest program sub forma "creat ca aplicație de consolă și executat fără operarea utilizatorului", Rețineți că poate fi utilizat numai cu un cont Microsoft din contul "Cont de la locul de muncă sau de la școală". Acest lucru se datorează diferențelor dintre metodele de autentificare.
Despre metoda de autentificare
În primul rând, trebuie să vă autentificați pentru a accesa OneDrive programatic. După cum am menționat mai sus, orice program poate accesa OneDrive, dar autentificarea pentru a se conecta la API depinde de modul în care rulează programul. Aplicațiile web și aplicațiile desktop pot fi autentificate prin interacțiunea utilizatorului. Deoarece utilizatorul nu îl poate opera într-o aplicație de consolă care rulează în fundal, metoda de autentificare este, de asemenea, diferită de cea de mai sus.
Nu știu motivul detaliat pentru că nu am reușit să-l caut, dar dacă îmi vine în minte, se pare că se datorează securității și gestionării contului. Pot spune doar că aceasta este deja o specificație, așa că dacă doriți să accesați programatic OneDrive asociat cu un "cont personal Microsoft", Cred că nu există altă opțiune decât să folosești un alt program decât un program care rulează în fundal sau să rulezi o aplicație de consolă cu o metodă de autentificare care include operațiuni ale utilizatorului.
Nu vom folosi biblioteca pentru a accesa API-ul OneDrive în acest moment
Accesul la API-ul OneDrive este relativ ușor de gestionat folosind o bibliotecă numită "Microsoft Graph". În acest caz, vom folosi metoda de accesare directă a adresei URL a API-ului și de executare a acesteia. Este puțin greoi, dar din moment ce nu folosește o bibliotecă, are avantajul că programele non-.NET pot accesa API-ul OneDrive în același mod. De asemenea, previne dezavantajul că codul se schimbă din cauza diferitelor versiuni ale bibliotecii.
Vă vom arăta cum să utilizați Microsoft Graph într-un alt sfat.
Condiție prealabilă
- Aveți un cont Microsoft pentru un cont de la locul de muncă sau de la școală
- Puteți utiliza OneDrive asociat contului Microsoft enumerat mai sus (de exemplu, OneDrive Business)
- Visual Studio 2022 instalat
Configurați-vă aplicația pentru a vă accesa contul Microsoft sau OneDrive în Azure
Conectați-vă la Azure la următoarea adresă URL:
Din câmpul de căutare de mai sus, tastați "înregistrări aplicație" și selectați-l.
Faceți clic pe Înregistrare nouă.
Conținutul "Numelui" este arbitrar. Vă rugăm să introduceți un nume descriptiv.
Selectați un "Tip de cont acceptat", altul decât "Numai conturi Microsoft personale". Acest lucru se datorează faptului că, așa cum am menționat mai sus, această autentificare poate fi utilizată numai cu conturi care aparțin unei organizații. În acest caz, am selectat "Conturi în orice director organizațional (orice entitate găzduită Microsoft Entra ID - mai multe entități găzduite) și conturi Microsoft personale (Skype, Xbox etc.)".
Nu trebuie să introduceți "URI de redirecționare" deoarece nu va fi folosit de data aceasta.
Când ați terminat, faceți clic pe butonul "Înregistrare".
Veți fi direcționat la pagina rezumat a înregistrării aplicației pe care ați creat-o, așa că copiați ID-ul aplicației (client) și ID-ul directorului (entitate găzduită). Veți utiliza această valoare mai târziu.
Selectați "Certificate și secrete" din categoria de gestionare din meniul din stânga și asigurați-vă că "Secrete client" este selectat în fila din mijloc. Faceți clic pe Secret client nou.
Introducerea unei descrieri este opțională. Dacă doriți să continuați să îl utilizați, vă rugăm să includeți o explicație care să explice clar scopul utilizării.
"Data de expirare" este perioada de timp în care acest secret client este valabil. Deoarece este în scop de testare de data aceasta, este de 90 de zile, dar vă rugăm să-l setați în funcție de scopul utilizării.
Când creați un secret client, acesta este adăugat la listă. În aceasta, vom folosi valoarea din coloana "Valoare", așa că copiați-o. Rețineți că această valoare nu poate fi copiată ulterior.
Apoi, selectați "Permisiuni API" din categoria Administrare din meniul din stânga și faceți clic pe "Adăugați permisiuni" în mijloc.
În solicitarea de permisiune API, faceți clic pe Microsoft Graph.
Faceți clic pe Permiteți aplicația. Această opțiune nu este disponibilă pentru conturile Microsoft personale.
O listă de permisiuni va fi afișată mai jos, așa că utilizați câmpul de căutare pentru a verifica următoarele elemente.
- Fișiere.ReadWrite.All
Acest lucru este suficient dacă doriți să utilizați doar OneDrive, dar dacă doriți să accesați altceva, adăugați permisiuni. Permisiunile necesare pentru a accesa OneDrive pot fi găsite pe pagina oficială de mai jos.
După ce ați făcut selecțiile, faceți clic pe butonul Adăugați permisiuni.
Cel adăugat este adăugat la listă, iar "Tipul" este "Aplicație". Cu toate acestea, deoarece "Status" este "Nu este acordat lui XXXX", faceți clic pe "Acordați consimțământul administratorului pentru XXXX". (XXXX este numele organizației dvs.)
Faceți clic pe Da.
Se schimbă în starea acordată.
Apropo, puteți șterge "Utilizatorul delegat.Read" care este acolo de la început, deoarece nu îl vom folosi de data aceasta. Dacă ați adăugat "User.Read" ca aplicație, utilizați-l.
Verificarea ID-urilor de utilizator
Deoarece veți accesa OneDrive pe care îl are utilizatorul țintă, verificați ID-ul de utilizator în prealabil.
Microsoft Entra ID
și deschideți-l.
Selectați Utilizatori din meniul din stânga.
Va fi afișată o listă de utilizatori, așa că faceți clic pe utilizatorul țintă.
Notați "ID-ul obiectului", deoarece va fi ID-ul utilizatorului.
Crearea unei aplicații de consolă
Porniți Visual Studio și creați un proiect pentru aplicația consolă. Îl puteți crea în afara Visual Studio, dar voi folosi Visual Studio deocamdată.
Locația și numele proiectului sunt opționale. În acest caz, numele proiectului este OneDriveApiDotNetClientCredentialsHttpClient
.
De data aceasta, nu vom împărți codul, ci Program.cs
îl vom scrie eșalonat de sus, așa că dacă puteți verifica mișcarea, vă rugăm să o rescrieți împărțind codul după cum este necesar.
using System.Runtime.Serialization.Json;
using System.Text;
using System.Text.Json;
using System.Web;
using System.Xml;
Descrieți spațiul de nume pe care doriți să-l utilizați.
// 認証結果を格納するクラスです
public record TokenResponse(string token_type, int expires_in, int ext_expires_in, string access_token);
Această clasă este utilizată pentru a primi informații despre token după autentificare.
Program.cs
, vă rugăm să o scrieți la sfârșitul codului.
Puteți separa această clasă în alte fișiere.
// 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());
}
Aceasta este o metodă magică care formatează textul JSON primit de la API cu indentare. Deoarece este un cod preluat de pe Internet, nu voi explica conținutul în detaliu.
// 各種 ID などの定義
var clientId = "XXXXXXXX"; // クライアント ID
var tenantId = "XXXXXXXX"; // テナント ID
var clientSecret = "XXXXXXXX"; // クライアント シークレット
var userId = "XXXXXXXX"; // ユーザー ID
var accessToken = ""; // アクセストークン
Setați ID-ul obținut pe Azure pentru fiecare.
accessToken
este un token temporar pentru accesarea OneDrive, deci este setat în timpul execuției.
// 各種 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";
URL-ul API pentru autentificare și URL-ul API pentru a obține lista de foldere la rădăcina OneDvie. Aceasta este o descriere a modului de verificare a accesului la API-ul OneDrive, deci nu voi descrie conținutul API-ului OneDrive. Dacă aveți acces la API-ul OneDrive, încărcarea și descărcarea este o aplicație, așa că nu cred că este atât de dificil.
// 使いまわすので最初に定義しておく
HttpClient httpClient = new();
Ați generat un pentru a face o solicitare la HttpClient
adresa URL specificată.
// 「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}");
Mai întâi, veți face o solicitare la API-ul de autentificare cu date, așa că pregătiți acele date. Formatul datelor care urmează să fie trimise este un șir de parametri de interogare în formatul "Name1=Value1&Name2=Value2...", deci este creat într-un dicționar și apoi convertit într-un șir de parametri de interogare.
Există patru parametri care trebuie trimiși:
Exemple devalori | ale numelui parametrilor |
---|---|
client_id | Setați ID-ul de client pe care l-ați obținut în înregistrarea aplicației. |
Aplicare | Autentificarea cu un secret client este fixă https://graph.microsoft.com/.default . |
client_secret | Setați valoarea secretului client pe care l-ați obținut în înregistrarea aplicației. |
grant_type | Deoarece este autentificare cu un secret client, client_credentials va fi |
Pentru mai multe informații, vă rugăm să consultați următorul site oficial.
// 認証処理
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
pentru a face o solicitare către API-ul de autentificare. HttpClient
Este o utilizare comună, așa că nu cred că sunt prea multe la care să acordăm atenție.
Datele care urmează să fie trimise trebuie să fie codificate UTF8, iar tipul de conținut trebuie să fie application/x-www-form-urlencoded
. Metoda este POST
.
Dacă răspunsul IsSuccessStatusCode
este verificat și procesat cu succes, veți primi rezultatul ca șir JSON.
JSON-ul pe care îl primiți are următorii parametri:
{
"token_type": "Bearer",
"expires_in": 3599,
"ext_expires_in": 3599,
"access_token": "XXXXXXXXXXXXXXX"
}
În aceasta, access_token
vom folosi . Utilizați această valoare cu API-ul OneDrive.
Puteți ignora ceilalți parametri, daraccess_token
dacă doriți să cunoașteți data de expirare a , utilizați expires_in
.
Este dificil de utilizat ca șir JSON, așa că JsonSerializer.Deserialize
îl deserializăm cu și apoi access_token
obținem .
// 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)}");
}
În cele din urmă, utilizați tokenul de acces pentru a face o solicitare către API-ul OneDrive.
Metoda specifică GET
, dar depinde de tipul de API, așa că verificați documentația API-ului OneDrive.
Adăugați tokenul de acces la antet. Setați cheia ca Authorization
și valoarea în formatul Bearer {アクセストークン}
.
Tot ce trebuie să faceți este să faceți o solicitare și să primiți rezultatul ca șir JSON. Acum că ne asigurăm că avem acces la API-ul OneDrive, formatăm șirul JSON și îl imprimăm în consolă. De fapt, deserializează JSON-ul primit și îl procesează în consecință.
Am primit o listă de foldere de data aceasta, dar cred că JSON este după cum urmează.
{
"@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": "フォルダ名"
}
},
:
]
}
Nu cred că aveți nevoie de toate informațiile, așa că dacă doriți să obțineți doar numele folderului, de exemplu, puteți value
obține doar parametrii din name
matrice în .
Rezumat
Dacă funcționează bine până acum, ar trebui să puteți accesa OneDrive cu un program batch. Nu știu dacă sfaturile rezumă metodele de încărcare și descărcare, dar practic ar trebui să funcționeze dacă aplicați lista de foldere din rădăcina descrisă mai sus. Tipurile de API-uri sunt rezumate pe site-ul oficial de mai jos, așa că vă rugăm să găsiți API-ul pe care doriți să îl utilizați și să îl implementați.
mulţumesc
Am avut câteva întrebări despre utilizarea API-ului OneDrive de data aceasta, așa că am pus o întrebare.