Použití rozhraní API služby OneDrive bez zásahu uživatele, například dávkového programu (verze .NET C#) (bez dalších knihoven pro použití)
Provozní prostředí
- Vizuální studio
-
- Visual Studio 2022
- .SÍŤ
-
- .NET 8
- Rozhraní API pro ověřování společnosti Microsoft
-
- 2.0 OAuth 2
- Microsoft OneDrive API
-
- 1.0
- Typy účtů Microsoft
-
- Pracovní nebo školní účet
Požadavky
- Vizuální studio
-
- Jedna z verzí
- .SÍŤ
-
- Jedna z verzí
- Rozhraní API pro ověřování společnosti Microsoft
-
- 2.0 OAuth 2
- Microsoft OneDrive API
-
- 1.0
- Typy účtů Microsoft
-
- Pracovní nebo školní účet
O účelu této akce
Nyní se pomocí rozhraní API OneDrivu připravíte na programové nahrávání a stahování souborů na OneDrive. V tomto článku se podíváme na to, co můžete dělat s rozhraním API OneDrive, takže se nebudeme zabývat tím, co můžete dělat s rozhraním API OneDrive. Pokud se však můžete připojit, můžete si přečíst dokumentaci API a poté ji použít.
Jak spustit program
Přístup ke službě OneDrive není závislý na formě programu, jako je webová aplikace, aplikace pro stolní počítače nebo konzolová aplikace, a může být spuštěn různými programy. V tomto případě vytvoříme konzolovou aplikaci a spustíme ji automaticky bez jakékoli uživatelské operace.
Jaké jsou různé typy účtů Microsoft?
Pokud jste si někdy vytvořili účet Microsoft, pravděpodobně jste ho viděli. Existují dva hlavní typy účtů Microsoft: osobní účty Microsoft a pracovní nebo školní účty. OneDrive je svázán s účtem Microsoft, ale typ OneDrive se mírně liší v závislosti na typu účtu uvedeném výše.
Prozatím lze OneDrive API používat s oběma výše uvedenými typy účtů. V tomto programu ve formě "vytvořeno jako konzolová aplikace a spuštěno bez zásahu uživatele", Upozorňujeme, že jej lze používat pouze s účtem Microsoft v účtu "Pracovní nebo školní účet". Důvodem jsou rozdíly v metodách ověřování.
O metodě ověřování
Nejprve se musíte ověřit, abyste mohli programově přistupovat k OneDrive. Jak bylo uvedeno výše, k OneDrive má přístup jakýkoli program, ale ověření pro připojení k API závisí na tom, jak program běží. Webové aplikace a aplikace pro stolní počítače lze ověřovat interakcí uživatele. Vzhledem k tomu, že jej uživatel nemůže ovládat v konzolové aplikaci, která běží na pozadí, liší se od výše uvedeného i způsob autentizace.
Neznám podrobný důvod, protože jsem si to nedokázal najít, ale pokud mě to napadne, zdá se, že je to kvůli bezpečnosti a správě účtu. Mohu jen říci, že toto je již specifikace, takže pokud chcete programově přistupovat k OneDrive spojenému s "osobním účtem Microsoft", Myslím, že nezbývá než použít jiný program než ten, který běží na pozadí, nebo spustit konzolovou aplikaci s metodou autentizace, která zahrnuje uživatelské operace.
V tuto chvíli nebudeme knihovnu používat pro přístup k rozhraní API služby OneDrive
Přístup k OneDrive API je poměrně snadný pomocí knihovny s názvem "Microsoft Graph". V tomto případě použijeme metodu přímého přístupu k adrese URL API a jeho spuštění. Je to trochu těžkopádné, ale protože nepoužívá knihovnu, má tu výhodu, že non-.NET programy mohou přistupovat k OneDrive API stejným způsobem. Zabrání také nevýhodě, že se kód mění v důsledku různých verzí knihovny.
Jak používat Microsoft Graph si ukážeme v dalším tipu.
předpoklad
- Máte účet Microsoft pro pracovní nebo školní účet
- Můžete používat OneDrive spojený s výše uvedeným účtem Microsoft (např. OneDrive Business)
- Nainstalované Visual Studio 2022
Nastavení aplikace pro přístup k účtu Microsoft nebo OneDrivu v Azure
Přihlaste se k Azure na následující adrese URL:
Z vyhledávacího pole výše zadejte "registrace aplikací" a vyberte jej.
Klikněte na možnost Nová registrace.
Obsah "Jména" je libovolný. Zadejte prosím popisný název.
Vyberte jiný "Podporovaný typ účtu" než "Pouze osobní účty Microsoft". Je to proto, že, jak bylo uvedeno výše, toto ověřování lze použít pouze s účty, které patří do organizace. V tomto případě jsme vybrali "Účty v libovolném organizačním adresáři (libovolný klient Microsoft Entra ID – více klientů) a osobní účty Microsoft (Skype, Xbox atd.)".
"Redirect URI" nemusíte zadávat, protože tentokrát nebude použit.
Až budete hotovi, klikněte na tlačítko "Registrovat".
Budete přesměrováni na souhrnnou stránku registrace aplikace, kterou jste vytvořili, takže zkopírujte ID aplikace (klienta) a ID adresáře (tenanta). Tuto hodnotu použijete později.
Z kategorie správy v levém menu vyberte možnost "Certifikáty a tajné kódy" a ujistěte se, že je na prostřední kartě vybrána možnost "Tajné klíče klienta". Klikněte na Nový tajný klíč klienta.
Zadání popisu je volitelné. Pokud jej chcete nadále používat, uveďte prosím vysvětlení, které jasně vysvětluje účel použití.
"Datum vypršení platnosti" je doba, po kterou je tento tajný klíč klienta platný. Jelikož se tentokrát jedná o testovací účely, je to 90 dní, ale nastavte si ji prosím podle účelu použití.
Když vytvoříte tajný klíč klienta, přidá se do seznamu. V tomto použijeme hodnotu ve sloupci "Hodnota", takže ji zkopírujte. Všimněte si, že tuto hodnotu nelze později zkopírovat.
Dále vyberte "Oprávnění API" z kategorie Správa v levém menu a uprostřed klikněte na "Přidat oprávnění".
V žádosti o oprávnění rozhraní API klikněte na Microsoft Graph.
Klikněte na možnost Povolit aplikaci. Tato možnost není k dispozici pro osobní účty Microsoft.
Níže se zobrazí seznam oprávnění, takže pomocí vyhledávacího pole zkontrolujte následující položky.
- Files.ReadWrite.All
To stačí, pokud chcete používat pouze OneDrive, ale pokud chcete přistupovat k čemukoli jinému, přidejte oprávnění. Oprávnění potřebná pro přístup k OneDrive naleznete na oficiální stránce níže.
Jakmile provedete výběr, klikněte na tlačítko Přidat oprávnění.
Přidaný je přidán do seznamu a "Typ" je "Aplikace". Protože je však "Stav" "Neuděleno XXXX", klikněte na "Udělit administrátorský souhlas XXXX". (XXXX je název vaší organizace)
Klikněte na tlačítko Ano.
Změní se na stav udělení.
Mimochodem, můžete smazat "delegovaný User.Read", který tam je od začátku, protože jej tentokrát nepoužijeme. Pokud jste přidali "User.Read" jako aplikaci, použijte ji.
Ověření ID uživatele
Vzhledem k tomu, že budete mít přístup k OneDrive, který má cílový uživatel, zkontrolujte si ID uživatele předem.
Microsoft Entra ID
a otevřete jej.
Vyberte Uživatelé z nabídky vlevo.
Zobrazí se seznam uživatelů, proto klikněte na cílového uživatele.
Poznamenejte si "ID objektu", protože se bude jednat o ID uživatele.
Vytvoření konzolové aplikace
Spusťte Visual Studio a vytvořte projekt pro konzolovou aplikaci. Můžete jej vytvořit mimo Visual Studio, ale prozatím budu používat Visual Studio.
Umístění a název projektu jsou volitelné. V tomto případě je OneDriveApiDotNetClientCredentialsHttpClient
název projektu .
Tentokrát nebudeme kód dělit, ale Program.cs
budeme jej zapisovat střídavě shora, takže pokud můžete pohyb zkontrolovat, přepište jej prosím dělením kódu podle potřeby.
using System.Runtime.Serialization.Json;
using System.Text;
using System.Text.Json;
using System.Web;
using System.Xml;
Popište jmenný prostor, který chcete použít.
// 認証結果を格納するクラスです
public record TokenResponse(string token_type, int expires_in, int ext_expires_in, string access_token);
Tato třída se používá k příjmu informací o tokenu po ověření.
Program.cs
, napište jej prosím na konec kódu.
Tuto třídu můžete rozdělit do jiných souborů.
// 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());
}
Jedná se o magickou metodu, která formátuje text JSON přijatý z API pomocí odsazení. Protože se jedná o kód získaný z internetu, nebudu podrobně vysvětlovat jeho obsah.
// 各種 ID などの定義
var clientId = "XXXXXXXX"; // クライアント ID
var tenantId = "XXXXXXXX"; // テナント ID
var clientSecret = "XXXXXXXX"; // クライアント シークレット
var userId = "XXXXXXXX"; // ユーザー ID
var accessToken = ""; // アクセストークン
Pro každý z nich nastavte ID získané v Azure.
accessToken
je dočasný token pro přístup k OneDrive, takže je nastaven na 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";
Adresa URL rozhraní API pro autentizaci a adresa URL rozhraní API pro získání seznamu složek v kořenovém adresáři OneDvie. Toto je popis, jak zkontrolovat přístup k OneDrive API, takže nebudu popisovat obsah OneDrive API. Pokud máte přístup k OneDrive API, nahrávání a stahování je aplikace, takže si nemyslím, že je to tak obtížné.
// 使いまわすので最初に定義しておく
HttpClient httpClient = new();
Vygenerovali jste a pro vytvoření požadavku na HttpClient
zadanou adresu 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}");
Nejprve vytvoříte požadavek na rozhraní API pro ověřování s daty, takže si tato data připravte. Formát dat, která mají být odeslána, je řetězec parametru dotazu ve formátu "Název1=Hodnota1&Název2=Hodnota2...", takže je vytvořen ve slovníku a poté převeden na řetězec parametru dotazu.
Odeslat je třeba provést čtyři parametry:
Příklad hodnot názvů parametrů | |
---|---|
client_id | Nastavte ID klienta, které jste získali při registraci aplikace. |
rozsah | Autentizace pomocí tajného klíče klienta je opravena https://graph.microsoft.com/.default . |
client_secret | Nastavte hodnotu tajného klíče klienta, který jste získali při registraci aplikace. |
grant_type | Protože se jedná o autentizaci s tajným klíčem klienta, client_credentials bude |
Další informace naleznete na následujících oficiálních stránkách.
// 認証処理
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
a vytvořte požadavek na ověřovací rozhraní API. HttpClient
Je to běžné použití, takže si nemyslím, že je toho moc, čemu by se měla věnovat pozornost.
Data, která mají být odeslána, musí být kódována v UTF8 a typ obsahu by měl být application/x-www-form-urlencoded
. Metoda je POST
.
Pokud je odpověď zkontrolována IsSuccessStatusCode
a úspěšně zpracována, obdržíte výsledek jako řetězec JSON.
Soubor JSON, který obdržíte, má následující parametry:
{
"token_type": "Bearer",
"expires_in": 3599,
"ext_expires_in": 3599,
"access_token": "XXXXXXXXXXXXXXX"
}
V tomto, access_token
použijeme . Tuto hodnotu použijte s rozhraním API služby OneDrive.
Ostatní parametry můžete ignorovat, aleaccess_token
pokud chcete znát datum vypršení platnosti , použijte expires_in
.
Je obtížné jej použít jako řetězec JSON, proto JsonSerializer.Deserialize
jej deserializujeme pomocí a poté access_token
získáme .
// 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)}");
}
Nakonec pomocí přístupového tokenu vytvořte požadavek na rozhraní API služby OneDrive.
Metoda určuje GET
, ale záleží na typu API, proto se podívejte do dokumentace k OneDrive API.
Přidejte přístupový token do hlavičky. Nastavte klíč as Authorization
a hodnotu ve Bearer {アクセストークン}
formátu .
Jediné, co musíte udělat, je zadat požadavek a výsledek obdržet jako řetězec JSON. Teď, když se jen ujišťujeme, že máme přístup k rozhraní API OneDrivu, pouze formátujeme řetězec JSON a tiskneme ho do konzole. Ve skutečnosti deserializuje přijatý kód JSON a odpovídajícím způsobem jej zpracuje.
Tentokrát jsem obdržel seznam složek, ale myslím, že JSON je následující.
{
"@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": "フォルダ名"
}
},
:
]
}
Nemyslím si, že potřebujete všechny informace, takže pokud chcete získat například pouze název složky, value
můžete získat pouze parametry z name
pole v .
Shrnutí
Pokud to zatím funguje dobře, měli byste být schopni přistupovat k OneDrive pomocí dávkového programu. Nevím, jestli tipy shrnují způsoby nahrávání a stahování, ale v zásadě by to mělo fungovat, pokud použijete seznam složek v kořenovém adresáři popsaný výše. Typy API jsou shrnuty na oficiálních stránkách níže, takže najděte API, které chcete použít, a implementujte jej.
Dík
Tentokrát jsem měl nějaké otázky ohledně použití rozhraní API OneDrive, a tak jsem položil otázku.