Använd OneDrive-API:et utan användarinteraktion, till exempel ett batchprogram (.NET C#-version) (inga ytterligare användningsbibliotek)

Sidan uppdaterad :
Datum för skapande av sida :

Operativ miljö

Visuell Studio
  • Visual Studio 2022
.NÄT
  • .NET 8
API för Microsoft-autentisering
  • 2.0 OAuth 2
Microsoft OneDrive API
  • 1.0
Typer av Microsoft-konton
  • Arbets- eller skolkonto

Förutsättningar

Visuell Studio
  • En av versionerna
.NÄT
  • En av versionerna
API för Microsoft-autentisering
  • 2.0 OAuth 2
Microsoft OneDrive API
  • 1.0
Typer av Microsoft-konton
  • Arbets- eller skolkonto

Om syftet med evenemanget

Nu ska du använda OneDrive-API:erna för att förbereda dig för att programmatiskt ladda upp och ladda ned filer till OneDrive. I den här artikeln går vi in på vad du kan göra med OneDrive API, så vi kommer inte att gå in på vad du kan göra med OneDrive API. Men så länge du kan ansluta kan du läsa API-dokumentationen och tillämpa den efter det.

Så här kör du programmet

Åtkomst till OneDrive är inte beroende av programmets form, till exempel ett webbprogram, ett skrivbordsprogram eller ett konsolprogram, och kan köras av en mängd olika program. I det här fallet kommer vi att skapa en konsolapplikation och köra den automatiskt utan någon användaråtgärd.

Vilka är de olika typerna av Microsoft-konton?

Om du någonsin har skapat ett Microsoft-konto har du förmodligen sett det. Det finns två huvudtyper av Microsoft-konton: personliga Microsoft-konton och arbets- eller skolkonton. OneDrive är knutet till ett Microsoft-konto, men typen av OneDrive varierar något beroende på vilken kontotyp som anges ovan.

För närvarande kan OneDrive API användas med båda ovanstående typer av konton. I detta program i form av "skapad som en konsolapplikation och exekveras utan användaroperation", Observera att det endast kan användas med ett Microsoft-konto i kontot "Arbets- eller skolkonto". Detta beror på skillnader i autentiseringsmetoder.

Om autentiseringsmetoden

Först måste du autentisera för att få åtkomst till OneDrive programmatiskt. Som nämnts ovan kan alla program komma åt OneDrive, men autentiseringen för att ansluta till API:et beror på hur programmet körs. Webbprogram och skrivbordsprogram kan autentiseras genom användarinteraktion. Eftersom användaren inte kan använda den i ett konsolprogram som körs i bakgrunden skiljer sig autentiseringsmetoden också från ovanstående.

Jag vet inte den detaljerade anledningen eftersom jag inte har kunnat slå upp det, men om jag kommer att tänka på det verkar det bero på säkerhet och kontohantering. Jag kan bara säga att detta redan är en specifikation, så om du vill komma åt OneDrive programmatiskt kopplat till ett "personligt Microsoft-konto", Jag tror att det inte finns något annat val än att använda ett annat program än ett program som körs i bakgrunden, eller att köra ett konsolprogram med en autentiseringsmetod som inkluderar användaroperationer.

Vi kommer för närvarande inte att använda biblioteket för att komma åt OneDrive-API:et

Åtkomst till OneDrive API är relativt enkel att hantera med hjälp av ett bibliotek som heter "Microsoft Graph". I det här fallet kommer vi att använda metoden för direkt åtkomst till URL:en för API:et och köra den. Det är lite krångligt, men eftersom det inte använder ett bibliotek har det fördelen att non-.NET program kan komma åt OneDrive API på samma sätt. Det förhindrar också nackdelen att koden ändras på grund av olika versioner av biblioteket.

Vi visar dig hur du använder Microsoft Graph i ett annat tips.

förutsättning

  • Du har ett Microsoft-konto för ett arbets- eller skolkonto
  • Du kan använda den OneDrive som är kopplad till Microsoft-kontot som anges ovan (t.ex. OneDrive Business)
  • Visual Studio 2022 installerat

Konfigurera ditt program för att få åtkomst till ditt Microsoft-konto eller OneDrive i Azure

Logga in på Azure på följande URL:

I sökfältet ovan skriver du "appregistreringar" och väljer det.

Klicka på Ny registrering.

Innehållet i "Namnet" är godtyckligt. Ange ett beskrivande namn.

Välj en annan kontotyp som stöds än "Endast personliga Microsoft-konton". Detta beror på att, som nämnts ovan, denna autentisering endast kan användas med konton som tillhör en organisation. I det här fallet har vi valt "Konton i valfri organisationskatalog (alla Microsoft Entra ID-klientorganisationer – flera klientorganisationer) och personliga Microsoft-konton (Skype, Xbox osv.)".

Du behöver inte ange "Omdirigerings-URI" eftersom den inte kommer att användas den här gången.

När du är klar klickar du på knappen "Registrera".

Du kommer till sammanfattningssidan för den appregistrering som du skapade, så kopiera program-ID:t (klient) och katalog-ID:t (klientorganisation). Du kommer att använda det här värdet senare.

Välj "Certifikat & hemligheter" i hanteringskategorin i den vänstra menyn och se till att "Klienthemligheter" är markerat på den mellersta fliken. Klicka på Ny klienthemlighet.

Det är valfritt att ange en beskrivning. Om du vill fortsätta att använda den, vänligen inkludera en förklaring som tydligt förklarar syftet med användningen.

"Förfallodatumet" är den tidsperiod som den här klienthemligheten är giltig. Eftersom det är för teständamål den här gången är det 90 dagar, men ställ in det enligt syftet med användningen.

När du skapar en klienthemlighet läggs den till i listan. I detta kommer vi att använda värdet i kolumnen "Värde", så kopiera det. Observera att det här värdet inte kan kopieras senare.

Välj sedan "API-behörigheter" från administrationskategorin i den vänstra menyn och klicka på "Lägg till behörigheter" i mitten.

I begäran om API-behörighet klickar du på Microsoft Graph.

Klicka på Tillåt program. Det här alternativet är inte tillgängligt för personliga Microsoft-konton.

En lista med behörigheter kommer att visas nedan, så använd sökfältet för att kontrollera följande objekt.

  • Files.ReadWrite.All

Det räcker om du bara vill använda OneDrive, men om du vill komma åt något annat, lägg till behörigheter. De behörigheter som krävs för att komma åt OneDrive finns på den officiella sidan nedan.

När du har gjort dina val klickar du på knappen Lägg till behörigheter.

Den tillagda läggs till i listan och "Typ" är "Program". Men eftersom "Status" är "Inte beviljad till XXXX" klickar du på "Ge administratörsmedgivande till XXXX". (XXXX är namnet på din organisation)

Klicka på Ja.

Den ändras till det beviljade tillståndet.

Förresten, du kan ta bort den "delegerade User.Read" som finns där från början eftersom vi inte kommer att använda den den här gången. Om du har lagt till "User.Read" som ett program använder du det.

Verifiera användar-ID:n

Eftersom du kommer att komma åt OneDrive som målanvändaren har, kontrollera användar-ID:t i förväg.

Microsoft Entra ID och öppna den.

Välj Användare på menyn till vänster.

En lista över användare kommer att visas, så klicka på målanvändaren.

Anteckna "Objekt-ID" eftersom det kommer att vara användar-ID:t.

Skapa ett konsolprogram

Starta Visual Studio och skapa ett projekt för konsolprogrammet. Du kan skapa den utanför Visual Studio, men jag använder Visual Studio för tillfället.

Platsen och projektnamnet är valfria. I det här fallet är OneDriveApiDotNetClientCredentialsHttpClient projektnamnet .

Den här gången kommer vi inte att dela upp koden, utan Program.cs kommer att skriva den förskjuten från toppen, så om du kan kontrollera rörelsen, skriv om den genom att dela upp koden efter behov.

using System.Runtime.Serialization.Json;
using System.Text;
using System.Text.Json;
using System.Web;
using System.Xml;

Beskriv det namnområde som du vill använda.

// 認証結果を格納するクラスです
public record TokenResponse(string token_type, int expires_in, int ext_expires_in, string access_token);

Den här klassen används för att ta emot tokeninformation efter autentisering. Program.cs , skriv det i slutet av koden. Du kan dela upp den här klassen i andra 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());
}

Detta är en magisk metod som formaterar JSON-text som tas emot från API:et med indrag. Eftersom det är en kod som plockats upp från Internet kommer jag inte att förklara innehållet i detalj.

// 各種 ID などの定義
var clientId = "XXXXXXXX";      // クライアント ID
var tenantId = "XXXXXXXX";      // テナント ID
var clientSecret = "XXXXXXXX";  // クライアント シークレット
var userId = "XXXXXXXX";        // ユーザー ID
var accessToken = "";           // アクセストークン

Ange det ID som hämtas i Azure för var och en. accessToken är en tillfällig token för åtkomst till OneDrive, så den ställs in vid körning.

// 各種 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 för autentisering och API-URL:en för att hämta listan över mappar i roten av OneDvie. Det här är en beskrivning av hur du kontrollerar åtkomsten till OneDrive API, så jag kommer inte att beskriva innehållet i OneDrive API. Om du har tillgång till OneDrive API är uppladdning och nedladdning en applikation, så jag tror inte att det är så svårt.

// 使いまわすので最初に定義しておく
HttpClient httpClient = new();

Du har genererat en för att göra en begäran till HttpClient den angivna URL:en.

// 「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 gör du en begäran till autentiserings-API:et med data, så förbered dessa data. Formatet på de data som ska skickas är en frågeparametersträng i formatet "Name1=Value1&Name2=Value2...", så den skapas i en ordlista och konverteras sedan till en frågeparametersträng.

Det finns fyra parametrar som ska skickas:

Exempel på
parameternamnvärden
client_id Ange det klient-ID som du fick i appregistreringen.
omfattning Autentisering med en klienthemlighet är åtgärdad https://graph.microsoft.com/.default .
client_secret Ange värdet för klienthemligheten som du fick i appregistreringen.
grant_type Eftersom det är autentisering med en klienthemlighet client_credentials kommer det att vara

För mer information, se följande officiella webbplats.

// 認証処理
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 för att göra en begäran till autentiserings-API:et. HttpClient Det är en vanlig användning, så jag tror inte att det finns mycket att vara uppmärksam på.

De data som ska skickas måste vara UTF8-kodade och Content-Type ska vara application/x-www-form-urlencoded . Metoden är POST .

IsSuccessStatusCode Om svaret kontrolleras och bearbetas får du resultatet som en JSON-sträng. Den JSON som du får har följande parametrar:

{
  "token_type": "Bearer",
  "expires_in": 3599,
  "ext_expires_in": 3599,
  "access_token": "XXXXXXXXXXXXXXX"
}

I detta access_token kommer vi att använda . Använd det här värdet med OneDrive-API:et. Du kan ignorera de andra parametrarna, menaccess_token om du vill veta utgångsdatumet för använder du expires_in .

Den är svår att använda som en JSON-sträng, så JsonSerializer.Deserialize vi deserialiserar den med och får sedan 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)}");
}

Använd slutligen åtkomsttoken för att göra en begäran till OneDrive-API:et. Metoden anger GET , men det beror på typen av API, så kontrollera OneDrive API-dokumentationen.

Lägg till åtkomsttoken i rubriken. Ställ in nyckeln som Authorization och värdet i Bearer {アクセストークン} formatet .

Allt du behöver göra är att göra en begäran och få resultatet som en JSON-sträng. Nu när vi bara ser till att vi har åtkomst till OneDrive-API:et formaterar vi bara JSON-strängen och skriver ut den till konsolen. I själva verket deserialiserar den mottagna JSON-filen och bearbetar den därefter.

Jag har fått en lista med mappar den här gången, men jag tror att JSON är som följer.

{
  "@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": "フォルダ名"
      }
    },
    :
  ]
}

Jag tror inte att du behöver all information, så om du till exempel bara vill hämta mappnamnet kan du value bara hämta parametrarna från name arrayen i .

Sammanfattning

Om det fungerar bra hittills bör du kunna komma åt OneDrive med ett batchprogram. Jag vet inte om tipsen sammanfattar metoderna för att ladda upp och ladda ner, men i princip borde det fungera om du använder listan över mappar i roten som beskrivs ovan. Typerna av API:er sammanfattas på den officiella webbplatsen nedan, så hitta det API du vill använda och implementera det.

Tack

Jag hade några frågor om hur jag använder OneDrive API den här gången, så jag ställde en fråga.