Käytä OneDrive-ohjelmointirajapintaa ilman käyttäjän toimia, kuten eräohjelmaa (.NET C#-versio) (ei lisäkäyttökirjastoja)

Sivu päivitetty :
Sivun luontipäivämäärä :

Toimintaympäristö

Visuaalinen studio
  • Visuaalinen studio 2022
.VERKKO
  • .NET 8
Microsoftin todennuksen ohjelmointirajapinta
  • 2.0 OAuth 2
Microsoft OneDrive API
  • 1.0
Microsoft-tilien tyypit
  • Työpaikan tai oppilaitoksen tili

Edellytykset

Visuaalinen studio
  • Yksi versioista
.VERKKO
  • Yksi versioista
Microsoftin todennuksen ohjelmointirajapinta
  • 2.0 OAuth 2
Microsoft OneDrive API
  • 1.0
Microsoft-tilien tyypit
  • Työpaikan tai oppilaitoksen tili

Tietoja tämän tapahtuman tarkoituksesta

Nyt käytät OneDrive-ohjelmointirajapintoja tiedostojen ohjelmalliseen lataamiseen OneDriveen. Tässä artikkelissa kerrotaan, mitä voit tehdä OneDrive-ohjelmointirajapinnalla, joten emme puutu siihen, mitä voit tehdä OneDrive-ohjelmointirajapinnalla. Niin kauan kuin voit muodostaa yhteyden, voit kuitenkin lukea API-dokumentaation ja soveltaa sitä sen jälkeen.

Ohjelman suorittaminen

OneDriven käyttö ei riipu ohjelman muodosta, kuten verkkosovelluksesta, työpöytäsovelluksesta tai konsolisovelluksesta, ja sitä voidaan käyttää useilla eri ohjelmilla. Tässä tapauksessa luomme konsolisovelluksen ja suoritamme sen automaattisesti ilman käyttäjän toimia.

Mitkä ovat erityyppiset Microsoft-tilit?

Jos olet joskus luonut Microsoft-tilin, olet todennäköisesti nähnyt sen. Microsoft-tilejä on kahta päätyyppiä: henkilökohtaiset Microsoft-tilit ja työpaikan tai oppilaitoksen tilit. OneDrive on sidottu Microsoft-tiliin, mutta OneDriven tyyppi vaihtelee hieman yllä luetellun tilityypin mukaan.

Toistaiseksi OneDrive-ohjelmointirajapintaa voidaan käyttää molempien edellä mainittujen tilityyppien kanssa. Tässä ohjelmassa muodossa "luotu konsolisovellukseksi ja suoritettu ilman käyttäjän toimintaa", Huomaa, että sitä voi käyttää vain työpaikan tai oppilaitoksen tilillä olevan Microsoft-tilin kanssa. Tämä johtuu todennusmenetelmien eroista.

Tietoja todennusmenetelmästä

Ensin sinun on suoritettava todennus, jotta voit käyttää OneDrivea ohjelmallisesti. Kuten edellä mainittiin, mikä tahansa ohjelma voi käyttää OneDrivea, mutta todennus yhteyden muodostamiseksi sovellusliittymään riippuu ohjelman toiminnasta. Verkko- ja työpöytäsovellukset voidaan todentaa käyttäjän toimilla. Koska käyttäjä ei voi käyttää sitä taustalla toimivassa konsolisovelluksessa, todennusmenetelmä eroaa myös yllä olevasta.

En tiedä yksityiskohtaista syytä, koska en ole pystynyt etsimään sitä, mutta jos se tulee mieleen, se näyttää johtuvan turvallisuudesta ja tilinhallinnasta. Voin vain sanoa, että tämä on jo eritelmä, joten jos haluat käyttää ohjelmallisesti OneDrivea, joka liittyy "henkilökohtaiseen Microsoft-tiliin", Mielestäni ei ole muuta vaihtoehtoa kuin käyttää muuta ohjelmaa kuin taustalla toimivaa ohjelmaa tai suorittaa konsolisovellus todennusmenetelmällä, joka sisältää käyttäjän toiminnot.

Emme käytä kirjastoa OneDrive-ohjelmointirajapinnan käyttämiseen tällä hetkellä

OneDrive-ohjelmointirajapinnan käyttö on suhteellisen helppoa Microsoft Graph -nimisen kirjaston avulla. Tässä tapauksessa käytämme menetelmää päästä suoraan API: n URL-osoitteeseen ja suorittaa se. Se on hieman hankala, mutta koska se ei käytä kirjastoa, sillä on se etu, että non-.NET ohjelmat voivat käyttää OneDrive-sovellusliittymää samalla tavalla. Se estää myös sen haitan, että koodi muuttuu kirjaston eri versioiden vuoksi.

Näytämme sinulle, kuinka Microsoft Graphia käytetään toisessa vinkissä.

edellytys

  • Sinulla on Microsoft-tili työpaikan tai oppilaitoksen tiliä varten
  • Voit käyttää yllä mainittuun Microsoft-tiliin liitettyä OneDrivea (esimerkiksi OneDrive Businessia)
  • Visual Studio 2022 asennettu

Sovelluksen määrittäminen käyttämään Microsoft-tiliä tai OneDrivea Azuressa

Kirjaudu Azureen seuraavassa URL-osoitteessa:

Kirjoita yllä olevasta hakukentästä "app registrations" ja valitse se.

Valitse Uusi rekisteröinti.

"Nimen" sisältö on mielivaltainen. Kirjoita kuvaava nimi.

Valitse jokin muu Tuetun tilin tyyppi kuin Vain henkilökohtaiset Microsoft-tilit. Tämä johtuu siitä, että kuten edellä mainittiin, tätä todennusta voidaan käyttää vain organisaatioon kuuluvilla tileillä. Tässä tapauksessa olemme valinneet "Tilit missä tahansa organisaation hakemistossa (mikä tahansa Microsoft Entra ID -vuokraaja - usean vuokralainen) ja henkilökohtaiset Microsoft-tilit (Skype, Xbox jne.)".

Sinun ei tarvitse syöttää "Uudelleenohjauksen URI-osoitetta", koska sitä ei käytetä tällä kertaa.

Kun olet valmis, napsauta "Rekisteröidy" -painiketta.

Siirryt luomasi sovelluksen rekisteröinnin yhteenvetosivulle, joten kopioi sovelluksen (asiakasohjelman) tunnus ja hakemiston (vuokraajan) tunnus. Käytät tätä arvoa myöhemmin.

Valitse vasemmanpuoleisen valikon hallintaluokasta "Varmenteet ja salaisuudet" ja varmista, että keskimmäisessä välilehdessä on valittu "Asiakkaan salaisuudet". Valitse Uusi asiakasohjelman salasana.

Kuvauksen lisääminen on valinnaista. Jos haluat jatkaa sen käyttöä, liitä mukaan selitys, jossa selitetään selkeästi käyttötarkoitus.

"Vanhentumispäivä" on aika, jonka tämä asiakassalaisuus on voimassa. Koska se on tällä kertaa testaustarkoituksiin, se on 90 päivää, mutta aseta se käyttötarkoituksen mukaan.

Kun luot asiakassalaisuuden, se lisätään luetteloon. Tässä käytämme "Arvo" -sarakkeen arvoa, joten kopioi se. Huomaa, että tätä arvoa ei voi kopioida myöhemmin.

Valitse seuraavaksi vasemman valikon Hallinta-luokasta "API-käyttöoikeudet" ja napsauta keskellä olevaa Lisää käyttöoikeudet.

Valitse ohjelmointirajapinnan käyttöoikeuspyynnössä Microsoft Graph.

Valitse Salli sovellus. Tämä vaihtoehto ei ole käytettävissä henkilökohtaisilla Microsoft-tileillä.

Alla näkyy luettelo käyttöoikeuksista, joten tarkista seuraavat kohteet hakukentän avulla.

  • Tiedostot.ReadWrite.All

Se riittää, jos haluat käyttää vain OneDrivea, mutta jos haluat käyttää jotain muuta, lisää käyttöoikeudet. OneDriven käyttämiseen tarvittavat käyttöoikeudet löytyvät alla olevalta viralliselta sivulta.

Kun olet tehnyt valintasi, klikkaa Lisää käyttöoikeudet -painiketta.

Lisätty lisätään luetteloon, ja "Tyyppi" on "Sovellus". Koska "Tila" on kuitenkin "Ei myönnetty XXXX:lle", napsauta "Anna järjestelmänvalvojan suostumus XXXX:lle". (XXXX on organisaatiosi nimi)

Valitse Kyllä.

Se muuttuu myönnetyksi tilaksi.

Muuten, voit poistaa "delegoidun User.Read", joka on siellä alusta alkaen, koska emme käytä sitä tällä kertaa. Jos lisäsit "User.Read" sovellukseksi, käytä sitä.

Käyttäjätunnusten vahvistaminen

Koska käytät kohdekäyttäjän OneDrivea, tarkista käyttäjätunnus etukäteen.

Microsoft Entra ID ja avaa se.

Valitse vasemmalla olevasta valikosta Käyttäjät.

Näkyviin tulee luettelo käyttäjistä, joten napsauta kohdekäyttäjää.

Kirjoita muistiin "Object ID", koska se on käyttäjätunnus.

Konsolisovelluksen luominen

Käynnistä Visual Studio ja luo projekti konsolisovelluksellesi. Voit luoda sen Visual Studion ulkopuolella, mutta käytän Visual Studiota toistaiseksi.

Sijainti ja projektin nimi ovat valinnaisia. Tässä tapauksessa projektin nimi on OneDriveApiDotNetClientCredentialsHttpClient .

Tällä kertaa emme jaa koodia, vaan Program.cs kirjoitamme sen porrastettuna ylhäältä, joten jos voit tarkistaa liikkeen, kirjoita se uudelleen jakamalla koodi tarpeen mukaan.

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

Kuvaile nimiavaruus, jota haluat käyttää.

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

Tätä luokkaa käytetään tunnustietojen vastaanottamiseen todennuksen jälkeen. Program.cs , kirjoita se koodin loppuun. Voit jakaa tämän luokan muihin tiedostoihin.

// 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());
}

Tämä on maaginen menetelmä, joka muotoilee API: sta vastaanotetun JSON-tekstin sisennyksellä. Koska se on Internetistä poimittu koodi, en selitä sisältöä yksityiskohtaisesti.

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

Määritä kullekin Azuressa saatu tunnus. accessToken on väliaikainen tunnus OneDriven käyttämiseen, joten se on määritetty suorituksen ajaksi.

// 各種 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-osoite todennusta varten ja API-URL-osoite, jotta saat kansioluettelon OneDvien juuresta. Tämä on kuvaus siitä, miten OneDrive-sovellusliittymän käyttöoikeus tarkistetaan, joten en kuvaile OneDrive-sovellusliittymän sisältöä. Jos sinulla on pääsy OneDrive-ohjelmointirajapintaan, lataaminen ja lataaminen on sovellus, joten en usko, että se on niin vaikeaa.

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

Olet luonut pyynnön HttpClient tekemiseen määritettyyn URL-osoitteeseen.

// 「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}");

Ensin teet pyynnön todennuksen ohjelmointirajapintaan tiedoilla, joten valmistele tiedot. Lähetettävien tietojen muoto on kyselyparametrimerkkijono muodossa "Nimi1=Arvo1&Nimi2=Arvo2...", joten se luodaan sanakirjaan ja muunnetaan sitten kyselyparametrimerkkijonoksi.

Lähetettäviä parametreja on neljä:

Esimerkkejä
parametrien nimiarvoista
client_id Määritä sovelluksen rekisteröinnissä saamasi asiakastunnus.
laajuus Todennus asiakassalaisuuden kanssa on korjattu https://graph.microsoft.com/.default .
client_secret Määritä sovelluksen rekisteröinnissä saamasi asiakasohjelman salaisuuden arvo.
grant_type Koska se on todennus asiakassalaisuuden kanssa, client_credentials se on

Lisätietoja on seuraavalla virallisella verkkosivustolla.

// 認証処理
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 tehdäksesi pyynnön todennuksen ohjelmointirajapintaan. HttpClient Se on yleinen käyttö, joten en usko, että on paljon kiinnitettävä huomiota.

Lähetettävien tietojen on oltava UTF8-koodattuja ja Content-Type - application/x-www-form-urlencoded koodattu . Menetelmä on POST .

IsSuccessStatusCode Jos vastaus tarkistetaan ja käsitellään onnistuneesti, saat tuloksen JSON-merkkijonona. Saamallasi JSON-parametrilla on seuraavat parametrit:

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

Tässä access_token käytämme . Käytä tätä arvoa OneDrive-ohjelmointirajapinnan kanssa. Voit ohittaa muut parametrit, muttaaccess_token jos haluat tietää :n vanhentumispäivän, käytä expires_in .

Sitä on vaikea käyttää JSON-merkkijonona, joten JsonSerializer.Deserialize poistamme sen sarjoituksesta ja saamme sitten 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)}");
}

Tee lopuksi käyttöoikeustietueen avulla pyyntö OneDrive-ohjelmointirajapintaan. Menetelmä määrittää GET , mutta se riippuu ohjelmointirajapinnan tyypistä, joten tarkista OneDrive-ohjelmointirajapinnan dokumentaatio.

Lisää käyttöoikeustietue otsikkoon. Aseta avaimeksi ja Authorization arvo Bearer {アクセストークン} muodossa .

Sinun tarvitsee vain tehdä pyyntö ja saada tulos JSON-merkkijonona. Nyt kun vain varmistamme, että meillä on OneDrive-ohjelmointirajapinnan käyttöoikeus, alustamme vain JSON-merkkijonon ja tulostamme sen konsoliin. Itse asiassa se poistaa vastaanotetun JSON: n sarjoituksen ja käsittelee sen vastaavasti.

Olen saanut luettelon kansioista tällä kertaa, mutta mielestäni JSON on seuraava.

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

En usko, että tarvitset kaikkia tietoja, joten jos haluat saada esimerkiksi vain kansion nimen, saat value vain parametrit taulukosta name .

Yhteenveto

Jos se toimii toistaiseksi hyvin, sinun pitäisi pystyä käyttämään OneDrivea eräohjelmalla. En tiedä, onko vinkeissä yhteenveto lataamisen ja lataamisen menetelmistä, mutta periaatteessa sen pitäisi toimia, jos käytät kansioiden luetteloa edellä kuvatussa juuressa. API-tyypit on tiivistetty alla olevalla virallisella verkkosivustolla, joten etsi haluamasi sovellusliittymä ja toteuta se.

Kiitos

Minulla oli tällä kertaa kysyttävää OneDrive-ohjelmointirajapinnan käytöstä, joten esitin kysymyksen.